From: Andy Whitcroft When in x86 NUMA mode we allocate struct pages's node local and map them into the kernel virtual address space in the remap space. This space cuts into the end of ZONE_NORMAL. When we round ZONE_NORMAL down we must ensure we maintain the zone boundary constraint, we must round to MAX_ORDER. Signed-off-by: Andy Whitcroft Signed-off-by: Andrew Morton --- arch/i386/mm/discontig.c | 5 ++++- 1 files changed, 4 insertions(+), 1 deletion(-) diff -puN arch/i386/mm/discontig.c~x86-align-highmem-zone-boundaries-with-numa arch/i386/mm/discontig.c --- devel/arch/i386/mm/discontig.c~x86-align-highmem-zone-boundaries-with-numa 2006-05-11 01:00:08.000000000 -0700 +++ devel-akpm/arch/i386/mm/discontig.c 2006-05-11 01:00:08.000000000 -0700 @@ -292,10 +292,13 @@ unsigned long __init setup_memory(void) /* partially used pages are not usable - thus round upwards */ system_start_pfn = min_low_pfn = PFN_UP(init_pg_tables_end); - system_max_low_pfn = max_low_pfn = find_max_low_pfn() - reserve_pages; + max_low_pfn = find_max_low_pfn() - reserve_pages; printk("reserve_pages = %ld find_max_low_pfn() ~ %ld\n", reserve_pages, max_low_pfn + reserve_pages); printk("max_pfn = %ld\n", max_pfn); + + system_max_low_pfn = max_low_pfn = zone_boundary_align_pfn(max_low_pfn); + #ifdef CONFIG_HIGHMEM highstart_pfn = highend_pfn = max_pfn; if (max_pfn > system_max_low_pfn) _