65 lines
2.0 KiB
Diff
65 lines
2.0 KiB
Diff
|
From 3f8e407c418205252f00615da4d0182e8c960344 Mon Sep 17 00:00:00 2001
|
||
|
From: =?utf-8?q?Arve=20Hj=C3=B8nnev=C3=A5g?= <arve@android.com>
|
||
|
Date: Tue, 14 Oct 2008 16:02:39 -0700
|
||
|
Subject: [PATCH 070/134] 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.
|
||
|
---
|
||
|
kernel/power/process.c | 23 ++++++++++++++++++-----
|
||
|
1 files changed, 18 insertions(+), 5 deletions(-)
|
||
|
|
||
|
--- 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_
|
||
|
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_
|
||
|
} 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,18 @@ static int try_to_freeze_tasks(bool sig_
|
||
|
* 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);
|