The patch titled swsusp: Untangle thaw_processes has been added to the -mm tree. Its filename is swsusp-untangle-thaw_processes.patch See http://www.zip.com.au/~akpm/linux/patches/stuff/added-to-mm.txt to find out what to do about this ------------------------------------------------------ Subject: swsusp: Untangle thaw_processes From: "Rafael J. Wysocki" <rjw@xxxxxxx> Move the loop from thaw_processes() to a separate function and call it independently for kernel threads and user space processes so that the order of thawing tasks is clearly visible. Drop thaw_kernel_threads() which is never used. Signed-off-by: Rafael J. Wysocki <rjw@xxxxxxx> Cc: Pavel Machek <pavel@xxxxxx> Cc: Nigel Cunningham <nigel@xxxxxxxxxxxx> Signed-off-by: Andrew Morton <akpm@xxxxxxxx> --- include/linux/freezer.h | 6 ---- kernel/power/process.c | 53 ++++++++++++++++++++------------------ 2 files changed, 30 insertions(+), 29 deletions(-) diff -puN include/linux/freezer.h~swsusp-untangle-thaw_processes include/linux/freezer.h --- a/include/linux/freezer.h~swsusp-untangle-thaw_processes +++ a/include/linux/freezer.h @@ -1,8 +1,5 @@ /* Freezer declarations */ -#define FREEZER_KERNEL_THREADS 0 -#define FREEZER_ALL_THREADS 1 - #ifdef CONFIG_PM /* * Check if a process has been frozen @@ -60,8 +57,7 @@ static inline void frozen_process(struct extern void refrigerator(void); extern int freeze_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) +extern void thaw_processes(void); static inline int try_to_freeze(void) { diff -puN kernel/power/process.c~swsusp-untangle-thaw_processes kernel/power/process.c --- a/kernel/power/process.c~swsusp-untangle-thaw_processes +++ a/kernel/power/process.c @@ -20,6 +20,8 @@ */ #define TIMEOUT (20 * HZ) +#define FREEZER_KERNEL_THREADS 0 +#define FREEZER_USER_SPACE 1 static inline int freezeable(struct task_struct * p) { @@ -79,6 +81,11 @@ static void cancel_freezing(struct task_ } } +static inline int is_user_space(struct task_struct *p) +{ + return p->mm && !(p->flags & PF_BORROWED_MM); +} + /* 0 = success, else # of processes that we failed to stop */ int freeze_processes(void) { @@ -103,10 +110,9 @@ int freeze_processes(void) cancel_freezing(p); continue; } - if (p->mm && !(p->flags & PF_BORROWED_MM)) { - /* The task is a user-space one. - * Freeze it unless there's a vfork completion - * pending + if (is_user_space(p)) { + /* Freeze the task unless there is a vfork + * completion pending */ if (!p->vfork_done) freeze_process(p); @@ -155,31 +161,30 @@ int freeze_processes(void) return 0; } -void thaw_some_processes(int all) +static void thaw_tasks(int thaw_user_space) { struct task_struct *g, *p; - int pass = 0; /* Pass 0 = Kernel space, 1 = Userspace */ - printk("Restarting tasks... "); read_lock(&tasklist_lock); - 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); - + do_each_thread(g, p) { + if (!freezeable(p)) + continue; + + if (is_user_space(p) == !thaw_user_space) + continue; + + if (!thaw_process(p)) + printk(KERN_WARNING " Strange, %s not stopped\n", + p->comm ); + } while_each_thread(g, p); read_unlock(&tasklist_lock); +} + +void thaw_processes(void) +{ + printk("Restarting tasks ... "); + thaw_tasks(FREEZER_KERNEL_THREADS); + thaw_tasks(FREEZER_USER_SPACE); schedule(); printk("done.\n"); } _ Patches currently in -mm which might be from rjw@xxxxxxx are git-acpi.patch uswsusp-add-pmops-prepareenterfinish-support-aka-platform-mode.patch swsusp-use-partition-device-and-offset-to-identify-swap-areas.patch swsusp-rearrange-swap-handling-code.patch swsusp-use-block-device-offsets-to-identify-swap-locations-rev-2.patch swsusp-add-resume_offset-command-line-parameter-rev-2.patch swsusp-document-support-for-swap-files-rev-2.patch swsusp-add-ioctl-for-swap-files-support.patch swsusp-update-userland-interface-documentation.patch swsusp-improve-handling-of-highmem.patch swsusp-improve-handling-of-highmem-fix.patch swsusp-use-__gfp_wait.patch swsusp-fix-platform-mode.patch add-include-linux-freezerh-and-move-definitions-from.patch add-include-linux-freezerh-and-move-definitions-from-ueagle-fix.patch quieten-freezer-if-config_pm_debug.patch swsusp-cleanup-whitespace-in-freezer-output.patch swsusp-thaw-userspace-and-kernel-space-separately.patch swsusp-support-i386-systems-with-pae-or-without-pse.patch suspend-dont-change-cpus_allowed-for-task-initiating-the-suspend.patch swsusp-measure-memory-shrinking-time.patch suspend-to-disk-fails-if-gdb-is-suspended-with-a-traced-child.patch convert-pm_sem-to-a-mutex.patch swsusp-untangle-thaw_processes.patch support-for-freezeable-workqueues.patch use-freezeable-workqueues-in-xfs.patch md-change-lifetime-rules-for-md-devices.patch - To unsubscribe from this list: send the line "unsubscribe mm-commits" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html