x86,nobootmem: make alloc_bootmem_node fall back to other node when 32bit numa is used
Borislav Petkov reported his 32bit numa system has problem:
[ 0.000000] Reserving total of 4c00 pages for numa KVA remap
[ 0.000000] kva_start_pfn ~ 32800 max_low_pfn ~ 375fe
[ 0.000000] max_pfn = 238000
[ 0.000000] 8202MB HIGHMEM available.
[ 0.000000] 885MB LOWMEM available.
[ 0.000000] mapped low ram: 0 -
375fe000
[ 0.000000] low ram: 0 -
375fe000
[ 0.000000] alloc (nid=8 100000 -
7ee00000) (
1000000 -
ffffffff) 1000 1000 =>
34e7000
[ 0.000000] alloc (nid=8 100000 -
7ee00000) (
1000000 -
ffffffff) 200 40 =>
34c9d80
[ 0.000000] alloc (nid=0 100000 -
7ee00000) (
1000000 -
ffffffffffffffff) 180 40 =>
34e6140
[ 0.000000] alloc (nid=1
80000000 -
c7e60000) (
1000000 -
ffffffffffffffff) 240 40 =>
80000000
[ 0.000000] BUG: unable to handle kernel paging request at
40000000
[ 0.000000] IP: [<
c2c8cff1>] __alloc_memory_core_early+0x147/0x1d6
[ 0.000000] *pdpt =
0000000000000000 *pde =
f000ff53f000ff00
...
[ 0.000000] Call Trace:
[ 0.000000] [<
c2c8b4f8>] ? __alloc_bootmem_node+0x216/0x22f
[ 0.000000] [<
c2c90c9b>] ? sparse_early_usemaps_alloc_node+0x5a/0x10b
[ 0.000000] [<
c2c9149e>] ? sparse_init+0x1dc/0x499
[ 0.000000] [<
c2c79118>] ? paging_init+0x168/0x1df
[ 0.000000] [<
c2c780ff>] ? native_pagetable_setup_start+0xef/0x1bb
looks like it allocates too much high address for bootmem.
Try to cut limit with get_max_mapped()
Reported-by: Borislav Petkov <borislav.petkov@amd.com>
Tested-by: Conny Seidel <conny.seidel@amd.com>
Signed-off-by: Yinghai Lu <yinghai@kernel.org>
Cc: <stable@kernel.org> [2.6.34.x]
Cc: Ingo Molnar <mingo@elte.hu>
Cc: "H. Peter Anvin" <hpa@zytor.com>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: Johannes Weiner <hannes@cmpxchg.org>
Cc: Lee Schermerhorn <lee.schermerhorn@hp.com>
Cc: Mel Gorman <mel@csn.ul.ie>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>