From: "Yinghai Lu" Allocate section_map in bootmem instead of using __initdata. Signed-off-by: Yinghai Lu Cc: Andi Kleen Cc: Yasunori Goto Cc: KAMEZAWA Hiroyuki Cc: Ingo Molnar Cc: Christoph Lameter Cc: Mel Gorman Signed-off-by: Andrew Morton --- mm/sparse.c | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff -puN mm/sparse.c~mm-allocate-section_map-for-sparse_init mm/sparse.c --- a/mm/sparse.c~mm-allocate-section_map-for-sparse_init +++ a/mm/sparse.c @@ -287,8 +287,6 @@ struct page __init *sparse_early_mem_map return NULL; } -/* section_map pointer array is 64k */ -static __initdata struct page *section_map[NR_MEM_SECTIONS]; /* * Allocate the accumulated non-linear sections, allocate a mem_map * for each and record the physical to section mapping. @@ -298,6 +296,9 @@ void __init sparse_init(void) unsigned long pnum; struct page *map; unsigned long *usemap; + struct page **section_map; + int size; + int node; /* * map is using big page (aka 2M in x86 64 bit) @@ -307,13 +308,17 @@ void __init sparse_init(void) * then in big system, the memmory will have a lot hole... * here try to allocate 2M pages continously. */ + size = sizeof(struct page *) * NR_MEM_SECTIONS; + section_map = alloc_bootmem(size); + if (!section_map) + panic("can not allocate section_map\n"); + for (pnum = 0; pnum < NR_MEM_SECTIONS; pnum++) { if (!present_section_nr(pnum)) continue; section_map[pnum] = sparse_early_mem_map_alloc(pnum); } - for (pnum = 0; pnum < NR_MEM_SECTIONS; pnum++) { if (!present_section_nr(pnum)) continue; @@ -329,6 +334,9 @@ void __init sparse_init(void) sparse_init_one_section(__nr_to_section(pnum), pnum, map, usemap); } + + for_each_online_node(node) + free_bootmem_node(NODE_DATA(node), __pa(section_map), size); } #ifdef CONFIG_MEMORY_HOTPLUG _