linux/arch/x86/mm
Mel Gorman bac4894dfa x86: make NUMA work on 32-bit again
On 32-bit NUMA, the memmap representing struct pages on each node is
allocated from node-local memory if possible. As only node-0 has memory from
ZONE_NORMAL, the memmap must be mapped into low memory. This is done by
reserving space in the Kernel Virtual Area (KVA) for the memmap belonging
to other nodes by taking pages from the end of ZONE_NORMAL and remapping
the other nodes memmap into those virtual addresses. The node boundaries
are then adjusted so that the region of pages is not used and it is marked
as reserved in the bootmem allocator.

This reserved portion of the KVA is PMD aligned althought
strictly speaking that requirement could be lifted (see thread at
http://lkml.org/lkml/2007/8/24/220). The problem is that when aligned, there
may be a portion of ZONE_NORMAL at the end that is not used for memmap and
does not have an initialised memmap nor is it marked reserved in the bootmem
allocator. Later in the boot process, these pages are freed and a storm of
Bad page state messages result.

This patch marks these pages reserved that are wasted due to alignment
in the bootmem allocator so they are not accidently freed. It is worth
noting that memory from node-0 is wasted where it could have been put into
ZONE_HIGHMEM on NUMA machines. Worse, the KVA is always reserved from the
location of real memory even when there is plenty of spare virtual address
space.

This patch also makes sure that reserve_bootmem() is not called with a
0-length size in numa_kva_reserve().  When this happens, it usually means
that a kernel built for Summit is being booted on a normal machine. The
resulting BUG_ON() is misleading so it is caught here.

Signed-off-by: Mel Gorman <mel@csn.ul.ie>
Signed-off-by: Andy Whitcroft <apw@shadowen.org>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
2008-01-30 13:32:54 +01:00
..
boot_ioremap_32.c x86: cleanup tlbflush.h variants 2008-01-30 13:30:35 +01:00
discontig_32.c x86: make NUMA work on 32-bit again 2008-01-30 13:32:54 +01:00
extable.c x86: unify extable_{32|64}.c 2008-01-30 13:31:41 +01:00
fault_32.c x86: introduce force_sig_info_fault helper to X86_64 2008-01-30 13:32:35 +01:00
fault_64.c x86: clean up arch/x86/mm/fault_64.c 2008-01-30 13:32:53 +01:00
highmem_32.c x86: kmap_atomic() debugging 2008-01-30 13:30:47 +01:00
hugetlbpage.c
init_32.c x86 boot: use E820 memory map on EFI 32 platform 2008-01-30 13:31:19 +01:00
init_64.c x86: debug: double-check the empty zero page 2008-01-30 13:32:36 +01:00
ioremap_32.c
ioremap_64.c x86: 64-bit, make sparsemem vmemmap the only memory model 2008-01-30 13:30:47 +01:00
k8topology_64.c x86: clean up k8topology.c 2008-01-30 13:32:36 +01:00
Makefile
Makefile_32 x86: unify extable_{32|64}.c 2008-01-30 13:31:41 +01:00
Makefile_64 x86: unify extable_{32|64}.c 2008-01-30 13:31:41 +01:00
mmap.c x86: unify mmap_{32|64}.c 2008-01-30 13:31:10 +01:00
numa_64.c x86: clean up bitops-related warnings 2008-01-30 13:30:55 +01:00
pageattr_32.c x86: Create clflush() inline, remove hardcoded wbinvd 2007-10-17 20:16:12 +02:00
pageattr_64.c Intel IOMMU: clflush_cache_range now takes size param 2007-10-22 08:13:18 -07:00
pgtable_32.c x86: stop nmi softlockup warnings in show_mem() 2007-10-17 20:15:41 +02:00
srat_64.c arch/x86/: spelling fixes 2008-01-30 13:31:42 +01:00