mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-10 04:48:04 +09:00
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.
This commit is contained in:
committed by
Colin Cross
parent
507fedc715
commit
003cfdd042
@@ -16,6 +16,7 @@
|
||||
#include <linux/freezer.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/workqueue.h>
|
||||
#include <linux/wakelock.h>
|
||||
|
||||
/*
|
||||
* 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);
|
||||
|
||||
Reference in New Issue
Block a user