[PATCH] s390: possible_cpus parameter
authorHeiko Carstens <heiko.carstens@de.ibm.com>
Fri, 17 Feb 2006 21:52:47 +0000 (13:52 -0800)
committerLinus Torvalds <torvalds@g5.osdl.org>
Fri, 17 Feb 2006 21:59:27 +0000 (13:59 -0800)
Introduce possible_cpus command line option.  Hard sets the number of bits set
in cpu_possible_map.  Unlike the additional_cpus parameter this one guarantees
that num_possible_cpus() will stay constant even if the system gets rebooted
and a different number of cpus are present at startup.

Signed-off-by: Heiko Carstens <heiko.carstens@de.ibm.com>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Documentation/cpu-hotplug.txt
arch/s390/kernel/smp.c

index 4d3355da0e268c5d1cdd93921301272b25e4a920..e71bc6cbbc5ec4935c16482c012b01ead3a57602 100644 (file)
@@ -58,6 +58,12 @@ mark such hot-pluggable cpus as disabled entries, one could use this
 parameter "additional_cpus=x" to represent those cpus in the cpu_possible_map.
 
 
+possible_cpus=n                [s390 only] use this to set hotpluggable cpus.
+                       This option sets possible_cpus bits in
+                       cpu_possible_map. Thus keeping the numbers of bits set
+                       constant even if the machine gets rebooted.
+                       This option overrides additional_cpus.
+
 CPU maps and such
 -----------------
 [More on cpumaps and primitive to manipulate, please check
index 53291e94ac7be03fc316aa70eaf32b3485d550c5..d0a2745aec7f5f3987adc6bc022aec7bbd536e3b 100644 (file)
@@ -673,15 +673,16 @@ __cpu_up(unsigned int cpu)
 }
 
 static unsigned int __initdata additional_cpus;
+static unsigned int __initdata possible_cpus;
 
 void __init smp_setup_cpu_possible_map(void)
 {
        unsigned int pcpus, cpu;
 
-       pcpus = smp_count_cpus() + additional_cpus;
+       pcpus = min(smp_count_cpus() + additional_cpus, (unsigned int) NR_CPUS);
 
-       if (pcpus > NR_CPUS)
-               pcpus = NR_CPUS;
+       if (possible_cpus)
+               pcpus = min(possible_cpus, (unsigned int) NR_CPUS);
 
        for (cpu = 0; cpu < pcpus; cpu++)
                cpu_set(cpu, cpu_possible_map);
@@ -698,6 +699,13 @@ static int __init setup_additional_cpus(char *s)
 }
 early_param("additional_cpus", setup_additional_cpus);
 
+static int __init setup_possible_cpus(char *s)
+{
+       possible_cpus = simple_strtoul(s, NULL, 0);
+       return 0;
+}
+early_param("possible_cpus", setup_possible_cpus);
+
 int
 __cpu_disable(void)
 {