From: Stefan Seyfried <seife@suse.de>

From: Pavel Machek <pavel@ucw.cz>

This actually calls highmem_resume(), so swsusp has chance to work on
highmem machines.  It also adds comments about code flow, which is quite
interesting at that point.

Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Andrew Morton <akpm@osdl.org>
---

 25-akpm/kernel/power/swsusp.c |    7 +++++++
 1 files changed, 7 insertions(+)

diff -puN kernel/power/swsusp.c~swsusp-fix-highmem kernel/power/swsusp.c
--- 25/kernel/power/swsusp.c~swsusp-fix-highmem	Wed Sep 22 16:42:11 2004
+++ 25-akpm/kernel/power/swsusp.c	Wed Sep 22 16:42:11 2004
@@ -860,7 +860,9 @@ int swsusp_suspend(void)
 	local_irq_disable();
 	save_processor_state();
 	error = swsusp_arch_suspend();
+	/* Restore control flow magically appears here */
 	restore_processor_state();
+	restore_highmem();
 	local_irq_enable();
 	return error;
 }
@@ -880,8 +882,13 @@ int swsusp_resume(void)
 {
 	int error;
 	local_irq_disable();
+	/* We'll ignore saved state, but this gets preempt count (etc) right */
 	save_processor_state();
 	error = swsusp_arch_resume();
+	/* Code below is only ever reached in case of failure. Otherwise
+	 * execution continues at place where swsusp_arch_suspend was called
+         */
+	BUG_ON(!error);
 	restore_processor_state();
 	restore_highmem();
 	local_irq_enable();
_