diff options
author | Rafael J. Wysocki <rafael.j.wysocki@intel.com> | 2014-09-01 07:47:49 -0400 |
---|---|---|
committer | Rafael J. Wysocki <rafael.j.wysocki@intel.com> | 2014-09-01 07:47:49 -0400 |
commit | 068765ba7987e73d4381edfe47b70aa121c7155c (patch) | |
tree | 021926eb2535caa0ee30d8bf031b74493aa51b84 | |
parent | 69e273c0b0a3c337a521d083374c918dc52c666f (diff) |
PM / sleep: Mechanism for aborting system suspends unconditionally
It sometimes may be necessary to abort a system suspend in
progress or wake up the system from suspend-to-idle even if the
pm_wakeup_event()/pm_stay_awake() mechanism is not enabled.
For this purpose, introduce a new global variable pm_abort_suspend
and make pm_wakeup_pending() check its value. Also add routines
for manipulating that variable.
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
-rw-r--r-- | drivers/base/power/wakeup.c | 16 | ||||
-rw-r--r-- | include/linux/suspend.h | 4 | ||||
-rw-r--r-- | kernel/power/process.c | 1 |
3 files changed, 20 insertions, 1 deletions
diff --git a/drivers/base/power/wakeup.c b/drivers/base/power/wakeup.c index eb1bd2ecad8b..c2744b30d5d9 100644 --- a/drivers/base/power/wakeup.c +++ b/drivers/base/power/wakeup.c | |||
@@ -24,6 +24,9 @@ | |||
24 | */ | 24 | */ |
25 | bool events_check_enabled __read_mostly; | 25 | bool events_check_enabled __read_mostly; |
26 | 26 | ||
27 | /* If set and the system is suspending, terminate the suspend. */ | ||
28 | static bool pm_abort_suspend __read_mostly; | ||
29 | |||
27 | /* | 30 | /* |
28 | * Combined counters of registered wakeup events and wakeup events in progress. | 31 | * Combined counters of registered wakeup events and wakeup events in progress. |
29 | * They need to be modified together atomically, so it's better to use one | 32 | * They need to be modified together atomically, so it's better to use one |
@@ -719,7 +722,18 @@ bool pm_wakeup_pending(void) | |||
719 | pm_print_active_wakeup_sources(); | 722 | pm_print_active_wakeup_sources(); |
720 | } | 723 | } |
721 | 724 | ||
722 | return ret; | 725 | return ret || pm_abort_suspend; |
726 | } | ||
727 | |||
728 | void pm_system_wakeup(void) | ||
729 | { | ||
730 | pm_abort_suspend = true; | ||
731 | freeze_wake(); | ||
732 | } | ||
733 | |||
734 | void pm_wakeup_clear(void) | ||
735 | { | ||
736 | pm_abort_suspend = false; | ||
723 | } | 737 | } |
724 | 738 | ||
725 | /** | 739 | /** |
diff --git a/include/linux/suspend.h b/include/linux/suspend.h index 519064e0c943..06a9910827c2 100644 --- a/include/linux/suspend.h +++ b/include/linux/suspend.h | |||
@@ -371,6 +371,8 @@ extern int unregister_pm_notifier(struct notifier_block *nb); | |||
371 | extern bool events_check_enabled; | 371 | extern bool events_check_enabled; |
372 | 372 | ||
373 | extern bool pm_wakeup_pending(void); | 373 | extern bool pm_wakeup_pending(void); |
374 | extern void pm_system_wakeup(void); | ||
375 | extern void pm_wakeup_clear(void); | ||
374 | extern bool pm_get_wakeup_count(unsigned int *count, bool block); | 376 | extern bool pm_get_wakeup_count(unsigned int *count, bool block); |
375 | extern bool pm_save_wakeup_count(unsigned int count); | 377 | extern bool pm_save_wakeup_count(unsigned int count); |
376 | extern void pm_wakep_autosleep_enabled(bool set); | 378 | extern void pm_wakep_autosleep_enabled(bool set); |
@@ -418,6 +420,8 @@ static inline int unregister_pm_notifier(struct notifier_block *nb) | |||
418 | #define pm_notifier(fn, pri) do { (void)(fn); } while (0) | 420 | #define pm_notifier(fn, pri) do { (void)(fn); } while (0) |
419 | 421 | ||
420 | static inline bool pm_wakeup_pending(void) { return false; } | 422 | static inline bool pm_wakeup_pending(void) { return false; } |
423 | static inline void pm_system_wakeup(void) {} | ||
424 | static inline void pm_wakeup_clear(void) {} | ||
421 | 425 | ||
422 | static inline void lock_system_sleep(void) {} | 426 | static inline void lock_system_sleep(void) {} |
423 | static inline void unlock_system_sleep(void) {} | 427 | static inline void unlock_system_sleep(void) {} |
diff --git a/kernel/power/process.c b/kernel/power/process.c index 4ee194eb524b..7b323221b9ee 100644 --- a/kernel/power/process.c +++ b/kernel/power/process.c | |||
@@ -129,6 +129,7 @@ int freeze_processes(void) | |||
129 | if (!pm_freezing) | 129 | if (!pm_freezing) |
130 | atomic_inc(&system_freezing_cnt); | 130 | atomic_inc(&system_freezing_cnt); |
131 | 131 | ||
132 | pm_wakeup_clear(); | ||
132 | printk("Freezing user space processes ... "); | 133 | printk("Freezing user space processes ... "); |
133 | pm_freezing = true; | 134 | pm_freezing = true; |
134 | error = try_to_freeze_tasks(true); | 135 | error = try_to_freeze_tasks(true); |