diff options
| author | Patrick Mochel <mochel@osdl.org> | 2003-09-08 02:41:39 -0700 |
|---|---|---|
| committer | Patrick Mochel <mochel@osdl.org> | 2003-09-08 02:41:39 -0700 |
| commit | 2d6e58e7b2ee73edfab739e122f4d95f51ab5b89 (patch) | |
| tree | 4c6202c799511d72b5abacede2089b527975dbdf /kernel/power/disk.c | |
| parent | 128b46cd4bc9ebfa5117800e7c20870343e465ad (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.c | 26 |
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: |
