diff options
Diffstat (limited to 'mm/nobootmem.c')
| -rw-r--r-- | mm/nobootmem.c | 22 | 
1 files changed, 22 insertions, 0 deletions
| diff --git a/mm/nobootmem.c b/mm/nobootmem.c index bd82f6b31411..b8294fc03df8 100644 --- a/mm/nobootmem.c +++ b/mm/nobootmem.c @@ -137,6 +137,22 @@ unsigned long __init free_low_memory_core_early(int nodeid)  	return count;  } +static void reset_node_lowmem_managed_pages(pg_data_t *pgdat) +{ +	struct zone *z; + +	/* +	 * In free_area_init_core(), highmem zone's managed_pages is set to +	 * present_pages, and bootmem allocator doesn't allocate from highmem +	 * zones. So there's no need to recalculate managed_pages because all +	 * highmem pages will be managed by the buddy system. Here highmem +	 * zone also includes highmem movable zone. +	 */ +	for (z = pgdat->node_zones; z < pgdat->node_zones + MAX_NR_ZONES; z++) +		if (!is_highmem(z)) +			z->managed_pages = 0; +} +  /**   * free_all_bootmem_node - release a node's free pages to the buddy allocator   * @pgdat: node to be released @@ -146,6 +162,7 @@ unsigned long __init free_low_memory_core_early(int nodeid)  unsigned long __init free_all_bootmem_node(pg_data_t *pgdat)  {  	register_page_bootmem_info_node(pgdat); +	reset_node_lowmem_managed_pages(pgdat);  	/* free_low_memory_core_early(MAX_NUMNODES) will be called later */  	return 0; @@ -158,6 +175,11 @@ unsigned long __init free_all_bootmem_node(pg_data_t *pgdat)   */  unsigned long __init free_all_bootmem(void)  { +	struct pglist_data *pgdat; + +	for_each_online_pgdat(pgdat) +		reset_node_lowmem_managed_pages(pgdat); +  	/*  	 * We need to use MAX_NUMNODES instead of NODE_DATA(0)->node_id  	 *  because in some case like Node0 doesn't have RAM installed |