Commit 476f35348eb8d2a827765992899fea78b7dcc46f

Authored by Christoph Lameter
Committed by Linus Torvalds
1 parent aee16b3cee

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

... ... @@ -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) {
... ... @@ -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  
... ... @@ -15,9 +15,6 @@
15 15 }
16 16 EXPORT_SYMBOL(__next_cpu);
17 17  
18   -int nr_cpu_ids;
19   -EXPORT_SYMBOL(nr_cpu_ids);
20   -
21 18 int __any_online_cpu(const cpumask_t *mask)
22 19 {
23 20 int cpu;
... ... @@ -665,7 +665,7 @@
665 665 }
666 666  
667 667 #if MAX_NUMNODES > 1
668   -int nr_node_ids __read_mostly;
  668 +int nr_node_ids __read_mostly = MAX_NUMNODES;
669 669 EXPORT_SYMBOL(nr_node_ids);
670 670  
671 671 /*