| From bd07f032506fb16af54aadcce89fd89d1378526e Mon Sep 17 00:00:00 2001 |
| From: "Srivatsa S. Bhat" <srivatsa.bhat@linux.vnet.ibm.com> |
| Date: Thu, 1 Dec 2011 22:33:10 +0100 |
| Subject: PM / Hibernate: Thaw processes in SNAPSHOT_CREATE_IMAGE ioctl test |
| path |
| |
| Commit 2aede851ddf08666f68ffc17be446420e9d2a056 (PM / Hibernate: Freeze |
| kernel threads after preallocating memory) moved the freezing of kernel |
| threads to hibernation_snapshot() function. |
| |
| So now, if the call to hibernation_snapshot() returns early due to a |
| successful hibernation test, the caller has to thaw processes to ensure |
| that the system gets back to its original state. |
| |
| But in SNAPSHOT_CREATE_IMAGE hibernation ioctl, the caller does not thaw |
| processes in case hibernation_snapshot() returned due to a successful |
| freezer test. Fix this issue. But note we still send the value of 'in_suspend' |
| (which is now 0) to userspace, because we are not in an error path per-se, |
| and moreover, the value of in_suspend correctly depicts the situation here. |
| |
| Signed-off-by: Srivatsa S. Bhat <srivatsa.bhat@linux.vnet.ibm.com> |
| Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl> |
| (cherry picked from commit 97819a26224f019e73d88bb2fd4eb5a614860461) |
| |
| Signed-off-by: Simon Horman <horms@verge.net.au> |
| --- |
| kernel/power/hibernate.c | 2 +- |
| kernel/power/power.h | 2 ++ |
| kernel/power/user.c | 11 ++++++++--- |
| 3 files changed, 11 insertions(+), 4 deletions(-) |
| |
| diff --git a/kernel/power/hibernate.c b/kernel/power/hibernate.c |
| index 4f2ebf4..19500b5 100644 |
| --- a/kernel/power/hibernate.c |
| +++ b/kernel/power/hibernate.c |
| @@ -55,7 +55,7 @@ enum { |
| |
| static int hibernation_mode = HIBERNATION_SHUTDOWN; |
| |
| -static bool freezer_test_done; |
| +bool freezer_test_done; |
| |
| static const struct platform_hibernation_ops *hibernation_ops; |
| |
| diff --git a/kernel/power/power.h b/kernel/power/power.h |
| index 23a2db1..0c4defe 100644 |
| --- a/kernel/power/power.h |
| +++ b/kernel/power/power.h |
| @@ -50,6 +50,8 @@ static inline char *check_image_kernel(struct swsusp_info *info) |
| #define SPARE_PAGES ((1024 * 1024) >> PAGE_SHIFT) |
| |
| /* kernel/power/hibernate.c */ |
| +extern bool freezer_test_done; |
| + |
| extern int hibernation_snapshot(int platform_mode); |
| extern int hibernation_restore(int platform_mode); |
| extern int hibernation_platform_enter(void); |
| diff --git a/kernel/power/user.c b/kernel/power/user.c |
| index 7cc3f5b..c202e2e 100644 |
| --- a/kernel/power/user.c |
| +++ b/kernel/power/user.c |
| @@ -281,10 +281,15 @@ static long snapshot_ioctl(struct file *filp, unsigned int cmd, |
| } |
| pm_restore_gfp_mask(); |
| error = hibernation_snapshot(data->platform_support); |
| - if (!error) |
| + if (!error) { |
| error = put_user(in_suspend, (int __user *)arg); |
| - if (!error) |
| - data->ready = 1; |
| + if (!error && !freezer_test_done) |
| + data->ready = 1; |
| + if (freezer_test_done) { |
| + freezer_test_done = false; |
| + thaw_processes(); |
| + } |
| + } |
| break; |
| |
| case SNAPSHOT_ATOMIC_RESTORE: |
| -- |
| 1.7.10.1.362.g242cab3 |
| |