diff options
author | Ingo Molnar <mingo@elte.hu> | 2007-10-19 14:35:02 -0400 |
---|---|---|
committer | Thomas Gleixner <tglx@linutronix.de> | 2007-10-19 14:35:02 -0400 |
commit | 54ffaa45c5f572ff6c344ca583137d0edf2d78cc (patch) | |
tree | 389a89b03cf4c8197e3ed8ac7af78950251ce235 /arch/x86/kernel/smpboot_32.c | |
parent | 3ceba7815cfc0b5d4c2bef5bb58e0c766da63549 (diff) |
x86: fix CONFIG_NUMA and nosmp | maxcpus=0/1 crash
x86 NUMA kernels crash in the scheduler setup code if "nosmp" or
"maxcpus=0" is passed on the boot command line:
| Brought up 1 CPUs
| BUG: unable to handle kernel NULL pointer dereference at virtual address 00000000
| printing eip: c011f0b5 *pde = 00000000
| Oops: 0000 [#1] SMP
|
| Pid: 1, comm: swapper Not tainted (2.6.23 #67)
| EIP: 0060:[<c011f0b5>] EFLAGS: 00010246 CPU: 0
| EIP is at sd_degenerate+0x35/0x40
the reason is sloppy spaghetti code in smpboot_32.c that resulted in a
missing map_cpu_to_logical_apicid() call - which also had the side-effect
of setting up the cpu_2_node[] entry for the lone CPU. That resulted in
node_to_cpumask(0) resulting in 00000000 - confusing the sched-domains
setup code.
Signed-off-by: Ingo Molnar <mingo@elte.hu>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Diffstat (limited to 'arch/x86/kernel/smpboot_32.c')
-rw-r--r-- | arch/x86/kernel/smpboot_32.c | 2 |
1 files changed, 2 insertions, 0 deletions
diff --git a/arch/x86/kernel/smpboot_32.c b/arch/x86/kernel/smpboot_32.c index be3faac04719..65e5de7d64db 100644 --- a/arch/x86/kernel/smpboot_32.c +++ b/arch/x86/kernel/smpboot_32.c | |||
@@ -1008,6 +1008,7 @@ static void __init smp_boot_cpus(unsigned int max_cpus) | |||
1008 | printk(KERN_ERR "... forcing use of dummy APIC emulation. (tell your hw vendor)\n"); | 1008 | printk(KERN_ERR "... forcing use of dummy APIC emulation. (tell your hw vendor)\n"); |
1009 | smpboot_clear_io_apic_irqs(); | 1009 | smpboot_clear_io_apic_irqs(); |
1010 | phys_cpu_present_map = physid_mask_of_physid(0); | 1010 | phys_cpu_present_map = physid_mask_of_physid(0); |
1011 | map_cpu_to_logical_apicid(); | ||
1011 | cpu_set(0, per_cpu(cpu_sibling_map, 0)); | 1012 | cpu_set(0, per_cpu(cpu_sibling_map, 0)); |
1012 | cpu_set(0, per_cpu(cpu_core_map, 0)); | 1013 | cpu_set(0, per_cpu(cpu_core_map, 0)); |
1013 | return; | 1014 | return; |
@@ -1029,6 +1030,7 @@ static void __init smp_boot_cpus(unsigned int max_cpus) | |||
1029 | } | 1030 | } |
1030 | smpboot_clear_io_apic_irqs(); | 1031 | smpboot_clear_io_apic_irqs(); |
1031 | phys_cpu_present_map = physid_mask_of_physid(0); | 1032 | phys_cpu_present_map = physid_mask_of_physid(0); |
1033 | map_cpu_to_logical_apicid(); | ||
1032 | cpu_set(0, per_cpu(cpu_sibling_map, 0)); | 1034 | cpu_set(0, per_cpu(cpu_sibling_map, 0)); |
1033 | cpu_set(0, per_cpu(cpu_core_map, 0)); | 1035 | cpu_set(0, per_cpu(cpu_core_map, 0)); |
1034 | return; | 1036 | return; |