diff options
author | Rafael J. Wysocki <rjw@sisk.pl> | 2005-10-30 17:59:58 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@g5.osdl.org> | 2005-10-30 20:37:14 -0500 |
commit | 2c1b4a5ca48831595979a850f40ced8e7da026f8 (patch) | |
tree | 06fe8a400df8c5166c7f47ca2c30a584473f1170 /kernel/power/disk.c | |
parent | a0f496517f3e28d651d0cbbcf2d4fb701ed6957e (diff) |
[PATCH] swsusp: rework memory freeing on resume
The following patch makes swsusp use the PG_nosave and PG_nosave_free flags to
mark pages that should be freed in case of an error during resume.
This allows us to simplify the code and to use swsusp_free() in all of the
swsusp's resume error paths, which makes them actually work.
Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Diffstat (limited to 'kernel/power/disk.c')
-rw-r--r-- | kernel/power/disk.c | 14 |
1 files changed, 7 insertions, 7 deletions
diff --git a/kernel/power/disk.c b/kernel/power/disk.c index 761956e813f5..44ef5e799df0 100644 --- a/kernel/power/disk.c +++ b/kernel/power/disk.c | |||
@@ -30,7 +30,6 @@ extern int swsusp_check(void); | |||
30 | extern int swsusp_read(void); | 30 | extern int swsusp_read(void); |
31 | extern void swsusp_close(void); | 31 | extern void swsusp_close(void); |
32 | extern int swsusp_resume(void); | 32 | extern int swsusp_resume(void); |
33 | extern int swsusp_free(void); | ||
34 | 33 | ||
35 | 34 | ||
36 | static int noresume = 0; | 35 | static int noresume = 0; |
@@ -252,14 +251,17 @@ static int software_resume(void) | |||
252 | 251 | ||
253 | pr_debug("PM: Reading swsusp image.\n"); | 252 | pr_debug("PM: Reading swsusp image.\n"); |
254 | 253 | ||
255 | if ((error = swsusp_read())) | 254 | if ((error = swsusp_read())) { |
256 | goto Cleanup; | 255 | swsusp_free(); |
256 | goto Thaw; | ||
257 | } | ||
257 | 258 | ||
258 | pr_debug("PM: Preparing devices for restore.\n"); | 259 | pr_debug("PM: Preparing devices for restore.\n"); |
259 | 260 | ||
260 | if ((error = device_suspend(PMSG_FREEZE))) { | 261 | if ((error = device_suspend(PMSG_FREEZE))) { |
261 | printk("Some devices failed to suspend\n"); | 262 | printk("Some devices failed to suspend\n"); |
262 | goto Free; | 263 | swsusp_free(); |
264 | goto Thaw; | ||
263 | } | 265 | } |
264 | 266 | ||
265 | mb(); | 267 | mb(); |
@@ -268,9 +270,7 @@ static int software_resume(void) | |||
268 | swsusp_resume(); | 270 | swsusp_resume(); |
269 | pr_debug("PM: Restore failed, recovering.n"); | 271 | pr_debug("PM: Restore failed, recovering.n"); |
270 | device_resume(); | 272 | device_resume(); |
271 | Free: | 273 | Thaw: |
272 | swsusp_free(); | ||
273 | Cleanup: | ||
274 | unprepare_processes(); | 274 | unprepare_processes(); |
275 | Done: | 275 | Done: |
276 | /* For success case, the suspend path will release the lock */ | 276 | /* For success case, the suspend path will release the lock */ |