aboutsummaryrefslogtreecommitdiffstats
path: root/kernel/power
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/power')
-rw-r--r--kernel/power/process.c25
1 files changed, 18 insertions, 7 deletions
diff --git a/kernel/power/process.c b/kernel/power/process.c
index fedabad5a180..cba8a5890eda 100644
--- a/kernel/power/process.c
+++ b/kernel/power/process.c
@@ -153,18 +153,29 @@ int freeze_processes(void)
153 return 0; 153 return 0;
154} 154}
155 155
156void thaw_processes(void) 156void thaw_some_processes(int all)
157{ 157{
158 struct task_struct *g, *p; 158 struct task_struct *g, *p;
159 int pass = 0; /* Pass 0 = Kernel space, 1 = Userspace */
159 160
160 printk("Restarting tasks... "); 161 printk("Restarting tasks... ");
161 read_lock(&tasklist_lock); 162 read_lock(&tasklist_lock);
162 do_each_thread(g, p) { 163 do {
163 if (!freezeable(p)) 164 do_each_thread(g, p) {
164 continue; 165 /*
165 if (!thaw_process(p)) 166 * is_user = 0 if kernel thread or borrowed mm,
166 printk(KERN_INFO "Strange, %s not stopped\n", p->comm); 167 * 1 otherwise.
167 } while_each_thread(g, p); 168 */
169 int is_user = !!(p->mm && !(p->flags & PF_BORROWED_MM));
170 if (!freezeable(p) || (is_user != pass))
171 continue;
172 if (!thaw_process(p))
173 printk(KERN_INFO
174 "Strange, %s not stopped\n", p->comm);
175 } while_each_thread(g, p);
176
177 pass++;
178 } while (pass < 2 && all);
168 179
169 read_unlock(&tasklist_lock); 180 read_unlock(&tasklist_lock);
170 schedule(); 181 schedule();