From 592b73081b6137f19966552f41bb3b63d53df177 Mon Sep 17 00:00:00 2001 From: "Srivatsa S. Bhat" Date: Fri, 3 Feb 2012 22:22:41 +0100 Subject: [PATCH] --- yaml --- r: 287259 b: refs/heads/master c: 379e0be812ab8a2a351e784b0c987788f5123090 h: refs/heads/master i: 287257: 4e058a737460f4fd26086944e0d9cea698b445be 287255: 1018c272a402ceefbb36c0becad0b2553ebf4e2e v: v3 --- [refs] | 2 +- trunk/kernel/power/power.h | 24 ++++++++++++++++++++++-- trunk/kernel/power/process.c | 7 +++++-- 3 files changed, 28 insertions(+), 5 deletions(-) diff --git a/[refs] b/[refs] index 3152b6cca7a4..846a292323d2 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: fe9161db2e6053da21e4649d77bbefaf3030b11d +refs/heads/master: 379e0be812ab8a2a351e784b0c987788f5123090 diff --git a/trunk/kernel/power/power.h b/trunk/kernel/power/power.h index 0c4defe6d3b8..21724eee5206 100644 --- a/trunk/kernel/power/power.h +++ b/trunk/kernel/power/power.h @@ -231,8 +231,28 @@ extern int pm_test_level; #ifdef CONFIG_SUSPEND_FREEZER static inline int suspend_freeze_processes(void) { - int error = freeze_processes(); - return error ? : freeze_kernel_threads(); + int error; + + error = freeze_processes(); + + /* + * freeze_processes() automatically thaws every task if freezing + * fails. So we need not do anything extra upon error. + */ + if (error) + goto Finish; + + error = freeze_kernel_threads(); + + /* + * freeze_kernel_threads() thaws only kernel threads upon freezing + * failure. So we have to thaw the userspace tasks ourselves. + */ + if (error) + thaw_processes(); + + Finish: + return error; } static inline void suspend_thaw_processes(void) diff --git a/trunk/kernel/power/process.c b/trunk/kernel/power/process.c index eeca00311f39..7e426459e60a 100644 --- a/trunk/kernel/power/process.c +++ b/trunk/kernel/power/process.c @@ -143,7 +143,10 @@ int freeze_processes(void) /** * freeze_kernel_threads - Make freezable kernel threads go to the refrigerator. * - * On success, returns 0. On failure, -errno and system is fully thawed. + * On success, returns 0. On failure, -errno and only the kernel threads are + * thawed, so as to give a chance to the caller to do additional cleanups + * (if any) before thawing the userspace tasks. So, it is the responsibility + * of the caller to thaw the userspace tasks, when the time is right. */ int freeze_kernel_threads(void) { @@ -159,7 +162,7 @@ int freeze_kernel_threads(void) BUG_ON(in_atomic()); if (error) - thaw_processes(); + thaw_kernel_threads(); return error; }