add the 'goldfish' target, useful for experimenting with virtual phone hardware ...
[openwrt/svn-archive/archive.git] / target / linux / goldfish / patches-2.6.30 / 0070-PM-wakelock-Abort-task-freezing-if-a-wake-lock-is.patch
diff --git a/target/linux/goldfish/patches-2.6.30/0070-PM-wakelock-Abort-task-freezing-if-a-wake-lock-is.patch b/target/linux/goldfish/patches-2.6.30/0070-PM-wakelock-Abort-task-freezing-if-a-wake-lock-is.patch
new file mode 100644 (file)
index 0000000..a93df9a
--- /dev/null
@@ -0,0 +1,64 @@
+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);