diff options
Diffstat (limited to 'kernel/power')
-rw-r--r-- | kernel/power/process.c | 25 |
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 | ||
156 | void thaw_processes(void) | 156 | void 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(); |