PM: wakelock: Abort task freezing if a wake lock is held.
authorArve Hjønnevåg <arve@android.com>
Tue, 14 Oct 2008 23:02:39 +0000 (16:02 -0700)
committerArve Hjønnevåg <arve@android.com>
Thu, 4 Feb 2010 05:27:06 +0000 (21:27 -0800)
Avoids a problem where the device sometimes hangs for 20 seconds
before the screen is turned on.

kernel/power/process.c

index cc2e55373b68cc3f32e83fbf036200c30a14f343..7b85cba64e6219b6439e1e46fdb245153fcf5135 100644 (file)
@@ -14,6 +14,7 @@
 #include <linux/module.h>
 #include <linux/syscalls.h>
 #include <linux/freezer.h>
+#include <linux/wakelock.h>
 
 /* 
  * Timeout for stopping processes
@@ -37,6 +38,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);
 
@@ -63,6 +65,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);
@@ -78,11 +84,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):\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);