From: Nigel Cunningham <nigel@suspend2.net>
To: linux-kernel@vger.kernel.org
Subject: [Suspend2][ 03/16] [Suspend2] Save image.
Date: Tue, 27 Jun 2006 08:33:25 +1000 [thread overview]
Message-ID: <20060626223324.3832.71505.stgit@nigel.suspend2.net> (raw)
In-Reply-To: <20060626223314.3832.23435.stgit@nigel.suspend2.net>
Save the image. The first function is the one called by the suspend_main
after the image is prepared, which saves pageset two (LRU pages) and then
sends us into the atomic copy routine. After resume (or the cycle is
cancelled), we return back to this routine. Save_image_part1, is called
after the atomic copy, to do the saving of that part of the image.
Signed-off-by: Nigel Cunningham <nigel@suspend2.net>
kernel/power/suspend.c | 138 ++++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 138 insertions(+), 0 deletions(-)
diff --git a/kernel/power/suspend.c b/kernel/power/suspend.c
index 01c930a..8ef1200 100644
--- a/kernel/power/suspend.c
+++ b/kernel/power/suspend.c
@@ -231,3 +231,141 @@ int suspend_start_anything(int starting_
return 0;
}
+/*
+ * save_image
+ * Result code (int): Zero on success, non zero on failure.
+ * Functionality : High level routine which performs the steps necessary
+ * to prepare and save the image after preparatory steps
+ * have been taken.
+ * Key Assumptions : Processes frozen, sufficient memory available, drivers
+ * suspended.
+ * Called from : suspend_suspend_2
+ */
+static int save_image(void)
+{
+ int temp_result;
+
+ suspend_message(SUSPEND_ANY_SECTION, SUSPEND_LOW, 1,
+ " - Final values: %d and %d.\n",
+ pagedir1.pageset_size,
+ pagedir2.pageset_size);
+
+ suspend_cond_pause(1, "About to write pagedir2.");
+
+ temp_result = write_pageset(&pagedir2, 2);
+
+ if (temp_result == -1 || test_result_state(SUSPEND_ABORTED))
+ return -1;
+
+ suspend_cond_pause(1, "About to copy pageset 1.");
+
+ if (test_result_state(SUSPEND_ABORTED))
+ return -1;
+
+ suspend_deactivate_storage(1);
+
+ suspend_prepare_status(DONT_CLEAR_BAR, "Doing atomic copy.");
+
+ suspend2_running = 1; /* For the swsusp code we use :< */
+
+ suspend2_in_suspend = 1;
+
+ if (device_suspend(PMSG_FREEZE))
+ return 1;
+
+ suspend2_suspend();
+
+ suspend2_running = 0;
+
+ device_resume();
+
+ /* Resume time? */
+ if (!suspend2_in_suspend) {
+ copyback_post();
+ return 0;
+ }
+
+ /* Nope. Suspending. So, see if we can save the image... */
+ if (!save_image_part1()) {
+ suspend_power_down();
+
+ if (read_pageset2(1))
+ panic("Attempt to reload pagedir 2 failed. Try rebooting.");
+
+ if (!test_result_state(SUSPEND_ABORT_REQUESTED) &&
+ !test_action_state(SUSPEND_TEST_FILTER_SPEED) &&
+ !test_action_state(SUSPEND_TEST_BIO) &&
+ suspend_powerdown_method != PM_SUSPEND_MEM)
+ printk(KERN_EMERG name_suspend
+ "Suspend failed, trying to recover...\n");
+ barrier();
+ mb();
+ }
+
+ return 0;
+}
+
+/*
+ * Save the second part of the image.
+ */
+int save_image_part1(void)
+{
+ int temp_result;
+
+ if (suspend_activate_storage(1))
+ panic("Failed to reactivate our storage.");
+
+ suspend_update_status(pagedir2.pageset_size,
+ pagedir1.pageset_size + pagedir2.pageset_size,
+ NULL);
+
+ if (test_result_state(SUSPEND_ABORTED))
+ goto abort_reloading_pagedir_two;
+
+ suspend_cond_pause(1, "About to write pageset1.");
+
+ /*
+ * End of critical section.
+ */
+
+ suspend_message(SUSPEND_ANY_SECTION, SUSPEND_LOW, 1,
+ "-- Writing pageset1\n");
+
+ temp_result = write_pageset(&pagedir1, 1);
+
+ /* We didn't overwrite any memory, so no reread needs to be done. */
+ if (test_action_state(SUSPEND_TEST_FILTER_SPEED))
+ return -1;
+
+ if (temp_result == -1 || test_result_state(SUSPEND_ABORTED))
+ goto abort_reloading_pagedir_two;
+
+ suspend_cond_pause(1, "About to write header.");
+
+ if (test_result_state(SUSPEND_ABORTED))
+ goto abort_reloading_pagedir_two;
+
+ temp_result = write_image_header();
+
+ if (test_action_state(SUSPEND_TEST_BIO))
+ return -1;
+
+ if (temp_result || (test_result_state(SUSPEND_ABORTED)))
+ goto abort_reloading_pagedir_two;
+
+ suspend_cond_pause(1, "About to power down or reboot.");
+
+ return 0;
+
+abort_reloading_pagedir_two:
+ temp_result = read_pageset2(1);
+
+ /* If that failed, we're sunk. Panic! */
+ if (temp_result)
+ panic("Attempt to reload pagedir 2 while aborting "
+ "a suspend failed.");
+
+ return -1;
+
+}
+
--
Nigel Cunningham nigel at suspend2 dot net
next prev parent reply other threads:[~2006-06-26 23:41 UTC|newest]
Thread overview: 17+ messages / expand[flat|nested] mbox.gz Atom feed top
2006-06-26 22:33 [Suspend2][ 00/16] Suspend.c Nigel Cunningham
2006-06-26 22:33 ` [Suspend2][ 01/16] [Suspend2] Suspend.c header Nigel Cunningham
2006-06-26 22:33 ` [Suspend2][ 02/16] [Suspend2] Routines called when starting or finishing anything Nigel Cunningham
2006-06-26 22:33 ` Nigel Cunningham [this message]
2006-06-26 22:33 ` [Suspend2][ 04/16] [Suspend2] Get debug info Nigel Cunningham
2006-06-26 22:33 ` [Suspend2][ 05/16] [Suspend2] Allocate/free bitmaps Nigel Cunningham
2006-06-26 22:33 ` [Suspend2][ 06/16] [Suspend2] Check if still keeping an existing image Nigel Cunningham
2006-06-26 22:33 ` [Suspend2][ 07/16] [Suspend2] Suspend2 init/cleanup Nigel Cunningham
2006-06-26 22:33 ` [Suspend2][ 08/16] [Suspend2] Can suspend? Nigel Cunningham
2006-06-26 22:33 ` [Suspend2][ 09/16] [Suspend2] Top level routine for do_suspend Nigel Cunningham
2006-06-26 22:33 ` [Suspend2][ 10/16] [Suspend2] Image exists proc entry Nigel Cunningham
2006-06-26 22:33 ` [Suspend2][ 11/16] [Suspend2] General proc entries for suspend Nigel Cunningham
2006-06-26 22:33 ` [Suspend2][ 12/16] [Suspend2] Core load routine Nigel Cunningham
2006-06-26 22:34 ` [Suspend2][ 13/16] [Suspend2] do_resume routine Nigel Cunningham
2006-06-26 22:34 ` [Suspend2][ 14/16] [Suspend2] Try to suspend Nigel Cunningham
2006-06-26 22:34 ` [Suspend2][ 15/16] [Suspend2] __init routines Nigel Cunningham
2006-06-26 22:34 ` [Suspend2][ 16/16] [Suspend2] Suspend,c header file Nigel Cunningham
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=20060626223324.3832.71505.stgit@nigel.suspend2.net \
--to=nigel@suspend2.net \
--cc=linux-kernel@vger.kernel.org \
/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
Powered by JetHome