mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-08-24 01:41:39 +00:00
PM / freezer: Don't get over-anxious while waiting
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>
This commit is contained in:
parent
964fe080d9
commit
be404f0212
1 changed files with 10 additions and 4 deletions
|
@ -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);
|
||||
|
|
Loading…
Reference in a new issue