diff options
Diffstat (limited to 'mm/memory_hotplug.c')
| -rw-r--r-- | mm/memory_hotplug.c | 20 | 
1 files changed, 12 insertions, 8 deletions
diff --git a/mm/memory_hotplug.c b/mm/memory_hotplug.c index 427bb291dd0..3ad25f9d1fc 100644 --- a/mm/memory_hotplug.c +++ b/mm/memory_hotplug.c @@ -512,19 +512,20 @@ int __ref online_pages(unsigned long pfn, unsigned long nr_pages)  	zone->present_pages += onlined_pages;  	zone->zone_pgdat->node_present_pages += onlined_pages; -	if (need_zonelists_rebuild) -		build_all_zonelists(zone); -	else -		zone_pcp_update(zone); +	if (onlined_pages) { +		node_set_state(zone_to_nid(zone), N_HIGH_MEMORY); +		if (need_zonelists_rebuild) +			build_all_zonelists(NULL, zone); +		else +			zone_pcp_update(zone); +	}  	mutex_unlock(&zonelists_mutex);  	init_per_zone_wmark_min(); -	if (onlined_pages) { +	if (onlined_pages)  		kswapd_run(zone_to_nid(zone)); -		node_set_state(zone_to_nid(zone), N_HIGH_MEMORY); -	}  	vm_total_pages = nr_free_pagecache_pages(); @@ -562,7 +563,7 @@ static pg_data_t __ref *hotadd_new_pgdat(int nid, u64 start)  	 * to access not-initialized zonelist, build here.  	 */  	mutex_lock(&zonelists_mutex); -	build_all_zonelists(NULL); +	build_all_zonelists(pgdat, NULL);  	mutex_unlock(&zonelists_mutex);  	return pgdat; @@ -965,6 +966,9 @@ repeat:  	init_per_zone_wmark_min(); +	if (!populated_zone(zone)) +		zone_pcp_reset(zone); +  	if (!node_present_pages(node)) {  		node_clear_state(node, N_HIGH_MEMORY);  		kswapd_stop(node);  |