x86, numa: fix boot without RAM on node0 again
PATCH 1/1 x86, numa: fix boot without RAM on node0 again
|commit e534c7c5f8d6e9fc46f57fab067c7e48d8ceb172 |Author: Lee Schermerhorn <[email protected]> |Date: Wed May 26 14:44:58 2010 -0700 | | numa: x86_64: use generic percpu var numa_node_id() implementation | | x86 arch specific changes to use generic numa_node_id() based on generic | percpu variable infrastructure. Back out x86's custom version of | numa_node_id()
broke numa system that doesn't have ram on node0 when MEMORY_HOTPLUG is enabled.
because cpu_up() will call cpu_to_node() before per_cpu(numa_node) is setup for APs.
When Node0 doesn't have RAM, on x86, cpus already round it to nearest node with RAM in x86_cpu_to_node_map. and per_cpu(numa_node) is not set up until in c_init for APs.
when later cpu_up() calling cpu_to_node() will get 0 again, and make it online even there is no RAM on node0. so later all APs can not booted up, and later will have panic.
[ 1.611101] On node 0 totalpages: 0 ......... [ 2.608558] On node 0 totalpages: 0 [ 2.612065] Brought up 1 CPUs [ 2.615199] Total of 1 processors activated (3990.31 BogoMIPS). ... 93.225341] calling loop_init+0x0/0x1a4 @ 1 [ 93.229314] PERCPU: allocation failed, size=80 align=8, failed to populate [ 93.246539] Pid: 1, comm: swapper Tainted: G W 2.6.35-rc4-tip-yh-04371-gd64e6c4-dirty #354 [ 93.264621] Call Trace: [ 93.266533] [<ffffffff81125e43>] pcpu_alloc+0x83a/0x8e7 [ 93.270710] [<ffffffff81125f15>] __alloc_percpu+0x10/0x12 [ 93.285849] [<ffffffff8140786c>] alloc_disk_node+0x94/0x16d [ 93.291811] [<ffffffff81407956>] alloc_disk+0x11/0x13 [ 93.306157] [<ffffffff81503e51>] loop_alloc+0xa7/0x180 [ 93.310538] [<ffffffff8277ef48>] loop_init+0x9b/0x1a4 [ 93.324909] [<ffffffff8277eead>] ? loop_init+0x0/0x1a4 [ 93.329650] [<ffffffff810001f2>] do_one_initcall+0x57/0x136 [ 93.345197] [<ffffffff827486d0>] kernel_init+0x184/0x20e [ 93.348146] [<ffffffff81034954>] kernel_thread_helper+0x4/0x10 [ 93.365194] [<ffffffff81c7cc3c>] ? restore_args+0x0/0x30 [ 93.369305] [<ffffffff8274854c>] ? kernel_init+0x0/0x20e [ 93.386011] [<ffffffff81034950>] ? kernel_thread_helper+0x0/0x10 [ 93.392047] loop: out of memory
...
Try to assign per_cpu(numa_node) early
Signed-off-by Yinghai <[email protected]>
--- arch/x86/kernel/setup_percpu.c | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-)
arch/x86/kernel/setup_percpu.c +9 -8
@@ -238,6 +238,15 @@ void __init setup_per_cpu_areas(void)#ifdef CONFIG_NUMA per_cpu (x86_cpu_to_node_map, cpu) =early_per_cpu_map (x86_cpu_to_node_map, cpu); +/* +* make sure boot cpu numa_node is right, when boot cpu is on +* the node that doesn't have mem installed +* also cpu_up() will call cpu_to_node() for APs when +* MEMORY_HOTPLUG is defined, before per_cpu(numa_node) is set +* up later with c_init aka intel_init/amd_init +* So set them all (boot cpu and all APs) +*/ +set_cpu_numa_node (cpu,early_cpu_to_node (cpu));#endif #endif /*
@@ -257,14 +266,6 @@ void __init setup_per_cpu_areas(void)early_per_cpu_ptr (x86_cpu_to_node_map) =NULL ;#endif -#if defined(CONFIG_X86_64 ) && defined(CONFIG_NUMA ) -/* -* make sure boot cpu numa_node is right, when boot cpu is on the -* node that doesn't have mem installed -*/ -set_cpu_numa_node (boot_cpu_id,early_cpu_to_node (boot_cpu_id)); -#endif -/* Setup node to cpumask map */ setup_node_to_cpumask_map ();