diff options
-rw-r--r-- | include/linux/cpumask.h | 4 | ||||
-rw-r--r-- | init/main.c | 13 | ||||
-rw-r--r-- | lib/cpumask.c | 18 | ||||
-rw-r--r-- | net/bridge/netfilter/ebtables.c | 9 | ||||
-rw-r--r-- | net/sunrpc/svc.c | 2 |
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 |
401 | int highest_possible_processor_id(void); | 401 | extern int nr_cpu_ids; |
402 | #define any_online_cpu(mask) __any_online_cpu(&(mask)) | 402 | #define any_online_cpu(mask) __any_online_cpu(&(mask)) |
403 | int __any_online_cpu(const cpumask_t *mask); | 403 | int __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. */ |
388 | static void __init smp_init(void) | 388 | static 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 | } |
16 | EXPORT_SYMBOL(__next_cpu); | 16 | EXPORT_SYMBOL(__next_cpu); |
17 | 17 | ||
18 | /* | 18 | int nr_cpu_ids; |
19 | * Find the highest possible smp_processor_id() | 19 | EXPORT_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 | */ | ||
24 | int 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 | } | ||
33 | EXPORT_SYMBOL(highest_possible_processor_id); | ||
34 | 20 | ||
35 | int __any_online_cpu(const cpumask_t *mask) | 21 | int __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: | |||
115 | static int | 115 | static int |
116 | svc_pool_map_init_percpu(struct svc_pool_map *m) | 116 | svc_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; |