mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
From: Len Brown <lenb@kernel.org>
To: linux-pm@lists.linux-foundation.org
Cc: linux-acpi@vger.kernel.org, linux-kernel@vger.kernel.org,
	"Rafael J. Wysocki" <rjw@sisk.pl>,
	Len Brown <len.brown@intel.com>
Subject: [PATCH 16/37] Hibernation: Move low level resume to disk.c
Date: Thu, 31 Jan 2008 23:36:47 -0500	[thread overview]
Message-ID: <d2fdea0305f2b5c6887eff954d1cabb304a376ae.1201840183.git.len.brown@intel.com> (raw)
In-Reply-To: <1201840628-23136-1-git-send-email-lenb@kernel.org>
In-Reply-To: <edae89f5d1eb1fbe1cab74333db5a8e29776900e.1201840183.git.len.brown@intel.com>

From: Rafael J. Wysocki <rjw@sisk.pl>

Move the low level restore code to kernel/power/disk.c , since the
corresponding low level hibernation code is already there.

Make restore fail if device_power_down(PMSG_PRETHAW) returns an
error.

Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl>
Acked-by: Pavel Machek <pavel@ucw.cz>
Signed-off-by: Len Brown <len.brown@intel.com>
---
 kernel/power/disk.c   |   49 ++++++++++++++++++++++++++++++++++++++++++++++++-
 kernel/power/power.h  |    1 -
 kernel/power/swsusp.c |   35 -----------------------------------
 3 files changed, 48 insertions(+), 37 deletions(-)

diff --git a/kernel/power/disk.c b/kernel/power/disk.c
index 0866b16..2a4bada 100644
--- a/kernel/power/disk.c
+++ b/kernel/power/disk.c
@@ -275,6 +275,53 @@ int hibernation_snapshot(int platform_mode)
 }
 
 /**
+ *	resume_target_kernel - prepare devices that need to be suspended with
+ *	interrupts off, restore the contents of highmem that have not been
+ *	restored yet from the image and run the low level code that will restore
+ *	the remaining contents of memory and switch to the just restored target
+ *	kernel.
+ */
+
+static int resume_target_kernel(void)
+{
+	int error;
+
+	local_irq_disable();
+	error = device_power_down(PMSG_PRETHAW);
+	if (error) {
+		printk(KERN_ERR "Some devices failed to power down, "
+			"aborting resume\n");
+		goto Enable_irqs;
+	}
+	/* We'll ignore saved state, but this gets preempt count (etc) right */
+	save_processor_state();
+	error = restore_highmem();
+	if (!error) {
+		error = swsusp_arch_resume();
+		/*
+		 * The code below is only ever reached in case of a failure.
+		 * Otherwise execution continues at place where
+		 * swsusp_arch_suspend() was called
+		 */
+		BUG_ON(!error);
+		/* This call to restore_highmem() undos the previous one */
+		restore_highmem();
+	}
+	/*
+	 * The only reason why swsusp_arch_resume() can fail is memory being
+	 * very tight, so we have to free it as soon as we can to avoid
+	 * subsequent failures
+	 */
+	swsusp_free();
+	restore_processor_state();
+	touch_softlockup_watchdog();
+	device_power_up();
+ Enable_irqs:
+	local_irq_enable();
+	return error;
+}
+
+/**
  *	hibernation_restore - quiesce devices and restore the hibernation
  *	snapshot image.  If successful, control returns in hibernation_snaphot()
  *	@platform_mode - if set, use the platform driver, if available, to
@@ -297,7 +344,7 @@ int hibernation_restore(int platform_mode)
 	if (!error) {
 		error = disable_nonboot_cpus();
 		if (!error)
-			error = swsusp_resume();
+			error = resume_target_kernel();
 		enable_nonboot_cpus();
 	}
 	platform_restore_cleanup(platform_mode);
diff --git a/kernel/power/power.h b/kernel/power/power.h
index a9732fd..8ec5499 100644
--- a/kernel/power/power.h
+++ b/kernel/power/power.h
@@ -152,7 +152,6 @@ extern int swsusp_swap_in_use(void);
 extern int swsusp_check(void);
 extern int swsusp_shrink_memory(void);
 extern void swsusp_free(void);
-extern int swsusp_resume(void);
 extern int swsusp_read(unsigned int *flags_p);
 extern int swsusp_write(unsigned int flags);
 extern void swsusp_close(void);
diff --git a/kernel/power/swsusp.c b/kernel/power/swsusp.c
index 605c536..dc29a20 100644
--- a/kernel/power/swsusp.c
+++ b/kernel/power/swsusp.c
@@ -261,38 +261,3 @@ int swsusp_shrink_memory(void)
 
 	return 0;
 }
-
-int swsusp_resume(void)
-{
-	int error;
-
-	local_irq_disable();
-	/* NOTE:  device_power_down() is just a suspend() with irqs off;
-	 * it has no special "power things down" semantics
-	 */
-	if (device_power_down(PMSG_PRETHAW))
-		printk(KERN_ERR "Some devices failed to power down, very bad\n");
-	/* We'll ignore saved state, but this gets preempt count (etc) right */
-	save_processor_state();
-	error = restore_highmem();
-	if (!error) {
-		error = swsusp_arch_resume();
-		/* The code below is only ever reached in case of a failure.
-		 * Otherwise execution continues at place where
-		 * swsusp_arch_suspend() was called
-        	 */
-		BUG_ON(!error);
-		/* This call to restore_highmem() undos the previous one */
-		restore_highmem();
-	}
-	/* The only reason why swsusp_arch_resume() can fail is memory being
-	 * very tight, so we have to free it as soon as we can to avoid
-	 * subsequent failures
-	 */
-	swsusp_free();
-	restore_processor_state();
-	touch_softlockup_watchdog();
-	device_power_up();
-	local_irq_enable();
-	return error;
-}
-- 
1.5.4.rc5.16.gc0279


  parent reply	other threads:[~2008-02-01  4:58 UTC|newest]

