1
linux/arch/x86
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 i386: handle an initrd in highmem (version 2) 2008-01-30 13:32:51 +01:00
configs x86: Set CFQ as default in 32-bit defconfig 2008-01-30 13:32:49 +01:00
crypto [CRYPTO] twofish: Merge common glue code 2008-01-14 17:07:57 +11:00
ia32 arch/x86/ia32: use time_before, time_before_eq, etc. 2008-01-30 13:32:17 +01:00
kernel x86, ptrace: add bts_struct size to status command 2008-01-30 13:32:54 +01:00
lguest x86: change write_gdt_entry signature. 2008-01-30 13:31:13 +01:00
lib x86: unify arch/x86/lib/Makefile(s) 2008-01-30 13:32:31 +01:00
mach-default spelling fixes: arch/i386/ 2007-10-20 01:13:56 +02:00
mach-es7000 i386: es7000 minor cleanups 2007-10-17 20:16:15 +02:00
mach-generic spelling fixes: arch/i386/ 2007-10-20 01:13:56 +02:00
mach-visws x86: cleanup mpspec variants 2008-01-30 13:30:35 +01:00
mach-voyager x86: remove all definitions with fastcall 2008-01-30 13:31:17 +01:00
math-emu x86: arch/x86/math-emu/errors.c: fix printk warnings 2008-01-30 13:32:13 +01:00
mm x86: make NUMA work on 32-bit again 2008-01-30 13:32:54 +01:00
oprofile x86: fix style errors in nmi_int.c 2008-01-30 13:32:33 +01:00
pci x86: add some pirq debugging 2008-01-30 13:32:00 +01:00
power x86: make __{save,restore}_processor_state static 2008-01-30 13:31:23 +01:00
vdso x86: gitignore arch/x86/vdso files 2008-01-30 13:32:32 +01:00
video i386: move video 2007-10-11 11:16:56 +02:00
xen x86: remove all definitions with fastcall 2008-01-30 13:31:17 +01:00
Kconfig percpu: use a kconfig variable to signal arch specific percpu setup 2008-01-30 13:32:51 +01:00
Kconfig.cpu x86: reduce CONFIG_X86_PPRO_FENCE bloat 2008-01-30 13:32:31 +01:00
Kconfig.debug x86 boot : export boot_params via debugfs for debugging 2008-01-30 13:32:51 +01:00
Makefile x86: document fdimage/isoimage completely in make help 2008-01-30 13:32:49 +01:00
Makefile_32.cpu x86: move i386 and x86_64 Makefiles to arch/x86 2007-10-25 22:27:34 +02:00