Messages in this thread Patch in this message | | | Date | Wed, 13 Aug 2008 11:33:12 -0700 | From | "Yinghai Lu" <> | Subject | Re: 2.6.27rc1 cannot boot more than 8CPUs |
| |
On Wed, Aug 13, 2008 at 10:46 AM, Yinghai Lu <yhlu.kernel@gmail.com> wrote: > On Wed, Aug 13, 2008 at 10:39 AM, Ingo Molnar <mingo@elte.hu> wrote: >> >> * Jeff Chua <jeff.chua.linux@gmail.com> wrote: >> >>> On Thu, Aug 14, 2008 at 1:10 AM, Jeff Chua <jeff.chua.linux@gmail.com> wrote: >>> > On Wed, Aug 13, 2008 at 10:16 PM, Ingo Molnar <mingo@elte.hu> wrote: >>> > >>> >> btw., could you please check that v2.6.27-rc3 (or later) kernels boot >>> >> fine (with about 8 cpus) even if you have genericarch/bigsmp disabled, >>> >> and do not silently hang as it happened on your box before? >>> > >>> > With 16 CPUs, it still hangs, but now the console is showing the >>> > errors as intended. >>> > ... but it is supposed to hang? >>> >>> I tried with just CONFIG_NR_CPUS=8 and this time it booted, but stange >>> thing is I only see 2 CPUs! To be more precise, it's without both >>> CONFIG_X86_GENERICARCH and CONFIG_X86_BIGSMP. >>> >>> And when I tried to enable the CPUs, it complained about: >>> >>> # cat cpu6/online >>> 0 >>> # echo 1 > cpu6/online >>> More than 8 CPUs detected - skipping them. >>> Use CONFIG_X86_GENERICARCH and CONFIG_X86_BIGSMP. >>> -bash: echo: write error: Input/output error >>> >>> Prior to the patch, the system booted with all 8 CPUs. > > that is new regression...
jeff,
please check the attached patch. it should fix the new regression and will not hang.
YH [PATCH] x86: check bigsmp in smp_sanity_check instead of cpu_up
clear bits for cpu nr > 8
Signed-off-by: Yinghai Lu <yhlu.kernel@gmail.com>
--- arch/x86/kernel/smpboot.c | 38 ++++++++++++++++++++++++++++---------- 1 file changed, 28 insertions(+), 10 deletions(-)
Index: linux-2.6/arch/x86/kernel/smpboot.c =================================================================== --- linux-2.6.orig/arch/x86/kernel/smpboot.c +++ linux-2.6/arch/x86/kernel/smpboot.c @@ -987,17 +987,7 @@ int __cpuinit native_cpu_up(unsigned int flush_tlb_all(); low_mappings = 1; -#ifdef CONFIG_X86_PC - if (def_to_bigsmp && apicid > 8) { - printk(KERN_WARNING - "More than 8 CPUs detected - skipping them.\n" - "Use CONFIG_X86_GENERICARCH and CONFIG_X86_BIGSMP.\n"); - err = -1; - } else - err = do_boot_cpu(apicid, cpu); -#else err = do_boot_cpu(apicid, cpu); -#endif zap_low_mappings(); low_mappings = 0; @@ -1051,6 +1041,34 @@ static __init void disable_smp(void) static int __init smp_sanity_check(unsigned max_cpus) { preempt_disable(); + +#if defined(CONFIG_X86_PC) && defined(CONFIG_X86_32) + if (def_to_bigsmp && nr_cpu_ids > 8) { + unsigned int cpu; + unsigned nr; + + printk(KERN_WARNING + "More than 8 CPUs detected - skipping them.\n" + "Use CONFIG_X86_GENERICARCH and CONFIG_X86_BIGSMP.\n"); + + nr = 0; + for_each_present_cpu(cpu) { + if (nr >= 8) + cpu_clear(cpu, cpu_present_map); + nr++; + } + + nr = 0; + for_each_possible_cpu(cpu) { + if (nr >= 8) + cpu_clear(cpu, cpu_possible_map); + nr++; + } + + nr_cpu_ids = 8; + } +#endif + if (!physid_isset(hard_smp_processor_id(), phys_cpu_present_map)) { printk(KERN_WARNING "weird, boot CPU (#%d) not listed" "by the BIOS.\n", hard_smp_processor_id()); | |