diff options
Diffstat (limited to 'kernel/power/hibernate.c')
| -rw-r--r-- | kernel/power/hibernate.c | 21 |
1 files changed, 14 insertions, 7 deletions
diff --git a/kernel/power/hibernate.c b/kernel/power/hibernate.c index 81d2e7464893..04b3a83d686f 100644 --- a/kernel/power/hibernate.c +++ b/kernel/power/hibernate.c | |||
| @@ -298,8 +298,8 @@ int hibernation_snapshot(int platform_mode) | |||
| 298 | if (error) | 298 | if (error) |
| 299 | return error; | 299 | return error; |
| 300 | 300 | ||
| 301 | /* Free memory before shutting down devices. */ | 301 | /* Preallocate image memory before shutting down devices. */ |
| 302 | error = swsusp_shrink_memory(); | 302 | error = hibernate_preallocate_memory(); |
| 303 | if (error) | 303 | if (error) |
| 304 | goto Close; | 304 | goto Close; |
| 305 | 305 | ||
| @@ -315,6 +315,10 @@ int hibernation_snapshot(int platform_mode) | |||
| 315 | /* Control returns here after successful restore */ | 315 | /* Control returns here after successful restore */ |
| 316 | 316 | ||
| 317 | Resume_devices: | 317 | Resume_devices: |
| 318 | /* We may need to release the preallocated image pages here. */ | ||
| 319 | if (error || !in_suspend) | ||
| 320 | swsusp_free(); | ||
| 321 | |||
| 318 | dpm_resume_end(in_suspend ? | 322 | dpm_resume_end(in_suspend ? |
| 319 | (error ? PMSG_RECOVER : PMSG_THAW) : PMSG_RESTORE); | 323 | (error ? PMSG_RECOVER : PMSG_THAW) : PMSG_RESTORE); |
| 320 | resume_console(); | 324 | resume_console(); |
| @@ -460,11 +464,11 @@ int hibernation_platform_enter(void) | |||
| 460 | 464 | ||
| 461 | error = hibernation_ops->prepare(); | 465 | error = hibernation_ops->prepare(); |
| 462 | if (error) | 466 | if (error) |
| 463 | goto Platofrm_finish; | 467 | goto Platform_finish; |
| 464 | 468 | ||
| 465 | error = disable_nonboot_cpus(); | 469 | error = disable_nonboot_cpus(); |
| 466 | if (error) | 470 | if (error) |
| 467 | goto Platofrm_finish; | 471 | goto Platform_finish; |
| 468 | 472 | ||
| 469 | local_irq_disable(); | 473 | local_irq_disable(); |
| 470 | sysdev_suspend(PMSG_HIBERNATE); | 474 | sysdev_suspend(PMSG_HIBERNATE); |
| @@ -476,7 +480,7 @@ int hibernation_platform_enter(void) | |||
| 476 | * We don't need to reenable the nonboot CPUs or resume consoles, since | 480 | * We don't need to reenable the nonboot CPUs or resume consoles, since |
| 477 | * the system is going to be halted anyway. | 481 | * the system is going to be halted anyway. |
| 478 | */ | 482 | */ |
| 479 | Platofrm_finish: | 483 | Platform_finish: |
| 480 | hibernation_ops->finish(); | 484 | hibernation_ops->finish(); |
| 481 | 485 | ||
| 482 | dpm_suspend_noirq(PMSG_RESTORE); | 486 | dpm_suspend_noirq(PMSG_RESTORE); |
| @@ -578,7 +582,10 @@ int hibernate(void) | |||
| 578 | goto Thaw; | 582 | goto Thaw; |
| 579 | 583 | ||
| 580 | error = hibernation_snapshot(hibernation_mode == HIBERNATION_PLATFORM); | 584 | error = hibernation_snapshot(hibernation_mode == HIBERNATION_PLATFORM); |
| 581 | if (in_suspend && !error) { | 585 | if (error) |
| 586 | goto Thaw; | ||
| 587 | |||
| 588 | if (in_suspend) { | ||
| 582 | unsigned int flags = 0; | 589 | unsigned int flags = 0; |
| 583 | 590 | ||
| 584 | if (hibernation_mode == HIBERNATION_PLATFORM) | 591 | if (hibernation_mode == HIBERNATION_PLATFORM) |
| @@ -590,8 +597,8 @@ int hibernate(void) | |||
| 590 | power_down(); | 597 | power_down(); |
| 591 | } else { | 598 | } else { |
| 592 | pr_debug("PM: Image restored successfully.\n"); | 599 | pr_debug("PM: Image restored successfully.\n"); |
| 593 | swsusp_free(); | ||
| 594 | } | 600 | } |
| 601 | |||
| 595 | Thaw: | 602 | Thaw: |
| 596 | thaw_processes(); | 603 | thaw_processes(); |
| 597 | Finish: | 604 | Finish: |
