diff options
Diffstat (limited to 'kernel/power')
-rw-r--r-- | kernel/power/hibernate.c | 22 | ||||
-rw-r--r-- | kernel/power/suspend.c | 5 | ||||
-rw-r--r-- | kernel/power/user.c | 4 |
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) | |||
326 | int hibernation_snapshot(int platform_mode) | 326 | int 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) | |||
451 | int hibernation_restore(int platform_mode) | 456 | int 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) | |||
475 | int hibernation_platform_enter(void) | 479 | int 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) | |||
197 | int suspend_devices_and_enter(suspend_state_t state) | 197 | int 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); |