linux/arch/powerpc/mm
Jon Tollefson 8f64e1f2d1 powerpc: Reserve in bootmem lmb reserved regions that cross NUMA nodes
If there are multiple reserved memory blocks via lmb_reserve() that are
contiguous addresses and on different NUMA nodes we are losing track of which
address ranges to reserve in bootmem on which node.  I discovered this
when I recently got to try 16GB huge pages on a system with more then 2 nodes.

When scanning the device tree in early boot we call lmb_reserve() with
the addresses of the 16G pages that we find so that the memory doesn't
get used for something else.  For example the addresses for the pages
could be 4000000000, 4400000000, 4800000000, 4C00000000, etc - 8 pages,
one on each of eight nodes.  In the lmb after all the pages have been
reserved it will look something like the following:

lmb_dump_all:
    memory.cnt            = 0x2
    memory.size           = 0x3e80000000
    memory.region[0x0].base       = 0x0
                      .size     = 0x1e80000000
    memory.region[0x1].base       = 0x4000000000
                      .size     = 0x2000000000
    reserved.cnt          = 0x5
    reserved.size         = 0x3e80000000
    reserved.region[0x0].base       = 0x0
                      .size     = 0x7b5000
    reserved.region[0x1].base       = 0x2a00000
                      .size     = 0x78c000
    reserved.region[0x2].base       = 0x328c000
                      .size     = 0x43000
    reserved.region[0x3].base       = 0xf4e8000
                      .size     = 0xb18000
    reserved.region[0x4].base       = 0x4000000000
                      .size     = 0x2000000000

The reserved.region[0x4] contains the 16G pages.  In
arch/powerpc/mm/num.c: do_init_bootmem() we loop through each of the
node numbers looking for the reserved regions that belong to the
particular node.  It is not able to identify region 0x4 as being a part
of each of the 8 nodes.  It is assuming that a reserved region is only
on a single node.

This patch takes out the reserved region loop from inside
the loop that goes over each node.  It looks up the active region containing
the start of the reserved region.  If it extends past that active region then
it adjusts the size and gets the next active region containing it.

Signed-off-by: Jon Tollefson <kniht@linux.vnet.ibm.com>
Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
2008-10-10 15:55:19 +11:00
..
40x_mmu.c [POWERPC] Remove and replace uses of PPC_MEMSTART with memstart_addr 2008-04-17 07:46:12 +10:00
44x_mmu.c powerpc: rework 4xx PTE access and TLB miss 2008-07-09 13:36:17 -04:00
fault.c powerpc: BookE hardware watchpoint support 2008-07-25 15:44:39 +10:00
fsl_booke_mmu.c powerpc/85xx: fix build warning, remove silly cast 2008-09-16 10:01:35 -05:00
gup.c powerpc/mm: Lockless get_user_pages_fast() for 64-bit (v3) 2008-07-30 15:26:54 +10:00
hash_low_32.S POWERPC: Allow 32-bit hashed pgtable code to support 36-bit physical 2008-09-24 16:29:44 -05:00
hash_low_64.S powerpc: Free a PTE bit on ppc64 with 64K pages 2008-06-30 22:30:53 +10:00
hash_native_64.c [POWERPC] Use 1TB segments 2007-10-12 14:05:17 +10:00
hash_utils_64.c powerpc: Make the 64-bit kernel as a position-independent executable 2008-09-15 11:08:38 -07:00
hugetlbpage.c powerpc: Clean up hugepage pagetable allocation for powerpc with 16G pages 2008-09-15 11:08:47 -07:00
init_32.c powerpc: Fix problems with 32bit PPC's running with >= 4GB of RAM 2008-07-09 14:13:01 -04:00
init_64.c powerpc/mm: Fix attribute confusion with htab_bolt_mapping() 2008-08-11 10:09:56 +10:00
Makefile powerpc/mm: Lockless get_user_pages_fast() for 64-bit (v3) 2008-07-30 15:26:54 +10:00
mem.c powerpc: Avoid integer overflow in page_is_ram() 2008-10-07 14:26:18 +11:00
mmap.c Detach sched.h from mm.h 2007-05-21 09:18:19 -07:00
mmu_context_32.c [POWERPC] Remove the dregs of APUS support from arch/powerpc 2007-06-14 22:30:15 +10:00
mmu_context_64.c [POWERPC] Tidy up CONFIG_PPC_MM_SLICES code 2007-08-17 11:01:59 +10:00
mmu_decl.h powerpc: Fix problems with 32bit PPC's running with >= 4GB of RAM 2008-07-09 14:13:01 -04:00
numa.c powerpc: Reserve in bootmem lmb reserved regions that cross NUMA nodes 2008-10-10 15:55:19 +11:00
pgtable_32.c POWERPC: Allow 32-bit hashed pgtable code to support 36-bit physical 2008-09-24 16:29:44 -05:00
pgtable_64.c powerpc ioremap_prot 2008-07-24 10:47:15 -07:00
ppc_mmu_32.c powerpc: Force printing of 'total_memory' to unsigned long long 2008-08-04 13:18:17 +10:00
slb_low.S [POWERPC] vmemmap fixes to use smaller pages 2008-05-15 20:49:25 +10:00
slb.c [POWERPC] vmemmap fixes to use smaller pages 2008-05-15 20:49:25 +10:00
slice.c Merge commit 'origin/master' 2008-07-16 11:07:59 +10:00
stab.c [POWERPC] Fix sparse warnings in arch/powerpc/mm 2008-05-14 22:31:46 +10:00
subpage-prot.c [POWERPC] Provide a way to protect 4k subpages when using 64k pages 2008-01-24 10:06:01 +11:00
tlb_32.c POWERPC: Allow 32-bit hashed pgtable code to support 36-bit physical 2008-09-24 16:29:44 -05:00
tlb_64.c powerpc: Move include files to arch/powerpc/include/asm 2008-08-04 12:02:00 +10:00