nobootmem, x86: Fix 32bit numa system without RAM on node 0

Previous message: [thread] [date] [author]
Next message: [thread] [date] [author]
From: Linux Kernel Mailing List
Date: Wednesday, April 7, 2010 - 11:59 am

Gitweb:     http://git.kernel.org/linus/337998587f802535896e9ed16d19f97915ccd368
Commit:     337998587f802535896e9ed16d19f97915ccd368
Parent:     909fc87b32b3b9e3f0b87dcc5d98319c41900c58
Author:     Yinghai Lu <yinghai@kernel.org>
AuthorDate: Wed Mar 31 20:44:09 2010 -0700
Committer:  H. Peter Anvin <hpa@zytor.com>
CommitDate: Thu Apr 1 14:39:29 2010 -0700

    nobootmem, x86: Fix 32bit numa system without RAM on node 0
    
    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: Yinghai Lu <yinghai@kernel.org>
    LKML-Reference: <4BB41689.9090502@kernel.org>
    Signed-off-by: H. Peter Anvin <hpa@zytor.com>
---
 mm/bootmem.c |    9 ++++++++-
 1 files changed, 8 insertions(+), 1 deletions(-)

diff --git a/mm/bootmem.c b/mm/bootmem.c
index 9b13446..2058cb7 100644
--- a/mm/bootmem.c
+++ b/mm/bootmem.c
@@ -303,7 +303,14 @@ unsigned long __init free_all_bootmem_node(pg_data_t *pgdat)
 unsigned long __init free_all_bootmem(void)
 {
 #ifdef CONFIG_NO_BOOTMEM
-	return free_all_memory_core_early(NODE_DATA(0)->node_id);
+	/*
+	 * We need to use MAX_NUMNODES instead of NODE_DATA(0)->node_id
+	 *  because in some case like Node0 doesnt have RAM installed
+	 *  low ram will be on Node1
+	 * Use MAX_NUMNODES will make sure all ranges in early_node_map[]
+	 *  will be used instead of only Node0 related
+	 */
+	return free_all_memory_core_early(MAX_NUMNODES);
 #else
 	return free_all_bootmem_core(NODE_DATA(0)->bdata);
 #endif
--
To unsubscribe from this list: send the line "unsubscribe git-commits-head" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Previous message: [thread] [date] [author]
Next message: [thread] [date] [author]

Messages in current thread:
nobootmem, x86: Fix 32bit numa system without RAM on node 0, Linux Kernel Mailing ..., (Wed Apr 7, 11:59 am)