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).
19 * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
20 * Copyright (c) 2012, 2017, Intel Corporation.
23 * This file is part of Lustre, http://www.lustre.org/
24 * Lustre is a trademark of Sun Microsystems, Inc.
26 * Please see comments in libcfs/include/libcfs/libcfs_cpu.h for introduction
28 * Author: liang@whamcloud.com
31 #define DEBUG_SUBSYSTEM S_LNET
33 #include <libcfs/linux/linux-cpu.h>
34 #include <libcfs/libcfs.h>
36 /** Global CPU partition table */
37 struct cfs_cpt_table *cfs_cpt_table __read_mostly;
38 EXPORT_SYMBOL(cfs_cpt_table);
42 #define CFS_CPT_DISTANCE 1 /* Arbitrary positive value */
44 struct cfs_cpt_table *cfs_cpt_table_alloc(int ncpt)
46 struct cfs_cpt_table *cptab;
49 CERROR("Can't support cpu partition number %d\n", ncpt);
53 LIBCFS_ALLOC(cptab, sizeof(*cptab));
55 cpumask_set_cpu(0, cptab->ctb_cpumask);
56 node_set(0, cptab->ctb_nodemask);
61 EXPORT_SYMBOL(cfs_cpt_table_alloc);
63 void cfs_cpt_table_free(struct cfs_cpt_table *cptab)
65 LIBCFS_FREE(cptab, sizeof(*cptab));
67 EXPORT_SYMBOL(cfs_cpt_table_free);
69 int cfs_cpt_table_print(struct cfs_cpt_table *cptab, char *buf, int len)
73 rc = snprintf(buf, len, "%d\t: %d\n", 0, 0);
80 EXPORT_SYMBOL(cfs_cpt_table_print);
82 int cfs_cpt_distance_print(struct cfs_cpt_table *cptab, char *buf, int len)
86 rc = snprintf(buf, len, "0\t: 0:%d\n", CFS_CPT_DISTANCE);
93 EXPORT_SYMBOL(cfs_cpt_distance_print);
95 int cfs_cpt_number(struct cfs_cpt_table *cptab)
99 EXPORT_SYMBOL(cfs_cpt_number);
101 int cfs_cpt_weight(struct cfs_cpt_table *cptab, int cpt)
105 EXPORT_SYMBOL(cfs_cpt_weight);
107 int cfs_cpt_online(struct cfs_cpt_table *cptab, int cpt)
111 EXPORT_SYMBOL(cfs_cpt_online);
113 cpumask_t *cfs_cpt_cpumask(struct cfs_cpt_table *cptab, int cpt)
115 return &cptab->ctb_cpumask;
117 EXPORT_SYMBOL(cfs_cpt_cpumask);
119 nodemask_t *cfs_cpt_nodemask(struct cfs_cpt_table *cptab, int cpt)
121 return &cptab->ctb_nodemask;
123 EXPORT_SYMBOL(cfs_cpt_nodemask);
125 unsigned int cfs_cpt_distance(struct cfs_cpt_table *cptab, int cpt1, int cpt2)
127 return CFS_CPT_DISTANCE;
129 EXPORT_SYMBOL(cfs_cpt_distance);
131 int cfs_cpt_set_cpu(struct cfs_cpt_table *cptab, int cpt, int cpu)
135 EXPORT_SYMBOL(cfs_cpt_set_cpu);
137 void cfs_cpt_unset_cpu(struct cfs_cpt_table *cptab, int cpt, int cpu)
140 EXPORT_SYMBOL(cfs_cpt_unset_cpu);
142 int cfs_cpt_set_cpumask(struct cfs_cpt_table *cptab, int cpt,
143 const cpumask_t *mask)
147 EXPORT_SYMBOL(cfs_cpt_set_cpumask);
149 void cfs_cpt_unset_cpumask(struct cfs_cpt_table *cptab, int cpt,
150 const cpumask_t *mask)
153 EXPORT_SYMBOL(cfs_cpt_unset_cpumask);
155 int cfs_cpt_set_node(struct cfs_cpt_table *cptab, int cpt, int node)
159 EXPORT_SYMBOL(cfs_cpt_set_node);
161 void cfs_cpt_unset_node(struct cfs_cpt_table *cptab, int cpt, int node)
164 EXPORT_SYMBOL(cfs_cpt_unset_node);
166 int cfs_cpt_set_nodemask(struct cfs_cpt_table *cptab, int cpt,
167 const nodemask_t *mask)
171 EXPORT_SYMBOL(cfs_cpt_set_nodemask);
173 void cfs_cpt_unset_nodemask(struct cfs_cpt_table *cptab, int cpt,
174 const nodemask_t *mask)
177 EXPORT_SYMBOL(cfs_cpt_unset_nodemask);
179 int cfs_cpt_spread_node(struct cfs_cpt_table *cptab, int cpt)
183 EXPORT_SYMBOL(cfs_cpt_spread_node);
185 int cfs_cpt_current(struct cfs_cpt_table *cptab, int remap)
189 EXPORT_SYMBOL(cfs_cpt_current);
191 int cfs_cpt_of_cpu(struct cfs_cpt_table *cptab, int cpu)
195 EXPORT_SYMBOL(cfs_cpt_of_cpu);
197 int cfs_cpt_of_node(struct cfs_cpt_table *cptab, int node)
201 EXPORT_SYMBOL(cfs_cpt_of_node);
203 int cfs_cpt_bind(struct cfs_cpt_table *cptab, int cpt)
207 EXPORT_SYMBOL(cfs_cpt_bind);
209 void cfs_cpu_fini(void)
212 cfs_cpt_table_free(cfs_cpt_table);
213 cfs_cpt_table = NULL;
217 int cfs_cpu_init(void)
219 cfs_cpt_table = cfs_cpt_table_alloc(1);
221 return cfs_cpt_table ? 0 : -1;
224 #endif /* !CONFIG_SMP */