diff options
Diffstat (limited to 'mm/sparse-vmemmap.c')
| -rw-r--r-- | mm/sparse-vmemmap.c | 27 | 
1 files changed, 17 insertions, 10 deletions
diff --git a/mm/sparse-vmemmap.c b/mm/sparse-vmemmap.c index 1b7e22ab9b0..27eeab3be75 100644 --- a/mm/sparse-vmemmap.c +++ b/mm/sparse-vmemmap.c @@ -53,10 +53,12 @@ void * __meminit vmemmap_alloc_block(unsigned long size, int node)  		struct page *page;  		if (node_state(node, N_HIGH_MEMORY)) -			page = alloc_pages_node(node, -				GFP_KERNEL | __GFP_ZERO, get_order(size)); +			page = alloc_pages_node( +				node, GFP_KERNEL | __GFP_ZERO | __GFP_REPEAT, +				get_order(size));  		else -			page = alloc_pages(GFP_KERNEL | __GFP_ZERO, +			page = alloc_pages( +				GFP_KERNEL | __GFP_ZERO | __GFP_REPEAT,  				get_order(size));  		if (page)  			return page_address(page); @@ -145,11 +147,10 @@ pgd_t * __meminit vmemmap_pgd_populate(unsigned long addr, int node)  	return pgd;  } -int __meminit vmemmap_populate_basepages(struct page *start_page, -						unsigned long size, int node) +int __meminit vmemmap_populate_basepages(unsigned long start, +					 unsigned long end, int node)  { -	unsigned long addr = (unsigned long)start_page; -	unsigned long end = (unsigned long)(start_page + size); +	unsigned long addr = start;  	pgd_t *pgd;  	pud_t *pud;  	pmd_t *pmd; @@ -176,9 +177,15 @@ int __meminit vmemmap_populate_basepages(struct page *start_page,  struct page * __meminit sparse_mem_map_populate(unsigned long pnum, int nid)  { -	struct page *map = pfn_to_page(pnum * PAGES_PER_SECTION); -	int error = vmemmap_populate(map, PAGES_PER_SECTION, nid); -	if (error) +	unsigned long start; +	unsigned long end; +	struct page *map; + +	map = pfn_to_page(pnum * PAGES_PER_SECTION); +	start = (unsigned long)map; +	end = (unsigned long)(map + PAGES_PER_SECTION); + +	if (vmemmap_populate(start, end, nid))  		return NULL;  	return map;  |