aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJulius Werner <jwerner@chromium.org>2013-06-12 15:55:22 -0400
committerRafael J. Wysocki <rafael.j.wysocki@intel.com>2013-06-20 18:35:12 -0400
commitbb177fedd348c92c2bea6adc9a2163ebff15272e (patch)
tree85a9ea53b0a15f56bbb0427adbdd85002b0a3265
parentd24c2a4f919d17bd1ae4f4010a38ab07ece99cf7 (diff)
PM / Sleep: Print last wakeup source on failed wakeup_count write
Commit a938da06 introduced a useful little log message to tell users/debuggers which wakeup source aborted a suspend. However, this message is only printed if the abort happens during the in-kernel suspend path (after writing /sys/power/state). The full specification of the /sys/power/wakeup_count facility allows user-space power managers to double-check if wakeups have already happened before it actually tries to suspend (e.g. while it was running user-space pre-suspend hooks), by writing the last known wakeup_count value to /sys/power/wakeup_count. This patch changes the sysfs handler for that node to also print said log message if that write fails, so that we can figure out the offending wakeup source for both kinds of suspend aborts. Signed-off-by: Julius Werner <jwerner@chromium.org> Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
-rw-r--r--drivers/base/power/wakeup.c5
-rw-r--r--include/linux/suspend.h1
-rw-r--r--kernel/power/main.c2
3 files changed, 6 insertions, 2 deletions
diff --git a/drivers/base/power/wakeup.c b/drivers/base/power/wakeup.c
index 407a2efa10bb..2d56f4113ae7 100644
--- a/drivers/base/power/wakeup.c
+++ b/drivers/base/power/wakeup.c
@@ -659,7 +659,7 @@ void pm_wakeup_event(struct device *dev, unsigned int msec)
659} 659}
660EXPORT_SYMBOL_GPL(pm_wakeup_event); 660EXPORT_SYMBOL_GPL(pm_wakeup_event);
661 661
662static void print_active_wakeup_sources(void) 662void pm_print_active_wakeup_sources(void)
663{ 663{
664 struct wakeup_source *ws; 664 struct wakeup_source *ws;
665 int active = 0; 665 int active = 0;
@@ -683,6 +683,7 @@ static void print_active_wakeup_sources(void)
683 last_activity_ws->name); 683 last_activity_ws->name);
684 rcu_read_unlock(); 684 rcu_read_unlock();
685} 685}
686EXPORT_SYMBOL_GPL(pm_print_active_wakeup_sources);
686 687
687/** 688/**
688 * pm_wakeup_pending - Check if power transition in progress should be aborted. 689 * pm_wakeup_pending - Check if power transition in progress should be aborted.
@@ -709,7 +710,7 @@ bool pm_wakeup_pending(void)
709 710
710 if (ret) { 711 if (ret) {
711 pr_info("PM: Wakeup pending, aborting suspend\n"); 712 pr_info("PM: Wakeup pending, aborting suspend\n");
712 print_active_wakeup_sources(); 713 pm_print_active_wakeup_sources();
713 } 714 }
714 715
715 return ret; 716 return ret;
diff --git a/include/linux/suspend.h b/include/linux/suspend.h
index d4e3f16d5e89..f73cabf59012 100644
--- a/include/linux/suspend.h
+++ b/include/linux/suspend.h
@@ -363,6 +363,7 @@ extern bool pm_wakeup_pending(void);
363extern bool pm_get_wakeup_count(unsigned int *count, bool block); 363extern bool pm_get_wakeup_count(unsigned int *count, bool block);
364extern bool pm_save_wakeup_count(unsigned int count); 364extern bool pm_save_wakeup_count(unsigned int count);
365extern void pm_wakep_autosleep_enabled(bool set); 365extern void pm_wakep_autosleep_enabled(bool set);
366extern void pm_print_active_wakeup_sources(void);
366 367
367static inline void lock_system_sleep(void) 368static inline void lock_system_sleep(void)
368{ 369{
diff --git a/kernel/power/main.c b/kernel/power/main.c
index d77663bfedeb..0828070d38b4 100644
--- a/kernel/power/main.c
+++ b/kernel/power/main.c
@@ -424,6 +424,8 @@ static ssize_t wakeup_count_store(struct kobject *kobj,
424 if (sscanf(buf, "%u", &val) == 1) { 424 if (sscanf(buf, "%u", &val) == 1) {
425 if (pm_save_wakeup_count(val)) 425 if (pm_save_wakeup_count(val))
426 error = n; 426 error = n;
427 else
428 pm_print_active_wakeup_sources();
427 } 429 }
428 430
429 out: 431 out: