diff options
Diffstat (limited to 'kernel/power/process.c')
-rw-r--r-- | kernel/power/process.c | 27 |
1 files changed, 19 insertions, 8 deletions
diff --git a/kernel/power/process.c b/kernel/power/process.c index 0cf3a27a6c9..31338cdeafc 100644 --- a/kernel/power/process.c +++ b/kernel/power/process.c | |||
@@ -16,6 +16,7 @@ | |||
16 | #include <linux/freezer.h> | 16 | #include <linux/freezer.h> |
17 | #include <linux/delay.h> | 17 | #include <linux/delay.h> |
18 | #include <linux/workqueue.h> | 18 | #include <linux/workqueue.h> |
19 | #include <linux/wakelock.h> | ||
19 | 20 | ||
20 | /* | 21 | /* |
21 | * Timeout for stopping processes | 22 | * Timeout for stopping processes |
@@ -82,6 +83,10 @@ static int try_to_freeze_tasks(bool sig_only) | |||
82 | todo += wq_busy; | 83 | todo += wq_busy; |
83 | } | 84 | } |
84 | 85 | ||
86 | if (todo && has_wake_lock(WAKE_LOCK_SUSPEND)) { | ||
87 | wakeup = 1; | ||
88 | break; | ||
89 | } | ||
85 | if (!todo || time_after(jiffies, end_time)) | 90 | if (!todo || time_after(jiffies, end_time)) |
86 | break; | 91 | break; |
87 | 92 | ||
@@ -108,19 +113,25 @@ static int try_to_freeze_tasks(bool sig_only) | |||
108 | * and caller must call thaw_processes() if something fails), | 113 | * and caller must call thaw_processes() if something fails), |
109 | * but it cleans up leftover PF_FREEZE requests. | 114 | * but it cleans up leftover PF_FREEZE requests. |
110 | */ | 115 | */ |
111 | printk("\n"); | 116 | if(wakeup) { |
112 | printk(KERN_ERR "Freezing of tasks %s after %d.%02d seconds " | 117 | printk("\n"); |
113 | "(%d tasks refusing to freeze, wq_busy=%d):\n", | 118 | printk(KERN_ERR "Freezing of %s aborted\n", |
114 | wakeup ? "aborted" : "failed", | 119 | sig_only ? "user space " : "tasks "); |
115 | elapsed_csecs / 100, elapsed_csecs % 100, | 120 | } |
116 | todo - wq_busy, wq_busy); | 121 | else { |
117 | 122 | printk("\n"); | |
123 | printk(KERN_ERR "Freezing of tasks failed after %d.%02d seconds " | ||
124 | "(%d tasks refusing to freeze, wq_busy=%d):\n", | ||
125 | elapsed_csecs / 100, elapsed_csecs % 100, | ||
126 | todo - wq_busy, wq_busy); | ||
127 | } | ||
118 | thaw_workqueues(); | 128 | thaw_workqueues(); |
119 | 129 | ||
120 | read_lock(&tasklist_lock); | 130 | read_lock(&tasklist_lock); |
121 | do_each_thread(g, p) { | 131 | do_each_thread(g, p) { |
122 | task_lock(p); | 132 | task_lock(p); |
123 | if (!wakeup && freezing(p) && !freezer_should_skip(p)) | 133 | if (freezing(p) && !freezer_should_skip(p) && |
134 | elapsed_csecs > 100) | ||
124 | sched_show_task(p); | 135 | sched_show_task(p); |
125 | cancel_freezing(p); | 136 | cancel_freezing(p); |
126 | task_unlock(p); | 137 | task_unlock(p); |