diff options
author | Liu ShuoX <shuox.liu@intel.com> | 2013-07-11 04:03:45 -0400 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2013-07-28 19:30:21 -0400 |
commit | 7b4fc5f531f64ce52e5f421c9bc285ccf30ccac8 (patch) | |
tree | f0fae005463896cef70316e73cd5151ef906307e /kernel | |
parent | c07ae685f761d7b6850f502a34964005428c181a (diff) |
PM / Sleep: avoid 'autosleep' in shutdown progress
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>
Diffstat (limited to 'kernel')
-rw-r--r-- | kernel/power/autosleep.c | 3 |
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 | } |