From: "Bob Picco" Mel's latest V9 regressed slightly for ia64 FLATMEM+VIRTUAL_MEM_MAP. When the largest hole is greater than LARGE_GAP, vmem_map is allocated before free_area_init_nodes; resultant crash follows. Rather than complicate alloc_node_mem_map just for this ia64 case, add an adjustment to node_mem_map which is later negated by alloc_node_mem_map. Previous to V9, the mem_map adjustment was done in the scope where allocation is achieved in alloc_node_mem_map. The current code is more appropriate but unfortunately caused an issue for ia64. Acked-by: Mel Gorman Signed-off-by: Bob Picco Signed-off-by: Andrew Morton --- arch/ia64/mm/contig.c | 7 ++++++- 1 files changed, 6 insertions(+), 1 deletion(-) diff -puN arch/ia64/mm/contig.c~have-ia64-use-add_active_range-and-free_area_init_nodes-fix arch/ia64/mm/contig.c --- a/arch/ia64/mm/contig.c~have-ia64-use-add_active_range-and-free_area_init_nodes-fix +++ a/arch/ia64/mm/contig.c @@ -252,7 +252,12 @@ paging_init (void) vmem_map = (struct page *) vmalloc_end; efi_memmap_walk(create_mem_map_page_table, NULL); - NODE_DATA(0)->node_mem_map = vmem_map; + /* + * alloc_node_mem_map makes an adjustment for mem_map + * which isn't compatible with vmem_map. + */ + NODE_DATA(0)->node_mem_map = vmem_map + + find_min_pfn_with_active_regions(); free_area_init_nodes(max_zone_pfns); printk("Virtual mem_map starts at 0x%p\n", mem_map); _