|
@@ -40,6 +40,7 @@ static int try_to_freeze_tasks(bool sig_only)
|
|
|
struct timeval start, end;
|
|
|
u64 elapsed_csecs64;
|
|
|
unsigned int elapsed_csecs;
|
|
|
+ bool wakeup = false;
|
|
|
|
|
|
do_gettimeofday(&start);
|
|
|
|
|
@@ -78,6 +79,11 @@ static int try_to_freeze_tasks(bool sig_only)
|
|
|
if (!todo || time_after(jiffies, end_time))
|
|
|
break;
|
|
|
|
|
|
+ if (!pm_check_wakeup_events()) {
|
|
|
+ wakeup = true;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+
|
|
|
/*
|
|
|
* We need to retry, but first give the freezing tasks some
|
|
|
* time to enter the regrigerator.
|
|
@@ -97,8 +103,9 @@ static int try_to_freeze_tasks(bool sig_only)
|
|
|
* but it cleans up leftover PF_FREEZE requests.
|
|
|
*/
|
|
|
printk("\n");
|
|
|
- printk(KERN_ERR "Freezing of tasks failed after %d.%02d seconds "
|
|
|
+ printk(KERN_ERR "Freezing of tasks %s after %d.%02d seconds "
|
|
|
"(%d tasks refusing to freeze, wq_busy=%d):\n",
|
|
|
+ wakeup ? "aborted" : "failed",
|
|
|
elapsed_csecs / 100, elapsed_csecs % 100,
|
|
|
todo - wq_busy, wq_busy);
|
|
|
|
|
@@ -107,7 +114,7 @@ static int try_to_freeze_tasks(bool sig_only)
|
|
|
read_lock(&tasklist_lock);
|
|
|
do_each_thread(g, p) {
|
|
|
task_lock(p);
|
|
|
- if (freezing(p) && !freezer_should_skip(p))
|
|
|
+ if (!wakeup && freezing(p) && !freezer_should_skip(p))
|
|
|
sched_show_task(p);
|
|
|
cancel_freezing(p);
|
|
|
task_unlock(p);
|