From: Arve Hjønnevåg Date: Tue, 14 Oct 2008 23:02:39 +0000 (-0700) Subject: PM: wakelock: Abort task freezing if a wake lock is held. X-Git-Tag: firefly_0821_release~9833^2~5^2~338 X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=003cfdd0422be92e4e88c8f07e03b5d8d0513455;p=firefly-linux-kernel-4.4.55.git PM: wakelock: Abort task freezing if a wake lock is held. Avoids a problem where the device sometimes hangs for 20 seconds before the screen is turned on. --- diff --git a/kernel/power/process.c b/kernel/power/process.c index 028a99598f49..48df784fcb7c 100644 --- a/kernel/power/process.c +++ b/kernel/power/process.c @@ -16,6 +16,7 @@ #include #include #include +#include /* * Timeout for stopping processes @@ -40,6 +41,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); @@ -75,6 +77,10 @@ static int try_to_freeze_tasks(bool sig_only) todo += wq_busy; } + if (todo && has_wake_lock(WAKE_LOCK_SUSPEND)) { + wakeup = 1; + break; + } if (!todo || time_after(jiffies, end_time)) break; @@ -96,12 +102,18 @@ 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, wq_busy=%d):\n", - elapsed_csecs / 100, elapsed_csecs % 100, - todo - wq_busy, wq_busy); - + 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, wq_busy=%d):\n", + elapsed_csecs / 100, elapsed_csecs % 100, + todo - wq_busy, wq_busy); + } thaw_workqueues(); read_lock(&tasklist_lock);