aboutsummaryrefslogtreecommitdiffstats
path: root/kernel/power/autosleep.c
diff options
context:
space:
mode:
authorLiu ShuoX <shuox.liu@intel.com>2013-07-11 04:03:45 -0400
committerRafael J. Wysocki <rafael.j.wysocki@intel.com>2013-07-14 19:31:37 -0400
commite5248a111bf4048a9f3fab1a9c94c4630a10592a (patch)
tree8d69fdd878f0c78e87bdd9c5d561b1e241bc6527 /kernel/power/autosleep.c
parentaae760ed21cd690fe8a6db9f3a177ad55d7e12ab (diff)
PM / Sleep: avoid 'autosleep' in shutdown progress
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> Cc: 3.5+ <stable@vger.kernel.org> Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
Diffstat (limited to 'kernel/power/autosleep.c')
-rw-r--r--kernel/power/autosleep.c3
1 files changed, 2 insertions, 1 deletions
diff --git a/kernel/power/autosleep.c b/kernel/power/autosleep.c
index c6422ffeda9a..9012ecf7b814 100644
--- a/kernel/power/autosleep.c
+++ b/kernel/power/autosleep.c
@@ -32,7 +32,8 @@ static void try_to_suspend(struct work_struct *work)
32 32
33 mutex_lock(&autosleep_lock); 33 mutex_lock(&autosleep_lock);
34 34
35 if (!pm_save_wakeup_count(initial_count)) { 35 if (!pm_save_wakeup_count(initial_count) ||
36 system_state != SYSTEM_RUNNING) {
36 mutex_unlock(&autosleep_lock); 37 mutex_unlock(&autosleep_lock);
37 goto out; 38 goto out;
38 } 39 }