Commit 476f35348eb8d2a827765992899fea78b7dcc46f
Committed by
Linus Torvalds
1 parent
aee16b3cee
Exists in
master
and in
20 other branches
Safer nr_node_ids and nr_node_ids determination and initial values
The nr_cpu_ids value is currently only calculated in smp_init. However, it may be needed before (SLUB needs it on kmem_cache_init!) and other kernel components may also want to allocate dynamically sized per cpu array before smp_init. So move the determination of possible cpus into sched_init() where we already loop over all possible cpus early in boot. Also initialize both nr_node_ids and nr_cpu_ids with the highest value they could take. If we have accidental users before these values are determined then the current valud of 0 may cause too small per cpu and per node arrays to be allocated. If it is set to the maximum possible then we only waste some memory for early boot users. Signed-off-by: Christoph Lameter <clameter@sgi.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Showing 4 changed files with 9 additions and 9 deletions Side-by-side Diff
init/main.c
... | ... | @@ -384,11 +384,6 @@ |
384 | 384 | static void __init smp_init(void) |
385 | 385 | { |
386 | 386 | unsigned int cpu; |
387 | - unsigned highest = 0; | |
388 | - | |
389 | - for_each_cpu_mask(cpu, cpu_possible_map) | |
390 | - highest = cpu; | |
391 | - nr_cpu_ids = highest + 1; | |
392 | 387 | |
393 | 388 | /* FIXME: This should be done in userspace --RR */ |
394 | 389 | for_each_present_cpu(cpu) { |
kernel/sched.c
... | ... | @@ -5244,6 +5244,11 @@ |
5244 | 5244 | #endif |
5245 | 5245 | |
5246 | 5246 | #ifdef CONFIG_SMP |
5247 | + | |
5248 | +/* Number of possible processor ids */ | |
5249 | +int nr_cpu_ids __read_mostly = NR_CPUS; | |
5250 | +EXPORT_SYMBOL(nr_cpu_ids); | |
5251 | + | |
5247 | 5252 | #undef SCHED_DOMAIN_DEBUG |
5248 | 5253 | #ifdef SCHED_DOMAIN_DEBUG |
5249 | 5254 | static void sched_domain_debug(struct sched_domain *sd, int cpu) |
... | ... | @@ -6726,6 +6731,7 @@ |
6726 | 6731 | void __init sched_init(void) |
6727 | 6732 | { |
6728 | 6733 | int i, j, k; |
6734 | + int highest_cpu = 0; | |
6729 | 6735 | |
6730 | 6736 | for_each_possible_cpu(i) { |
6731 | 6737 | struct prio_array *array; |
6732 | 6738 | |
... | ... | @@ -6760,11 +6766,13 @@ |
6760 | 6766 | // delimiter for bitsearch |
6761 | 6767 | __set_bit(MAX_PRIO, array->bitmap); |
6762 | 6768 | } |
6769 | + highest_cpu = i; | |
6763 | 6770 | } |
6764 | 6771 | |
6765 | 6772 | set_load_weight(&init_task); |
6766 | 6773 | |
6767 | 6774 | #ifdef CONFIG_SMP |
6775 | + nr_cpu_ids = highest_cpu + 1; | |
6768 | 6776 | open_softirq(SCHED_SOFTIRQ, run_rebalance_domains, NULL); |
6769 | 6777 | #endif |
6770 | 6778 |
lib/cpumask.c