diff options
Diffstat (limited to 'kernel/power/hibernate.c')
| -rw-r--r-- | kernel/power/hibernate.c | 22 | 
1 files changed, 12 insertions, 10 deletions
diff --git a/kernel/power/hibernate.c b/kernel/power/hibernate.c index 657272e91d0..048d0b51483 100644 --- a/kernel/power/hibernate.c +++ b/kernel/power/hibernate.c @@ -327,7 +327,6 @@ static int create_image(int platform_mode)  int hibernation_snapshot(int platform_mode)  {  	int error; -	gfp_t saved_mask;  	error = platform_begin(platform_mode);  	if (error) @@ -339,7 +338,7 @@ int hibernation_snapshot(int platform_mode)  		goto Close;  	suspend_console(); -	saved_mask = clear_gfp_allowed_mask(GFP_IOFS); +	pm_restrict_gfp_mask();  	error = dpm_suspend_start(PMSG_FREEZE);  	if (error)  		goto Recover_platform; @@ -348,7 +347,10 @@ int hibernation_snapshot(int platform_mode)  		goto Recover_platform;  	error = create_image(platform_mode); -	/* Control returns here after successful restore */ +	/* +	 * Control returns here (1) after the image has been created or the +	 * image creation has failed and (2) after a successful restore. +	 */   Resume_devices:  	/* We may need to release the preallocated image pages here. */ @@ -357,7 +359,10 @@ int hibernation_snapshot(int platform_mode)  	dpm_resume_end(in_suspend ?  		(error ? PMSG_RECOVER : PMSG_THAW) : PMSG_RESTORE); -	set_gfp_allowed_mask(saved_mask); + +	if (error || !in_suspend) +		pm_restore_gfp_mask(); +  	resume_console();   Close:  	platform_end(platform_mode); @@ -452,17 +457,16 @@ static int resume_target_kernel(bool platform_mode)  int hibernation_restore(int platform_mode)  {  	int error; -	gfp_t saved_mask;  	pm_prepare_console();  	suspend_console(); -	saved_mask = clear_gfp_allowed_mask(GFP_IOFS); +	pm_restrict_gfp_mask();  	error = dpm_suspend_start(PMSG_QUIESCE);  	if (!error) {  		error = resume_target_kernel(platform_mode);  		dpm_resume_end(PMSG_RECOVER);  	} -	set_gfp_allowed_mask(saved_mask); +	pm_restore_gfp_mask();  	resume_console();  	pm_restore_console();  	return error; @@ -476,7 +480,6 @@ int hibernation_restore(int platform_mode)  int hibernation_platform_enter(void)  {  	int error; -	gfp_t saved_mask;  	if (!hibernation_ops)  		return -ENOSYS; @@ -492,7 +495,6 @@ int hibernation_platform_enter(void)  	entering_platform_hibernation = true;  	suspend_console(); -	saved_mask = clear_gfp_allowed_mask(GFP_IOFS);  	error = dpm_suspend_start(PMSG_HIBERNATE);  	if (error) {  		if (hibernation_ops->recover) @@ -536,7 +538,6 @@ int hibernation_platform_enter(void)   Resume_devices:  	entering_platform_hibernation = false;  	dpm_resume_end(PMSG_RESTORE); -	set_gfp_allowed_mask(saved_mask);  	resume_console();   Close: @@ -646,6 +647,7 @@ int hibernate(void)  		swsusp_free();  		if (!error)  			power_down(); +		pm_restore_gfp_mask();  	} else {  		pr_debug("PM: Image restored successfully.\n");  	}  |