4 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License version 2 only,
8 * as published by the Free Software Foundation.
10 * This program is distributed in the hope that it will be useful, but
11 * WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 * General Public License version 2 for more details (a copy is included
14 * in the LICENSE file that accompanied this code).
16 * You should have received a copy of the GNU General Public License
17 * version 2 along with this program; if not, write to the
18 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
19 * Boston, MA 021110-1307, USA
24 * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
25 * Copyright (c) 2012, 2017, Intel Corporation.
28 * This file is part of Lustre, http://www.lustre.org/
29 * Lustre is a trademark of Sun Microsystems, Inc.
31 * Please see comments in libcfs/include/libcfs/libcfs_cpu.h for introduction
33 * Author: liang@whamcloud.com
36 #define DEBUG_SUBSYSTEM S_LNET
38 #include <libcfs/linux/linux-cpu.h>
39 #include <libcfs/libcfs.h>
41 /** Global CPU partition table */
42 struct cfs_cpt_table *cfs_cpt_table __read_mostly = NULL;
43 EXPORT_SYMBOL(cfs_cpt_table);
45 #ifndef HAVE_LIBCFS_CPT
47 #define CFS_CPU_VERSION_MAGIC 0xbabecafe
49 #define CFS_CPT_DISTANCE 1 /* Arbitrary positive value */
51 struct cfs_cpt_table *cfs_cpt_table_alloc(int ncpt)
53 struct cfs_cpt_table *cptab;
56 CERROR("Can't support cpu partition number %d\n", ncpt);
60 LIBCFS_ALLOC(cptab, sizeof(*cptab));
62 cptab->ctb_version = CFS_CPU_VERSION_MAGIC;
63 cpu_set(0, cptab->ctb_cpumask);
64 node_set(0, cptab->ctb_nodemask);
65 cptab->ctb_nparts = ncpt;
70 EXPORT_SYMBOL(cfs_cpt_table_alloc);
72 void cfs_cpt_table_free(struct cfs_cpt_table *cptab)
74 LASSERT(cptab->ctb_version == CFS_CPU_VERSION_MAGIC);
76 LIBCFS_FREE(cptab, sizeof(*cptab));
78 EXPORT_SYMBOL(cfs_cpt_table_free);
80 int cfs_cpt_table_print(struct cfs_cpt_table *cptab, char *buf, int len)
84 rc = snprintf(buf, len, "%d\t: %d\n", 0, 0);
91 EXPORT_SYMBOL(cfs_cpt_table_print);
93 int cfs_cpt_distance_print(struct cfs_cpt_table *cptab, char *buf, int len)
97 rc = snprintf(buf, len, "%d\t: %d:%d\n", 0, CFS_CPT_DISTANCE);
104 EXPORT_SYMBOL(cfs_cpt_distance_print);
106 int cfs_cpt_number(struct cfs_cpt_table *cptab)
110 EXPORT_SYMBOL(cfs_cpt_number);
112 int cfs_cpt_weight(struct cfs_cpt_table *cptab, int cpt)
116 EXPORT_SYMBOL(cfs_cpt_weight);
118 int cfs_cpt_online(struct cfs_cpt_table *cptab, int cpt)
122 EXPORT_SYMBOL(cfs_cpt_online);
124 cpumask_t *cfs_cpt_cpumask(struct cfs_cpt_table *cptab, int cpt)
126 return &cptab->ctb_mask;
128 EXPORT_SYMBOL(cfs_cpt_cpumask);
130 nodemask_t *cfs_cpt_nodemask(struct cfs_cpt_table *cptab, int cpt)
132 return &cptab->ctb_nodemask;
134 EXPORT_SYMBOL(cfs_cpt_nodemask);
136 unsigned cfs_cpt_distance(struct cfs_cpt_table *cptab, int cpt1, int cpt2)
138 return CFS_CPT_DISTANCE;
140 EXPORT_SYMBOL(cfs_cpt_distance);
142 int cfs_cpt_set_cpu(struct cfs_cpt_table *cptab, int cpt, int cpu)
146 EXPORT_SYMBOL(cfs_cpt_set_cpu);
148 void cfs_cpt_unset_cpu(struct cfs_cpt_table *cptab, int cpt, int cpu)
151 EXPORT_SYMBOL(cfs_cpt_unset_cpu);
153 int cfs_cpt_set_cpumask(struct cfs_cpt_table *cptab, int cpt,
154 const cpumask_t *mask)
158 EXPORT_SYMBOL(cfs_cpt_set_cpumask);
160 void cfs_cpt_unset_cpumask(struct cfs_cpt_table *cptab, int cpt,
161 const cpumask_t *mask)
164 EXPORT_SYMBOL(cfs_cpt_unset_cpumask);
166 int cfs_cpt_set_node(struct cfs_cpt_table *cptab, int cpt, int node)
170 EXPORT_SYMBOL(cfs_cpt_set_node);
172 void cfs_cpt_unset_node(struct cfs_cpt_table *cptab, int cpt, int node)
175 EXPORT_SYMBOL(cfs_cpt_unset_node);
177 int cfs_cpt_set_nodemask(struct cfs_cpt_table *cptab, int cpt,
178 const nodemask_t *mask)
182 EXPORT_SYMBOL(cfs_cpt_set_nodemask);
184 void cfs_cpt_unset_nodemask(struct cfs_cpt_table *cptab, int cpt,
185 const nodemask_t *mask)
188 EXPORT_SYMBOL(cfs_cpt_unset_nodemask);
190 int cfs_cpt_spread_node(struct cfs_cpt_table *cptab, int cpt)
194 EXPORT_SYMBOL(cfs_cpt_spread_node);
196 int cfs_cpt_current(struct cfs_cpt_table *cptab, int remap)
200 EXPORT_SYMBOL(cfs_cpt_current);
202 int cfs_cpt_of_cpu(struct cfs_cpt_table *cptab, int cpu)
206 EXPORT_SYMBOL(cfs_cpt_of_cpu);
208 int cfs_cpt_of_node(struct cfs_cpt_table *cptab, int node)
212 EXPORT_SYMBOL(cfs_cpt_of_node);
214 int cfs_cpt_bind(struct cfs_cpt_table *cptab, int cpt)
218 EXPORT_SYMBOL(cfs_cpt_bind);
220 void cfs_cpu_fini(void)
222 if (cfs_cpt_table != NULL) {
223 cfs_cpt_table_free(cfs_cpt_table);
224 cfs_cpt_table = NULL;
228 int cfs_cpu_init(void)
230 cfs_cpt_table = cfs_cpt_table_alloc(1);
232 return cfs_cpt_table != NULL ? 0 : -1;
235 #endif /* HAVE_LIBCFS_CPT */