Skip to content
  • Yinghai Lu's avatar
    nobootmem, x86: Fix 32bit numa system without RAM on node 0 · 33799858
    Yinghai Lu authored
    
    
    On one system without RAM on node0, got following boot dump with a 32
    bit NUMA kernel:
    
    early_node_map[4] active PFN ranges
        1: 0x00000010 -> 0x00000099
        1: 0x00000100 -> 0x0007da00
        1: 0x0007e800 -> 0x0007ffa0
        1: 0x0007ffae -> 0x0007ffb0
    ...
    Subtract (29 early reservations)
      #000 [0000001000 - 0000002000]
      #001 [0000089000 - 000008f000]
      #002 [0000091000 - 0000093500]
    ...
      #027 [007cbfef40 - 007e800000]
      #028 [007e9ca000 - 007ff95000]
    (0 free memory ranges)
    Initializing HighMem for node 0 (00000000:00000000)
    Initializing HighMem for node 1 (00000000:00000000)
    Memory: 0k/2096832k available (6662k kernel code, 2096300k reserved, 4829k data, 484k init, 0k highmem)
    ...
    Checking if this processor honours the WP bit even in supervisor mode...Ok.
    swapper: page allocation failure. order:0, mode:0x0
    Pid: 0, comm: swapper Not tainted 2.6.34-rc3-tip-03818-g4b1ea6c-dirty #35
    Call Trace:
     [<4087a5dc>] ? printk+0xf/0x11
     [<40286728>] __alloc_pages_nodemask+0x417/0x487
     [<402a9ce1>] new_slab+0xe2/0x1fe
     [<402aa5b2>] kmem_cache_open+0x185/0x358
     [<402abbc0>] T.954+0x1c/0x60
     [<40d52a29>] kmem_cache_init+0x24/0x113
     [<40d39738>] start_kernel+0x166/0x2e4
     [<40d3940e>] ? unknown_bootoption+0x0/0x18e
     [<40d390ce>] i386_start_kernel+0xce/0xd5
    Mem-Info:
    Node 1 DMA per-cpu:
    CPU    0: hi:    0, btch:   1 usd:   0
    Node 1 Normal per-cpu:
    CPU    0: hi:    0, btch:   1 usd:   0
    active_anon:0 inactive_anon:0 isolated_anon:0
     active_file:0 inactive_file:0 isolated_file:0
     unevictable:0 dirty:0 writeback:0 unstable:0
     free:0 slab_reclaimable:0 slab_unreclaimable:0
     mapped:0 shmem:0 pagetables:0 bounce:0
    
    When 32bit NUMA is used, free_all_bootmem() will still only go over with
    node id 0.
    
    If node 0 doesn't have RAM installed, We need to go with node1
    because early_node_map still use 1 for all ranges, and ram from node1
    become low ram.
    
    Use MAX_NUMNODES like 64-bit NUMA does.
    
    Note: BOOTMEM path has the same problem.
          this bug exist before We have NO_BOOTMEM support.
    
    -v3: add more comments, and fix bootmem path too.
    -v4: seperate bootmem path fix
    
    Signed-off-by: default avatarYinghai Lu <yinghai@kernel.org>
    LKML-Reference: <4BB41689.9090502@kernel.org>
    Signed-off-by: default avatarH. Peter Anvin <hpa@zytor.com>
    33799858