In prefill_possible_map(), Kernel need to get the number of possible CPUs to reset cpu_possible_map. The number is related to the options: -nosmp, maxcpus, possible_cpus, nr_cpus ... which need to be checked. Currentlly, the check code mixed these options together in confusion and hard to follow. Isolate them, and check them linearly. No functionary change, Prepare for cutting the number of possible CPUs Signed-off-by: Dou Liyang <douly.fnst@xxxxxxxxxxxxxx> --- Situations: setup_possible_cpus == -1 | setup_max_cpus == 0 | CONFIG_HOTPLUG_CPU == y | yes | yes | yes | no | no | no | Test cases: Cases | the number of possible cpus | (the same with or w/o this patch) case 1: no | no | no | --> min (setup_possible_cpus, nr_cpu_ids, setup_max_cpus) case 2: no | no | yes| --> min (setup_possible_cpus, nr_cpu_ids) case 3: no | yes | no | --> 1 case 4: no | yes | yes| --> 1 case 5: yes | no | no | --> min (num_processors, nr_cpu_ids, setup_max_cpus) case 6: yes | no | yes| --> min (num_processors + disabled_cpus, nr_cpu_ids) case 7: yes | yes | no | --> 1 case 8: yes | yes | yes| --> 1 arch/x86/kernel/smpboot.c | 31 ++++++++++++++++++------------- 1 file changed, 18 insertions(+), 13 deletions(-) diff --git a/arch/x86/kernel/smpboot.c b/arch/x86/kernel/smpboot.c index ff99e2b6fc54..2fdda8567bf9 100644 --- a/arch/x86/kernel/smpboot.c +++ b/arch/x86/kernel/smpboot.c @@ -1334,7 +1334,7 @@ early_param("possible_cpus", _setup_possible_cpus); * We do this because additional CPUs waste a lot of memory. * -AK */ -__init void prefill_possible_map(void) +void __init prefill_possible_map(void) { int i, possible; @@ -1356,18 +1356,22 @@ __init void prefill_possible_map(void) num_processors = 1; } - i = setup_max_cpus ?: 1; + /* The SMP kernel could be acted as an UP kernel via nosmp/maxcpus=0 */ + if (!setup_max_cpus) { + possible = 1; + total_cpus = num_processors + disabled_cpus; + goto set_cpu_possible_mask; + } + + /* Possible CPUs could be overwrited via possible_cpus= */ if (setup_possible_cpus == -1) { possible = num_processors; #ifdef CONFIG_HOTPLUG_CPU - if (setup_max_cpus) - possible += disabled_cpus; -#else - if (possible > i) - possible = i; + possible += disabled_cpus; #endif - } else + } else { possible = setup_possible_cpus; + } total_cpus = max_t(int, possible, num_processors + disabled_cpus); @@ -1378,15 +1382,16 @@ __init void prefill_possible_map(void) possible = nr_cpu_ids; } -#ifdef CONFIG_HOTPLUG_CPU - if (!setup_max_cpus) -#endif - if (possible > i) { +#ifndef CONFIG_HOTPLUG_CPU + /* Possible CPUs could be reduced via max_cpus= */ + if (possible > setup_max_cpus) { pr_warn("%d Processors exceeds max_cpus limit of %u\n", possible, setup_max_cpus); - possible = i; + possible = setup_max_cpus; } +#endif +set_cpu_possible_mask: nr_cpu_ids = possible; pr_info("Allowing %d CPUs, %d hotplug CPUs\n", -- 2.14.3 -- To unsubscribe from this list: send the line "unsubscribe linux-doc" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html