• Yinghai Lu's avatar
    x86, numa: fix boot without RAM on node0 again · 9aebbdb6
    Yinghai Lu authored
    Commit e534c7c5 ("numa: x86_64: use generic percpu var
    numa_node_id() implementation") broke numa systems that don'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
    
    [akpm@linux-foundation.org: tidy up code comment]
    Signed-off-by: default avatarYinghai <yinghai@kernel.org>
    Cc: Thomas Gleixner <tglx@linutronix.de>
    Cc: Ingo Molnar <mingo@redhat.com>
    Cc: "H. Peter Anvin" <hpa@zytor.com>
    Cc: Tejun Heo <tj@kernel.org>
    Cc: Denys Vlasenko <vda.linux@googlemail.com>
    Acked-by: default avatarLee Schermerhorn <lee.schermerhorn@hp.com>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    9aebbdb6
setup_percpu.c 7.54 KB