From: Nigel Cunningham <ncunningham@linuxmail.org>
To: Andrew Morton <akpm@osdl.org>, "Rafael J. Wysocki" <rjw@sisk.pl>,
LKML <linux-kernel@vger.kernel.org>
Subject: [PATCH] Thaw userspace and kernel space separately.
Date: Mon, 23 Oct 2006 09:48:16 +1000 [thread overview]
Message-ID: <1161560896.7438.67.camel@nigel.suspend2.net> (raw)
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>
diff --git a/include/linux/freezer.h b/include/linux/freezer.h
index 266373f..294ebea 100644
--- a/include/linux/freezer.h
+++ b/include/linux/freezer.h
@@ -1,5 +1,8 @@
/* Freezer declarations */
+#define FREEZER_KERNEL_THREADS 0
+#define FREEZER_ALL_THREADS 1
+
#ifdef CONFIG_PM
/*
* Check if a process has been frozen
@@ -57,7 +60,8 @@ static inline void frozen_process(struct
extern void refrigerator(void);
extern int freeze_processes(void);
-extern void thaw_processes(void);
+#define thaw_processes() do { thaw_some_processes(FREEZER_ALL_THREADS); } while(0)
+#define thaw_kernel_threads() do { thaw_some_processes(FREEZER_KERNEL_THREADS); } while(0)
static inline int try_to_freeze(void)
{
@@ -67,6 +71,9 @@ static inline int try_to_freeze(void)
} else
return 0;
}
+
+extern void thaw_some_processes(int all);
+
#else
static inline int frozen(struct task_struct *p) { return 0; }
static inline int freezing(struct task_struct *p) { return 0; }
diff --git a/kernel/power/process.c b/kernel/power/process.c
index fedabad..4a001fe 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();
next reply other threads:[~2006-10-22 23:48 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2006-10-22 23:48 Nigel Cunningham [this message]
2006-10-23 10:26 ` [PATCH] Thaw userspace and kernel space separately Rafael J. Wysocki
2006-10-23 12:00 ` Nigel Cunningham
2006-10-23 13:41 ` Rafael J. Wysocki
2006-10-23 16:51 ` Andrew Morton
2006-10-23 18:37 ` Rafael J. Wysocki
2006-10-25 17:45 ` dean gaudet
2006-10-23 15:18 ` Pavel Machek
2006-10-29 0:04 ` Bill Davidsen
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1161560896.7438.67.camel@nigel.suspend2.net \
--to=ncunningham@linuxmail.org \
--cc=akpm@osdl.org \
--cc=linux-kernel@vger.kernel.org \
--cc=rjw@sisk.pl \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.