[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>
This commit is contained in:
Родитель
14b5b7cfaa
Коммит
ff39593ad0
|
@ -1,5 +1,8 @@
|
||||||
/* Freezer declarations */
|
/* Freezer declarations */
|
||||||
|
|
||||||
|
#define FREEZER_KERNEL_THREADS 0
|
||||||
|
#define FREEZER_ALL_THREADS 1
|
||||||
|
|
||||||
#ifdef CONFIG_PM
|
#ifdef CONFIG_PM
|
||||||
/*
|
/*
|
||||||
* Check if a process has been frozen
|
* Check if a process has been frozen
|
||||||
|
@ -57,7 +60,8 @@ static inline void frozen_process(struct task_struct *p)
|
||||||
|
|
||||||
extern void refrigerator(void);
|
extern void refrigerator(void);
|
||||||
extern int freeze_processes(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)
|
static inline int try_to_freeze(void)
|
||||||
{
|
{
|
||||||
|
@ -67,6 +71,9 @@ static inline int try_to_freeze(void)
|
||||||
} else
|
} else
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
extern void thaw_some_processes(int all);
|
||||||
|
|
||||||
#else
|
#else
|
||||||
static inline int frozen(struct task_struct *p) { return 0; }
|
static inline int frozen(struct task_struct *p) { return 0; }
|
||||||
static inline int freezing(struct task_struct *p) { return 0; }
|
static inline int freezing(struct task_struct *p) { return 0; }
|
||||||
|
|
|
@ -153,18 +153,29 @@ int freeze_processes(void)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void thaw_processes(void)
|
void thaw_some_processes(int all)
|
||||||
{
|
{
|
||||||
struct task_struct *g, *p;
|
struct task_struct *g, *p;
|
||||||
|
int pass = 0; /* Pass 0 = Kernel space, 1 = Userspace */
|
||||||
|
|
||||||
printk("Restarting tasks... ");
|
printk("Restarting tasks... ");
|
||||||
read_lock(&tasklist_lock);
|
read_lock(&tasklist_lock);
|
||||||
do_each_thread(g, p) {
|
do {
|
||||||
if (!freezeable(p))
|
do_each_thread(g, p) {
|
||||||
continue;
|
/*
|
||||||
if (!thaw_process(p))
|
* is_user = 0 if kernel thread or borrowed mm,
|
||||||
printk(KERN_INFO "Strange, %s not stopped\n", p->comm);
|
* 1 otherwise.
|
||||||
} while_each_thread(g, p);
|
*/
|
||||||
|
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);
|
read_unlock(&tasklist_lock);
|
||||||
schedule();
|
schedule();
|
||||||
|
|
Загрузка…
Ссылка в новой задаче