summaryrefslogtreecommitdiff
path: root/kernel/power/disk.c
diff options
context:
space:
mode:
authorPatrick Mochel <mochel@osdl.org>2003-09-08 02:41:39 -0700
committerPatrick Mochel <mochel@osdl.org>2003-09-08 02:41:39 -0700
commit2d6e58e7b2ee73edfab739e122f4d95f51ab5b89 (patch)
tree4c6202c799511d72b5abacede2089b527975dbdf /kernel/power/disk.c
parent128b46cd4bc9ebfa5117800e7c20870343e465ad (diff)
[power] Fix swsusp with preempt and clean up.
In order to snapshot memory, interrupts must be disabled. However, in order to write the saved image to disk, interrupts must be re-enabled and devices resumed. Previously, both actions were called from swsusp_arch_suspend(). This patch separates those two actions has only the snapshotting routine called from swsusp_arch_suspend(). swsusp now handles it's own disabling of interrupts only for the time required. This is now handled from swsusp_save() and swsusp_write() now handles writing the image only (called with interrupts enabled). swsusp_save_image() was renamed to swsusp_suspend() (and the old incarnation deleted since it was simply a wrapper).
Diffstat (limited to 'kernel/power/disk.c')
-rw-r--r--kernel/power/disk.c26
1 files changed, 12 insertions, 14 deletions
diff --git a/kernel/power/disk.c b/kernel/power/disk.c
index e7e40119d917..64a3130a5411 100644
--- a/kernel/power/disk.c
+++ b/kernel/power/disk.c
@@ -163,27 +163,27 @@ int pm_suspend_disk(void)
pr_debug("PM: snapshotting memory.\n");
in_suspend = 1;
- local_irq_disable();
if ((error = swsusp_save()))
goto Done;
- pr_debug("PM: writing image.\n");
+ if (in_suspend) {
+ pr_debug("PM: writing image.\n");
- /*
- * FIXME: Leftover from swsusp. Are they necessary?
- */
- mb();
- barrier();
+ /*
+ * FIXME: Leftover from swsusp. Are they necessary?
+ */
+ mb();
+ barrier();
- error = swsusp_write();
- if (!error && in_suspend) {
- error = power_down(pm_disk_mode);
- pr_debug("PM: Power down failed.\n");
+ error = swsusp_write();
+ if (!error) {
+ error = power_down(pm_disk_mode);
+ pr_debug("PM: Power down failed.\n");
+ }
} else
pr_debug("PM: Image restored successfully.\n");
swsusp_free();
Done:
- local_irq_enable();
finish();
return error;
}
@@ -217,7 +217,6 @@ static int pm_resume(void)
barrier();
mb();
- local_irq_disable();
/* FIXME: The following (comment and mdelay()) are from swsusp.
* Are they really necessary?
@@ -231,7 +230,6 @@ static int pm_resume(void)
pr_debug("PM: Restoring saved image.\n");
swsusp_restore();
- local_irq_enable();
pr_debug("PM: Restore failed, recovering.n");
finish();
Free: