| From 246ef766743618a7cab059d6c4993270075b173e Mon Sep 17 00:00:00 2001 |
| From: Imre Deak <imre.deak@intel.com> |
| Date: Fri, 24 Oct 2014 20:29:09 +0300 |
| Subject: PM / Sleep: fix async suspend_late/freeze_late error handling |
| |
| From: Imre Deak <imre.deak@intel.com> |
| |
| commit 246ef766743618a7cab059d6c4993270075b173e upstream. |
| |
| If an asynchronous suspend_late or freeze_late callback fails |
| during the SUSPEND, FREEZE or QUIESCE phases, we don't propagate the |
| corresponding error correctly, in effect ignoring the error and |
| continuing the suspend-to-ram/hibernation. During suspend-to-ram this |
| could leave some devices without a valid saved context, leading to a |
| failure to reinitialize them during resume. During hibernation this |
| could leave some devices active interfeering with the creation / |
| restoration of the hibernation image. Also this could leave the |
| corresponding devices without a valid saved context and failure to |
| reinitialize them during resume. |
| |
| Fixes: de377b397272 (PM / sleep: Asynchronous threads for suspend_late) |
| Signed-off-by: Imre Deak <imre.deak@intel.com> |
| Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| drivers/base/power/main.c | 2 ++ |
| 1 file changed, 2 insertions(+) |
| |
| --- a/drivers/base/power/main.c |
| +++ b/drivers/base/power/main.c |
| @@ -1266,6 +1266,8 @@ static int dpm_suspend_late(pm_message_t |
| } |
| mutex_unlock(&dpm_list_mtx); |
| async_synchronize_full(); |
| + if (!error) |
| + error = async_error; |
| if (error) { |
| suspend_stats.failed_suspend_late++; |
| dpm_save_failed_step(SUSPEND_SUSPEND_LATE); |