aboutsummaryrefslogtreecommitdiffstats
path: root/kernel/power
diff options
context:
space:
mode:
authorNigel Cunningham <ncunningham@linuxmail.org>2006-12-06 20:34:28 -0800
committerLinus Torvalds <torvalds@woody.osdl.org>2006-12-07 08:39:28 -0800
commitff39593ad0ff7a79a3717edac6634407aa8200c2 (patch)
tree571e02e20d5d211224567d5cc22333196cf6f563 /kernel/power
parent14b5b7cfaa110b1d25b8f80b01a8c97cf2db30bc (diff)
downloadkernel_samsung_tuna-ff39593ad0ff7a79a3717edac6634407aa8200c2.zip
kernel_samsung_tuna-ff39593ad0ff7a79a3717edac6634407aa8200c2.tar.gz
kernel_samsung_tuna-ff39593ad0ff7a79a3717edac6634407aa8200c2.tar.bz2
[PATCH] swsusp: thaw userspace and kernel space separately
Modify process thawing so that we can thaw kernel space without thawing userspace, and thaw kernelspace first. This will be useful in later patches, where I intend to get swsusp thawing kernel threads only before seeking to free memory. Signed-off-by: Nigel Cunningham <nigel@suspend2.net> Cc: Pavel Machek <pavel@ucw.cz> Cc: "Rafael J. Wysocki" <rjw@sisk.pl> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
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 fedabad..cba8a58 100644
--- a/kernel/power/process.c
+++ b/kernel/power/process.c
@@ -153,18 +153,29 @@ int freeze_processes(void)
return 0;
}
-void thaw_processes(void)
+void thaw_some_processes(int all)
{
struct task_struct *g, *p;
+ int pass = 0; /* Pass 0 = Kernel space, 1 = Userspace */
printk("Restarting tasks... ");
read_lock(&tasklist_lock);
- do_each_thread(g, p) {
- if (!freezeable(p))
- continue;
- if (!thaw_process(p))
- printk(KERN_INFO "Strange, %s not stopped\n", p->comm);
- } while_each_thread(g, p);
+ do {
+ do_each_thread(g, p) {
+ /*
+ * is_user = 0 if kernel thread or borrowed mm,
+ * 1 otherwise.
+ */
+ int is_user = !!(p->mm && !(p->flags & PF_BORROWED_MM));
+ if (!freezeable(p) || (is_user != pass))
+ continue;
+ if (!thaw_process(p))
+ printk(KERN_INFO
+ "Strange, %s not stopped\n", p->comm);
+ } while_each_thread(g, p);
+
+ pass++;
+ } while (pass < 2 && all);
read_unlock(&tasklist_lock);
schedule();