aboutsummaryrefslogtreecommitdiffstats
path: root/kernel/power
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/power')
-rw-r--r--kernel/power/hibernate.c22
-rw-r--r--kernel/power/suspend.c5
-rw-r--r--kernel/power/user.c4
3 files changed, 17 insertions, 14 deletions
diff --git a/kernel/power/hibernate.c b/kernel/power/hibernate.c
index 8dc31e02ae12..7a931a90e4a2 100644
--- a/kernel/power/hibernate.c
+++ b/kernel/power/hibernate.c
@@ -326,7 +326,6 @@ static int create_image(int platform_mode)
326int hibernation_snapshot(int platform_mode) 326int hibernation_snapshot(int platform_mode)
327{ 327{
328 int error; 328 int error;
329 gfp_t saved_mask;
330 329
331 error = platform_begin(platform_mode); 330 error = platform_begin(platform_mode);
332 if (error) 331 if (error)
@@ -338,7 +337,7 @@ int hibernation_snapshot(int platform_mode)
338 goto Close; 337 goto Close;
339 338
340 suspend_console(); 339 suspend_console();
341 saved_mask = clear_gfp_allowed_mask(GFP_IOFS); 340 pm_restrict_gfp_mask();
342 error = dpm_suspend_start(PMSG_FREEZE); 341 error = dpm_suspend_start(PMSG_FREEZE);
343 if (error) 342 if (error)
344 goto Recover_platform; 343 goto Recover_platform;
@@ -347,7 +346,10 @@ int hibernation_snapshot(int platform_mode)
347 goto Recover_platform; 346 goto Recover_platform;
348 347
349 error = create_image(platform_mode); 348 error = create_image(platform_mode);
350 /* Control returns here after successful restore */ 349 /*
350 * Control returns here (1) after the image has been created or the
351 * image creation has failed and (2) after a successful restore.
352 */
351 353
352 Resume_devices: 354 Resume_devices:
353 /* We may need to release the preallocated image pages here. */ 355 /* We may need to release the preallocated image pages here. */
@@ -356,7 +358,10 @@ int hibernation_snapshot(int platform_mode)
356 358
357 dpm_resume_end(in_suspend ? 359 dpm_resume_end(in_suspend ?
358 (error ? PMSG_RECOVER : PMSG_THAW) : PMSG_RESTORE); 360 (error ? PMSG_RECOVER : PMSG_THAW) : PMSG_RESTORE);
359 set_gfp_allowed_mask(saved_mask); 361
362 if (error || !in_suspend)
363 pm_restore_gfp_mask();
364
360 resume_console(); 365 resume_console();
361 Close: 366 Close:
362 platform_end(platform_mode); 367 platform_end(platform_mode);
@@ -451,17 +456,16 @@ static int resume_target_kernel(bool platform_mode)
451int hibernation_restore(int platform_mode) 456int hibernation_restore(int platform_mode)
452{ 457{
453 int error; 458 int error;
454 gfp_t saved_mask;
455 459
456 pm_prepare_console(); 460 pm_prepare_console();
457 suspend_console(); 461 suspend_console();
458 saved_mask = clear_gfp_allowed_mask(GFP_IOFS); 462 pm_restrict_gfp_mask();
459 error = dpm_suspend_start(PMSG_QUIESCE); 463 error = dpm_suspend_start(PMSG_QUIESCE);
460 if (!error) { 464 if (!error) {
461 error = resume_target_kernel(platform_mode); 465 error = resume_target_kernel(platform_mode);
462 dpm_resume_end(PMSG_RECOVER); 466 dpm_resume_end(PMSG_RECOVER);
463 } 467 }
464 set_gfp_allowed_mask(saved_mask); 468 pm_restore_gfp_mask();
465 resume_console(); 469 resume_console();
466 pm_restore_console(); 470 pm_restore_console();
467 return error; 471 return error;
@@ -475,7 +479,6 @@ int hibernation_restore(int platform_mode)
475int hibernation_platform_enter(void) 479int hibernation_platform_enter(void)
476{ 480{
477 int error; 481 int error;
478 gfp_t saved_mask;
479 482
480 if (!hibernation_ops) 483 if (!hibernation_ops)
481 return -ENOSYS; 484 return -ENOSYS;
@@ -491,7 +494,6 @@ int hibernation_platform_enter(void)
491 494
492 entering_platform_hibernation = true; 495 entering_platform_hibernation = true;
493 suspend_console(); 496 suspend_console();
494 saved_mask = clear_gfp_allowed_mask(GFP_IOFS);
495 error = dpm_suspend_start(PMSG_HIBERNATE); 497 error = dpm_suspend_start(PMSG_HIBERNATE);
496 if (error) { 498 if (error) {
497 if (hibernation_ops->recover) 499 if (hibernation_ops->recover)
@@ -535,7 +537,6 @@ int hibernation_platform_enter(void)
535 Resume_devices: 537 Resume_devices:
536 entering_platform_hibernation = false; 538 entering_platform_hibernation = false;
537 dpm_resume_end(PMSG_RESTORE); 539 dpm_resume_end(PMSG_RESTORE);
538 set_gfp_allowed_mask(saved_mask);
539 resume_console(); 540 resume_console();
540 541
541 Close: 542 Close:
@@ -643,6 +644,7 @@ int hibernate(void)
643 swsusp_free(); 644 swsusp_free();
644 if (!error) 645 if (!error)
645 power_down(); 646 power_down();
647 pm_restore_gfp_mask();
646 } else { 648 } else {
647 pr_debug("PM: Image restored successfully.\n"); 649 pr_debug("PM: Image restored successfully.\n");
648 } 650 }
diff --git a/kernel/power/suspend.c b/kernel/power/suspend.c
index 7335952ee473..ecf770509d0d 100644
--- a/kernel/power/suspend.c
+++ b/kernel/power/suspend.c
@@ -197,7 +197,6 @@ static int suspend_enter(suspend_state_t state)
197int suspend_devices_and_enter(suspend_state_t state) 197int suspend_devices_and_enter(suspend_state_t state)
198{ 198{
199 int error; 199 int error;
200 gfp_t saved_mask;
201 200
202 if (!suspend_ops) 201 if (!suspend_ops)
203 return -ENOSYS; 202 return -ENOSYS;
@@ -208,7 +207,7 @@ int suspend_devices_and_enter(suspend_state_t state)
208 goto Close; 207 goto Close;
209 } 208 }
210 suspend_console(); 209 suspend_console();
211 saved_mask = clear_gfp_allowed_mask(GFP_IOFS); 210 pm_restrict_gfp_mask();
212 suspend_test_start(); 211 suspend_test_start();
213 error = dpm_suspend_start(PMSG_SUSPEND); 212 error = dpm_suspend_start(PMSG_SUSPEND);
214 if (error) { 213 if (error) {
@@ -225,7 +224,7 @@ int suspend_devices_and_enter(suspend_state_t state)
225 suspend_test_start(); 224 suspend_test_start();
226 dpm_resume_end(PMSG_RESUME); 225 dpm_resume_end(PMSG_RESUME);
227 suspend_test_finish("resume devices"); 226 suspend_test_finish("resume devices");
228 set_gfp_allowed_mask(saved_mask); 227 pm_restore_gfp_mask();
229 resume_console(); 228 resume_console();
230 Close: 229 Close:
231 if (suspend_ops->end) 230 if (suspend_ops->end)
diff --git a/kernel/power/user.c b/kernel/power/user.c
index e819e17877ca..c36c3b9e8a84 100644
--- a/kernel/power/user.c
+++ b/kernel/power/user.c
@@ -137,7 +137,7 @@ static int snapshot_release(struct inode *inode, struct file *filp)
137 free_all_swap_pages(data->swap); 137 free_all_swap_pages(data->swap);
138 if (data->frozen) 138 if (data->frozen)
139 thaw_processes(); 139 thaw_processes();
140 pm_notifier_call_chain(data->mode == O_WRONLY ? 140 pm_notifier_call_chain(data->mode == O_RDONLY ?
141 PM_POST_HIBERNATION : PM_POST_RESTORE); 141 PM_POST_HIBERNATION : PM_POST_RESTORE);
142 atomic_inc(&snapshot_device_available); 142 atomic_inc(&snapshot_device_available);
143 143
@@ -263,6 +263,7 @@ static long snapshot_ioctl(struct file *filp, unsigned int cmd,
263 case SNAPSHOT_UNFREEZE: 263 case SNAPSHOT_UNFREEZE:
264 if (!data->frozen || data->ready) 264 if (!data->frozen || data->ready)
265 break; 265 break;
266 pm_restore_gfp_mask();
266 thaw_processes(); 267 thaw_processes();
267 usermodehelper_enable(); 268 usermodehelper_enable();
268 data->frozen = 0; 269 data->frozen = 0;
@@ -275,6 +276,7 @@ static long snapshot_ioctl(struct file *filp, unsigned int cmd,
275 error = -EPERM; 276 error = -EPERM;
276 break; 277 break;
277 } 278 }
279 pm_restore_gfp_mask();
278 error = hibernation_snapshot(data->platform_support); 280 error = hibernation_snapshot(data->platform_support);
279 if (!error) 281 if (!error)
280 error = put_user(in_suspend, (int __user *)arg); 282 error = put_user(in_suspend, (int __user *)arg);