diff options
Diffstat (limited to 'mm/page_alloc.c')
| -rw-r--r-- | mm/page_alloc.c | 33 | 
1 files changed, 17 insertions, 16 deletions
diff --git a/mm/page_alloc.c b/mm/page_alloc.c index f823ee192e9..826ba6922e8 100644 --- a/mm/page_alloc.c +++ b/mm/page_alloc.c @@ -104,19 +104,24 @@ gfp_t gfp_allowed_mask __read_mostly = GFP_BOOT_MASK;   * only be modified with pm_mutex held, unless the suspend/hibernate code is   * guaranteed not to run in parallel with that modification).   */ -void set_gfp_allowed_mask(gfp_t mask) + +static gfp_t saved_gfp_mask; + +void pm_restore_gfp_mask(void)  {  	WARN_ON(!mutex_is_locked(&pm_mutex)); -	gfp_allowed_mask = mask; +	if (saved_gfp_mask) { +		gfp_allowed_mask = saved_gfp_mask; +		saved_gfp_mask = 0; +	}  } -gfp_t clear_gfp_allowed_mask(gfp_t mask) +void pm_restrict_gfp_mask(void)  { -	gfp_t ret = gfp_allowed_mask; -  	WARN_ON(!mutex_is_locked(&pm_mutex)); -	gfp_allowed_mask &= ~mask; -	return ret; +	WARN_ON(saved_gfp_mask); +	saved_gfp_mask = gfp_allowed_mask; +	gfp_allowed_mask &= ~GFP_IOFS;  }  #endif /* CONFIG_PM_SLEEP */ @@ -3008,14 +3013,6 @@ static __init_refok int __build_all_zonelists(void *data)  		build_zonelist_cache(pgdat);  	} -#ifdef CONFIG_MEMORY_HOTPLUG -	/* Setup real pagesets for the new zone */ -	if (data) { -		struct zone *zone = data; -		setup_zone_pageset(zone); -	} -#endif -  	/*  	 * Initialize the boot_pagesets that are going to be used  	 * for bootstrapping processors. The real pagesets for @@ -3064,7 +3061,11 @@ void build_all_zonelists(void *data)  	} else {  		/* we have to stop all cpus to guarantee there is no user  		   of zonelist */ -		stop_machine(__build_all_zonelists, data, NULL); +#ifdef CONFIG_MEMORY_HOTPLUG +		if (data) +			setup_zone_pageset((struct zone *)data); +#endif +		stop_machine(__build_all_zonelists, NULL, NULL);  		/* cpuset refresh routine should be here */  	}  	vm_total_pages = nr_free_pagecache_pages();  |