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