| From e5248a111bf4048a9f3fab1a9c94c4630a10592a Mon Sep 17 00:00:00 2001 |
| From: Liu ShuoX <shuox.liu@intel.com> |
| Date: Thu, 11 Jul 2013 16:03:45 +0800 |
| Subject: PM / Sleep: avoid 'autosleep' in shutdown progress |
| |
| From: Liu ShuoX <shuox.liu@intel.com> |
| |
| commit e5248a111bf4048a9f3fab1a9c94c4630a10592a upstream. |
| |
| Prevent automatic system suspend from happening during system |
| shutdown by making try_to_suspend() check system_state and return |
| immediately if it is not SYSTEM_RUNNING. |
| |
| This prevents the following breakage from happening (scenario from |
| Zhang Yanmin): |
| |
| Kernel starts shutdown and calls all device driver's shutdown |
| callback. When a driver's shutdown is called, the last wakelock is |
| released and suspend-to-ram starts. However, as some driver's shut |
| down callbacks already shut down devices and disabled runtime pm, |
| the suspend-to-ram calls driver's suspend callback without noticing |
| that device is already off and causes crash. |
| |
| [rjw: Changelog] |
| Signed-off-by: Liu ShuoX <shuox.liu@intel.com> |
| Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| kernel/power/autosleep.c | 3 ++- |
| 1 file changed, 2 insertions(+), 1 deletion(-) |
| |
| --- a/kernel/power/autosleep.c |
| +++ b/kernel/power/autosleep.c |
| @@ -32,7 +32,8 @@ static void try_to_suspend(struct work_s |
| |
| mutex_lock(&autosleep_lock); |
| |
| - if (!pm_save_wakeup_count(initial_count)) { |
| + if (!pm_save_wakeup_count(initial_count) || |
| + system_state != SYSTEM_RUNNING) { |
| mutex_unlock(&autosleep_lock); |
| goto out; |
| } |