aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--include/linux/cpumask.h4
-rw-r--r--init/main.c13
-rw-r--r--lib/cpumask.c18
-rw-r--r--net/bridge/netfilter/ebtables.c9
-rw-r--r--net/sunrpc/svc.c2
5 files changed, 17 insertions, 29 deletions
diff --git a/include/linux/cpumask.h b/include/linux/cpumask.h
index d0e8c8b0e34d..23f55140ccd5 100644
--- a/include/linux/cpumask.h
+++ b/include/linux/cpumask.h
@@ -398,11 +398,11 @@ extern cpumask_t cpu_present_map;
398#endif 398#endif
399 399
400#ifdef CONFIG_SMP 400#ifdef CONFIG_SMP
401int highest_possible_processor_id(void); 401extern int nr_cpu_ids;
402#define any_online_cpu(mask) __any_online_cpu(&(mask)) 402#define any_online_cpu(mask) __any_online_cpu(&(mask))
403int __any_online_cpu(const cpumask_t *mask); 403int __any_online_cpu(const cpumask_t *mask);
404#else 404#else
405#define highest_possible_processor_id() 0 405#define nr_cpu_ids 1
406#define any_online_cpu(mask) 0 406#define any_online_cpu(mask) 0
407#endif 407#endif
408 408
diff --git a/init/main.c b/init/main.c
index 1c5f6dce1bd2..a92989e7836a 100644
--- a/init/main.c
+++ b/init/main.c
@@ -387,14 +387,19 @@ static void __init setup_per_cpu_areas(void)
387/* Called by boot processor to activate the rest. */ 387/* Called by boot processor to activate the rest. */
388static void __init smp_init(void) 388static void __init smp_init(void)
389{ 389{
390 unsigned int i; 390 unsigned int cpu;
391 unsigned highest = 0;
392
393 for_each_cpu_mask(cpu, cpu_possible_map)
394 highest = cpu;
395 nr_cpu_ids = highest + 1;
391 396
392 /* FIXME: This should be done in userspace --RR */ 397 /* FIXME: This should be done in userspace --RR */
393 for_each_present_cpu(i) { 398 for_each_present_cpu(cpu) {
394 if (num_online_cpus() >= max_cpus) 399 if (num_online_cpus() >= max_cpus)
395 break; 400 break;
396 if (!cpu_online(i)) 401 if (!cpu_online(cpu))
397 cpu_up(i); 402 cpu_up(cpu);
398 } 403 }
399 404
400 /* Any cleanup work */ 405 /* Any cleanup work */
diff --git a/lib/cpumask.c b/lib/cpumask.c
index 3a67dc5ada7d..1ea2c184315d 100644
--- a/lib/cpumask.c
+++ b/lib/cpumask.c
@@ -15,22 +15,8 @@ int __next_cpu(int n, const cpumask_t *srcp)
15} 15}
16EXPORT_SYMBOL(__next_cpu); 16EXPORT_SYMBOL(__next_cpu);
17 17
18/* 18int nr_cpu_ids;
19 * Find the highest possible smp_processor_id() 19EXPORT_SYMBOL(nr_cpu_ids);
20 *
21 * Note: if we're prepared to assume that cpu_possible_map never changes
22 * (reasonable) then this function should cache its return value.
23 */
24int highest_possible_processor_id(void)
25{
26 unsigned int cpu;
27 unsigned highest = 0;
28
29 for_each_cpu_mask(cpu, cpu_possible_map)
30 highest = cpu;
31 return highest;
32}
33EXPORT_SYMBOL(highest_possible_processor_id);
34 20
35int __any_online_cpu(const cpumask_t *mask) 21int __any_online_cpu(const cpumask_t *mask)
36{ 22{
diff --git a/net/bridge/netfilter/ebtables.c b/net/bridge/netfilter/ebtables.c
index 34c49799f9b3..ac9984f98e59 100644
--- a/net/bridge/netfilter/ebtables.c
+++ b/net/bridge/netfilter/ebtables.c
@@ -833,8 +833,7 @@ static int translate_table(char *name, struct ebt_table_info *newinfo)
833 /* this will get free'd in do_replace()/ebt_register_table() 833 /* this will get free'd in do_replace()/ebt_register_table()
834 if an error occurs */ 834 if an error occurs */
835 newinfo->chainstack = 835 newinfo->chainstack =
836 vmalloc((highest_possible_processor_id()+1) 836 vmalloc(nr_cpu_ids * sizeof(*(newinfo->chainstack)));
837 * sizeof(*(newinfo->chainstack)));
838 if (!newinfo->chainstack) 837 if (!newinfo->chainstack)
839 return -ENOMEM; 838 return -ENOMEM;
840 for_each_possible_cpu(i) { 839 for_each_possible_cpu(i) {
@@ -947,8 +946,7 @@ static int do_replace(void __user *user, unsigned int len)
947 if (tmp.num_counters >= INT_MAX / sizeof(struct ebt_counter)) 946 if (tmp.num_counters >= INT_MAX / sizeof(struct ebt_counter))
948 return -ENOMEM; 947 return -ENOMEM;
949 948
950 countersize = COUNTER_OFFSET(tmp.nentries) * 949 countersize = COUNTER_OFFSET(tmp.nentries) * nr_cpu_ids;
951 (highest_possible_processor_id()+1);
952 newinfo = vmalloc(sizeof(*newinfo) + countersize); 950 newinfo = vmalloc(sizeof(*newinfo) + countersize);
953 if (!newinfo) 951 if (!newinfo)
954 return -ENOMEM; 952 return -ENOMEM;
@@ -1168,8 +1166,7 @@ int ebt_register_table(struct ebt_table *table)
1168 return -EINVAL; 1166 return -EINVAL;
1169 } 1167 }
1170 1168
1171 countersize = COUNTER_OFFSET(repl->nentries) * 1169 countersize = COUNTER_OFFSET(repl->nentries) * nr_cpu_ids;
1172 (highest_possible_processor_id()+1);
1173 newinfo = vmalloc(sizeof(*newinfo) + countersize); 1170 newinfo = vmalloc(sizeof(*newinfo) + countersize);
1174 ret = -ENOMEM; 1171 ret = -ENOMEM;
1175 if (!newinfo) 1172 if (!newinfo)
diff --git a/net/sunrpc/svc.c b/net/sunrpc/svc.c
index 232a99715ef2..8353829bc5c6 100644
--- a/net/sunrpc/svc.c
+++ b/net/sunrpc/svc.c
@@ -115,7 +115,7 @@ fail:
115static int 115static int
116svc_pool_map_init_percpu(struct svc_pool_map *m) 116svc_pool_map_init_percpu(struct svc_pool_map *m)
117{ 117{
118 unsigned int maxpools = highest_possible_processor_id() + 1; 118 unsigned int maxpools = nr_cpu_ids;
119 unsigned int pidx = 0; 119 unsigned int pidx = 0;
120 unsigned int cpu; 120 unsigned int cpu;
121 int err; 121 int err;