Re: 2.6.27rc1 cannot boot more than 8CPUs

Yinghai Lu
2008-08-13T18:33:24Z

[-- Attachment #1: Type: text/plain, Size: 1393 bytes --]

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

[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: big_smp_check.patch --]
[-- Type: text/x-patch; name=big_smp_check.patch, Size: 1839 bytes --]

[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());