|
@@ -91,11 +91,6 @@ static int try_to_freeze_tasks(bool sig_only)
|
|
|
elapsed_csecs = elapsed_csecs64;
|
|
|
|
|
|
if (todo) {
|
|
|
- /* This does not unfreeze processes that are already frozen
|
|
|
- * (we have slightly ugly calling convention in that respect,
|
|
|
- * 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 %s after %d.%02d seconds "
|
|
|
"(%d tasks refusing to freeze, wq_busy=%d):\n",
|
|
@@ -103,14 +98,11 @@ static int try_to_freeze_tasks(bool sig_only)
|
|
|
elapsed_csecs / 100, elapsed_csecs % 100,
|
|
|
todo - wq_busy, wq_busy);
|
|
|
|
|
|
- thaw_workqueues();
|
|
|
-
|
|
|
read_lock(&tasklist_lock);
|
|
|
do_each_thread(g, p) {
|
|
|
if (!wakeup && !freezer_should_skip(p) &&
|
|
|
freezing(p) && !frozen(p))
|
|
|
sched_show_task(p);
|
|
|
- cancel_freezing(p);
|
|
|
} while_each_thread(g, p);
|
|
|
read_unlock(&tasklist_lock);
|
|
|
} else {
|
|
@@ -123,6 +115,8 @@ static int try_to_freeze_tasks(bool sig_only)
|
|
|
|
|
|
/**
|
|
|
* freeze_processes - Signal user space processes to enter the refrigerator.
|
|
|
+ *
|
|
|
+ * On success, returns 0. On failure, -errno and system is fully thawed.
|
|
|
*/
|
|
|
int freeze_processes(void)
|
|
|
{
|
|
@@ -137,11 +131,15 @@ int freeze_processes(void)
|
|
|
printk("\n");
|
|
|
BUG_ON(in_atomic());
|
|
|
|
|
|
+ if (error)
|
|
|
+ thaw_processes();
|
|
|
return error;
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* freeze_kernel_threads - Make freezable kernel threads go to the refrigerator.
|
|
|
+ *
|
|
|
+ * On success, returns 0. On failure, -errno and system is fully thawed.
|
|
|
*/
|
|
|
int freeze_kernel_threads(void)
|
|
|
{
|
|
@@ -155,6 +153,8 @@ int freeze_kernel_threads(void)
|
|
|
printk("\n");
|
|
|
BUG_ON(in_atomic());
|
|
|
|
|
|
+ if (error)
|
|
|
+ thaw_processes();
|
|
|
return error;
|
|
|
}
|
|
|
|