If a wakelock is locked, suspend will fail anyway. Since try_to_freeze_taskscan take up to 20 seconds to complete or fail, aborting as soon as someonelocks a wakelock (e.g. from an interrupt handler) improves the worst casewakeup latency. On an older kernel where task freezing could fail for processes attachedto a debugger, this fixed a problem where the device sometimes hung for20 seconds before the screen turned on. Signed-off-by: Arve Hjønnevåg <arve@xxxxxxxxxxx>--- kernel/power/process.c | 22 +++++++++++++++++----- 1 files changed, 17 insertions(+), 5 deletions(-) diff --git a/kernel/power/process.c b/kernel/power/process.cindex ca63401..8388d01 100644--- a/kernel/power/process.c+++ b/kernel/power/process.c@@ -13,6 +13,7 @@ #include <linux/module.h> #include <linux/syscalls.h> #include <linux/freezer.h>+#include <linux/wakelock.h> /* * Timeout for stopping processes@@ -36,6 +37,7 @@ static int try_to_freeze_tasks(bool sig_only) struct timeval start, end; u64 elapsed_csecs64; unsigned int elapsed_csecs;+ unsigned int wakeup = 0; do_gettimeofday(&start); @@ -62,6 +64,10 @@ static int try_to_freeze_tasks(bool sig_only) } while_each_thread(g, p); read_unlock(&tasklist_lock); yield(); /* Yield is okay here */+ if (todo && has_wake_lock(WAKE_LOCK_SUSPEND)) {+ wakeup = 1;+ break;+ } if (time_after(jiffies, end_time)) break; } while (todo);@@ -77,11 +83,17 @@ static int try_to_freeze_tasks(bool sig_only) * and caller must call thaw_processes() if something fails), * but it cleans up leftover PF_FREEZE requests. */- printk("\n");- printk(KERN_ERR "Freezing of tasks failed after %d.%02d seconds "- "(%d tasks refusing to freeze):\n",- elapsed_csecs / 100, elapsed_csecs % 100, todo);- show_state();+ if (wakeup) {+ printk("\n");+ printk(KERN_ERR "Freezing of %s aborted\n",+ sig_only ? "user space " : "tasks ");+ } else {+ printk("\n");+ printk(KERN_ERR "Freezing of tasks failed after %d.%02d seconds "+ "(%d tasks refusing to freeze):\n",+ elapsed_csecs / 100, elapsed_csecs % 100, todo);+ show_state();+ } read_lock(&tasklist_lock); do_each_thread(g, p) { task_lock(p);-- 1.6.1 _______________________________________________linux-pm mailing listlinux-pm@xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx://lists.linux-foundation.org/mailman/listinfo/linux-pm