diff options
Diffstat (limited to 'mm/memblock.c')
| -rw-r--r-- | mm/memblock.c | 12 | 
1 files changed, 11 insertions, 1 deletions
diff --git a/mm/memblock.c b/mm/memblock.c index 0a53db4d9f7b..d3509414b8c3 100644 --- a/mm/memblock.c +++ b/mm/memblock.c @@ -2183,11 +2183,14 @@ static void __init memmap_init_reserved_pages(void)  	struct memblock_region *region;  	phys_addr_t start, end;  	int nid; +	unsigned long max_reserved;  	/*  	 * set nid on all reserved pages and also treat struct  	 * pages for the NOMAP regions as PageReserved  	 */ +repeat: +	max_reserved = memblock.reserved.max;  	for_each_mem_region(region) {  		nid = memblock_get_region_node(region);  		start = region->base; @@ -2196,8 +2199,15 @@ static void __init memmap_init_reserved_pages(void)  		if (memblock_is_nomap(region))  			reserve_bootmem_region(start, end, nid); -		memblock_set_node(start, end, &memblock.reserved, nid); +		memblock_set_node(start, region->size, &memblock.reserved, nid);  	} +	/* +	 * 'max' is changed means memblock.reserved has been doubled its +	 * array, which may result a new reserved region before current +	 * 'start'. Now we should repeat the procedure to set its node id. +	 */ +	if (max_reserved != memblock.reserved.max) +		goto repeat;  	/*  	 * initialize struct pages for reserved regions that don't have  | 
