diff options
Diffstat (limited to 'mm/sparse.c')
| -rw-r--r-- | mm/sparse.c | 25 | 
1 files changed, 12 insertions, 13 deletions
diff --git a/mm/sparse.c b/mm/sparse.c index a8bc7d364de..6a4bf9160e8 100644 --- a/mm/sparse.c +++ b/mm/sparse.c @@ -273,10 +273,10 @@ static unsigned long *__kmalloc_section_usemap(void)  #ifdef CONFIG_MEMORY_HOTREMOVE  static unsigned long * __init  sparse_early_usemaps_alloc_pgdat_section(struct pglist_data *pgdat, -					 unsigned long count) +					 unsigned long size)  { -	unsigned long section_nr; - +	pg_data_t *host_pgdat; +	unsigned long goal;  	/*  	 * A page may contain usemaps for other sections preventing the  	 * page being freed and making a section unremovable while @@ -287,8 +287,10 @@ sparse_early_usemaps_alloc_pgdat_section(struct pglist_data *pgdat,  	 * from the same section as the pgdat where possible to avoid  	 * this problem.  	 */ -	section_nr = pfn_to_section_nr(__pa(pgdat) >> PAGE_SHIFT); -	return alloc_bootmem_section(usemap_size() * count, section_nr); +	goal = __pa(pgdat) & PAGE_SECTION_MASK; +	host_pgdat = NODE_DATA(early_pfn_to_nid(goal >> PAGE_SHIFT)); +	return __alloc_bootmem_node_nopanic(host_pgdat, size, +					    SMP_CACHE_BYTES, goal);  }  static void __init check_usemap_section_nr(int nid, unsigned long *usemap) @@ -332,9 +334,9 @@ static void __init check_usemap_section_nr(int nid, unsigned long *usemap)  #else  static unsigned long * __init  sparse_early_usemaps_alloc_pgdat_section(struct pglist_data *pgdat, -					 unsigned long count) +					 unsigned long size)  { -	return NULL; +	return alloc_bootmem_node_nopanic(pgdat, size);  }  static void __init check_usemap_section_nr(int nid, unsigned long *usemap) @@ -352,13 +354,10 @@ static void __init sparse_early_usemaps_alloc_node(unsigned long**usemap_map,  	int size = usemap_size();  	usemap = sparse_early_usemaps_alloc_pgdat_section(NODE_DATA(nodeid), -								 usemap_count); +							  size * usemap_count);  	if (!usemap) { -		usemap = alloc_bootmem_node(NODE_DATA(nodeid), size * usemap_count); -		if (!usemap) { -			printk(KERN_WARNING "%s: allocation failed\n", __func__); -			return; -		} +		printk(KERN_WARNING "%s: allocation failed\n", __func__); +		return;  	}  	for (pnum = pnum_begin; pnum < pnum_end; pnum++) {  |