PM / freezer: Don't get over-anxious while waiting
authorTejun Heo <tj@kernel.org>
Thu, 8 Oct 2009 20:47:30 +0000 (22:47 +0200)
committerRafael J. Wysocki <rjw@sisk.pl>
Wed, 28 Oct 2009 21:53:09 +0000 (22:53 +0100)
Freezing isn't exactly the most latency sensitive operation and
there's no reason to burn cpu cycles and power waiting for it to
complete.  msleep(10) instead of yield().  This should improve
reliability of emergency hibernation.

[rjw: Modified the comment next to the msleep(10).]

Signed-off-by: Tejun Heo <tj@kernel.org>
Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl>
kernel/power/process.c

index cc2e55373b68cc3f32e83fbf036200c30a14f343..5ade1bdcf366a9e93789097ea99ba8aba9dceccc 100644 (file)
@@ -14,6 +14,7 @@
 #include <linux/module.h>
 #include <linux/syscalls.h>
 #include <linux/freezer.h>
+#include <linux/delay.h>
 
 /* 
  * Timeout for stopping processes
@@ -41,7 +42,7 @@ static int try_to_freeze_tasks(bool sig_only)
        do_gettimeofday(&start);
 
        end_time = jiffies + TIMEOUT;
-       do {
+       while (true) {
                todo = 0;
                read_lock(&tasklist_lock);
                do_each_thread(g, p) {
@@ -62,10 +63,15 @@ static int try_to_freeze_tasks(bool sig_only)
                                todo++;
                } while_each_thread(g, p);
                read_unlock(&tasklist_lock);
-               yield();                        /* Yield is okay here */
-               if (time_after(jiffies, end_time))
+               if (!todo || time_after(jiffies, end_time))
                        break;
-       } while (todo);
+
+               /*
+                * We need to retry, but first give the freezing tasks some
+                * time to enter the regrigerator.
+                */
+               msleep(10);
+       }
 
        do_gettimeofday(&end);
        elapsed_csecs64 = timeval_to_ns(&end) - timeval_to_ns(&start);