Thread overview: 42+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2008-02-01  4:36 suspend patches for 2.6.25-rc0 Len Brown
2008-02-01  4:36 ` [PATCH 01/37] Hibernation: Introduce SNAPSHOT_GET_IMAGE_SIZE ioctl Len Brown
2008-02-01  4:36   ` [PATCH 02/37] Hibernation: Rework platform support ioctls (rev. 2) Len Brown
2008-02-01  4:36   ` [PATCH 03/37] Hibernation: Mark SNAPSHOT_SET_SWAP_FILE ioctl as deprecated " Len Brown
2008-02-01  4:36   ` [PATCH 04/37] Hibernation: Correct definitions of some ioctls " Len Brown
2008-02-01  4:36   ` [PATCH 05/37] Hibernation: Introduce exportable suspend ioctls header " Len Brown
2008-02-01  4:36   ` [PATCH 06/37] ACPI: Fix mismerge in acpi_hibernation_finish Len Brown
2008-02-01  4:36   ` [PATCH 07/37] Hibernation: Move function prototypes to header Len Brown
2008-02-01  4:36   ` [PATCH 08/37] Hibernation: Add PM_RESTORE_PREPARE and PM_POST_RESTORE notifiers (rev. 2) Len Brown
2008-02-01  4:36   ` [PATCH 09/37] Suspend: Testing facility " Len Brown
2008-02-01  4:36   ` [PATCH 10/37] suspend: build fix responding to 2.6.25 kset change Len Brown
2008-02-01  4:36   ` [PATCH 11/37] Hibernation: New testing facility (rev. 2) Len Brown
2008-02-01  4:36   ` [PATCH 12/37] PM: Suspend/hibernation debug documentation update " Len Brown
2008-02-01  4:36   ` [PATCH 13/37] PM: Make PM_TRACE more architecture independent Len Brown
2008-02-01  4:36   ` [PATCH 14/37] PM: Convert PM notifiers to out-of-line code Len Brown
2008-02-01  4:36   ` [PATCH 15/37] Suspend: Fix compilation warning for CONFIG_SUSPEND unset Len Brown
2008-02-01  4:36   ` Len Brown [this message]
2008-02-01  4:36   ` [PATCH 17/37] Suspend: Fix comment in main.c Len Brown
2008-02-01  4:36   ` [PATCH 18/37] Hibernation: Fix comment in disk.c Len Brown
2008-02-01  4:36   ` [PATCH 19/37] Hibernation: Remove unnecessary variable declaration Len Brown
2008-02-01  4:36   ` [PATCH 20/37] Suspend: Use common prefix in messages Len Brown
2008-02-01  4:36   ` [PATCH 21/37] Hibernation: Update messages Len Brown
2008-02-01  4:36   ` [PATCH 22/37] Hibernation: Clean up Kconfig (V2) Len Brown
2008-02-01  4:36   ` [PATCH 23/37] Suspend: " Len Brown
2008-02-01  9:05     ` Bryan Wu
2008-02-04 14:59     ` Pavel Machek
2008-02-01  4:36   ` [PATCH 24/37] ACPI: clear GPE earily in resume to avoid warning Len Brown
2008-02-01  4:36   ` [PATCH 25/37] suspend: fix ia64 allmodconfig build Len Brown
2008-02-01  4:36   ` [PATCH 26/37] Suspend: Introduce begin() and end() callbacks Len Brown
2008-02-01  4:36   ` [PATCH 27/37] ACPI: Separate invocations of _GTS and _BFS from _PTS and _WAK Len Brown
2008-02-01  4:36   ` [PATCH 28/37] ACPI: Separate disabling of GPEs from _PTS Len Brown
2008-02-01  4:37   ` [PATCH 29/37] ACPI suspend: Call _PTS before suspending devices Len Brown
2008-02-01  4:37   ` [PATCH 30/37] Hibernation: Introduce begin() and end() callbacks Len Brown
2008-02-01  4:37   ` [PATCH 31/37] ACPI hibernation: Call _PTS before suspending devices Len Brown
2008-02-01  4:37   ` [PATCH 32/37] ACPI: Print message before calling _PTS Len Brown
2008-02-01  4:37   ` [PATCH 33/37] Suspend: Add config option to disable the freezer if architecture wants that Len Brown
2008-02-01  4:37   ` [PATCH 34/37] Suspend: Clean up suspend_64.c Len Brown
2008-02-01  4:37   ` [PATCH 35/37] Suspend: Invoke suspend notifications after console switch Len Brown
2008-02-01  4:37   ` [PATCH 36/37] Hibernation: " Len Brown
2008-02-01  4:37   ` [PATCH 37/37] PM: Remove obsolete /sys/devices/.../power/state docs Len Brown
2008-02-01  5:48 ` [PATCH] feature-removal: Document suspend/hibernate deprecations Harvey Harrison
2008-02-01 10:54   ` Rafael J. Wysocki

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=d2fdea0305f2b5c6887eff954d1cabb304a376ae.1201840183.git.len.brown@intel.com \
    --to=lenb@kernel.org \
    --cc=len.brown@intel.com \
    --cc=linux-acpi@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-pm@lists.linux-foundation.org \
    --cc=rjw@sisk.pl \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox

all inboxes | Powered by JetHome®