Index: linux-2.6.20-rc5/include/linux/cpumask.h =================================================================== --- linux-2.6.20-rc5.orig/include/linux/cpumask.h 2007-01-12 12:54:26.000000000 -0600 +++ linux-2.6.20-rc5/include/linux/cpumask.h 2007-01-29 11:56:27.030087615 -0600 @@ -398,11 +398,11 @@ extern cpumask_t cpu_present_map; #endif #ifdef CONFIG_SMP -int highest_possible_processor_id(void); +int nr_cpu_ids; #define any_online_cpu(mask) __any_online_cpu(&(mask)) int __any_online_cpu(const cpumask_t *mask); #else -#define highest_possible_processor_id() 0 +#define nr_cpu_ids 0 #define any_online_cpu(mask) 0 #endif Index: linux-2.6.20-rc5/lib/cpumask.c =================================================================== --- linux-2.6.20-rc5.orig/lib/cpumask.c 2007-01-12 12:54:26.000000000 -0600 +++ linux-2.6.20-rc5/lib/cpumask.c 2007-01-29 12:11:31.225152213 -0600 @@ -15,22 +15,8 @@ int __next_cpu(int n, const cpumask_t *s } EXPORT_SYMBOL(__next_cpu); -/* - * Find the highest possible smp_processor_id() - * - * Note: if we're prepared to assume that cpu_possible_map never changes - * (reasonable) then this function should cache its return value. - */ -int highest_possible_processor_id(void) -{ - unsigned int cpu; - unsigned highest = 0; - - for_each_cpu_mask(cpu, cpu_possible_map) - highest = cpu; - return highest; -} -EXPORT_SYMBOL(highest_possible_processor_id); +int nr_cpu_ids; +EXPORT_SYMBOL(nr_cpu_ids); int __any_online_cpu(const cpumask_t *mask) { Index: linux-2.6.20-rc5/net/bridge/netfilter/ebtables.c =================================================================== --- linux-2.6.20-rc5.orig/net/bridge/netfilter/ebtables.c 2007-01-12 12:54:26.000000000 -0600 +++ linux-2.6.20-rc5/net/bridge/netfilter/ebtables.c 2007-01-29 12:00:18.822746133 -0600 @@ -834,8 +834,7 @@ static int translate_table(char *name, s /* this will get free'd in do_replace()/ebt_register_table() if an error occurs */ newinfo->chainstack = - vmalloc((highest_possible_processor_id()+1) - * sizeof(*(newinfo->chainstack))); + vmalloc(nr_cpu_ids * sizeof(*(newinfo->chainstack))); if (!newinfo->chainstack) return -ENOMEM; for_each_possible_cpu(i) { @@ -948,8 +947,7 @@ static int do_replace(void __user *user, if (tmp.num_counters >= INT_MAX / sizeof(struct ebt_counter)) return -ENOMEM; - countersize = COUNTER_OFFSET(tmp.nentries) * - (highest_possible_processor_id()+1); + countersize = COUNTER_OFFSET(tmp.nentries) * nr_cpu_ids; newinfo = vmalloc(sizeof(*newinfo) + countersize); if (!newinfo) return -ENOMEM; @@ -1169,8 +1167,7 @@ int ebt_register_table(struct ebt_table return -EINVAL; } - countersize = COUNTER_OFFSET(repl->nentries) * - (highest_possible_processor_id()+1); + countersize = COUNTER_OFFSET(repl->nentries) * nr_cpu_ids; newinfo = vmalloc(sizeof(*newinfo) + countersize); ret = -ENOMEM; if (!newinfo) Index: linux-2.6.20-rc5/net/sunrpc/svc.c =================================================================== --- linux-2.6.20-rc5.orig/net/sunrpc/svc.c 2007-01-16 23:26:28.000000000 -0600 +++ linux-2.6.20-rc5/net/sunrpc/svc.c 2007-01-29 12:01:24.805060312 -0600 @@ -116,7 +116,7 @@ fail: static int svc_pool_map_init_percpu(struct svc_pool_map *m) { - unsigned int maxpools = highest_possible_processor_id()+1; + unsigned int maxpools = nr_cpu_ids; unsigned int pidx = 0; unsigned int cpu; int err; Index: linux-2.6.20-rc5/init/main.c =================================================================== --- linux-2.6.20-rc5.orig/init/main.c 2007-01-12 12:54:26.000000000 -0600 +++ linux-2.6.20-rc5/init/main.c 2007-01-29 12:12:50.027930772 -0600 @@ -382,14 +382,19 @@ static void __init setup_per_cpu_areas(v /* Called by boot processor to activate the rest. */ static void __init smp_init(void) { - unsigned int i; + unsigned int cpu; + unsigned highest = 0; + + for_each_cpu_mask(cpu, cpu_possible_map) + highest = cpu; + nr_cpu_ids = highest + 1; /* FIXME: This should be done in userspace --RR */ - for_each_present_cpu(i) { + for_each_present_cpu(cpu) { if (num_online_cpus() >= max_cpus) break; - if (!cpu_online(i)) - cpu_up(i); + if (!cpu_online(cpu)) + cpu_up(cpu); } /* Any cleanup work */