From: Nigel Cunningham <nigel@suspend2.net>
To: linux-kernel@vger.kernel.org
Subject: [Suspend2][ 14/20] [Suspend2] Update the image.
Date: Tue, 27 Jun 2006 08:35:35 +1000 [thread overview]
Message-ID: <20060626223533.4050.88908.stgit@nigel.suspend2.net> (raw)
In-Reply-To: <20060626223446.4050.9897.stgit@nigel.suspend2.net>
Recalculate what is needed in terms of storage and memory, and seek to
fulfil those allocations. The return value indicates whether all of the
prerequisites for moving on to writing the image have been met.
Signed-off-by: Nigel Cunningham <nigel@suspend2.net>
kernel/power/prepare_image.c | 89 ++++++++++++++++++++++++++++++++++++++++++
1 files changed, 89 insertions(+), 0 deletions(-)
diff --git a/kernel/power/prepare_image.c b/kernel/power/prepare_image.c
index 4e012a7..a23722d 100644
--- a/kernel/power/prepare_image.c
+++ b/kernel/power/prepare_image.c
@@ -402,3 +402,92 @@ static void try_freeze_processes(void)
}
}
+/* update_image
+ *
+ * Allocate [more] memory and storage for the image.
+ */
+static int update_image(void)
+{
+ int result2, param_used;
+
+ suspend_recalculate_image_contents(0);
+
+ /* Include allowance for growth in pagedir1 while writing pagedir 2 */
+ if (suspend_allocate_extra_pagedir_memory(&pagedir1,
+ pagedir1.pageset_size + extra_pd1_pages_allowance,
+ pageset2_sizelow)) {
+ suspend_message(SUSPEND_EAT_MEMORY, SUSPEND_LOW, 1,
+ "Still need to get more pages for pagedir 1.\n");
+ return 1;
+ }
+
+ thaw_processes(FREEZER_KERNEL_THREADS);
+
+ param_used = main_storage_needed(1, 0);
+ if ((result2 = suspend_active_writer->allocate_storage(param_used))) {
+ suspend_message(SUSPEND_EAT_MEMORY, SUSPEND_LOW, 1,
+ "Allocate storage returned %d. Still need to get more"
+ " storage space for the image proper.\n",
+ result2);
+ storage_allocated = suspend_active_writer->storage_allocated();
+ try_freeze_processes();
+ return 1;
+ }
+
+ /*
+ * Allocate remaining storage space, if possible, up to the
+ * maximum we know we'll need. It's okay to allocate the
+ * maximum if the writer is the swapwriter, but
+ * we don't want to grab all available space on an NFS share.
+ * We therefore ignore the expected compression ratio here,
+ * thereby trying to allocate the maximum image size we could
+ * need (assuming compression doesn't expand the image), but
+ * don't complain if we can't get the full amount we're after.
+ */
+
+ suspend_active_writer->allocate_storage(
+ min(storage_available, main_storage_needed(0, 1)));
+
+ storage_allocated = suspend_active_writer->storage_allocated();
+
+ /* Allocate the header storage after allocating main storage
+ * so that the overhead for metadata doesn't change the amount
+ * of storage needed for the header itself.
+ */
+
+ param_used = header_storage_needed();
+
+ result2 = suspend_active_writer->allocate_header_space(param_used);
+
+ try_freeze_processes();
+
+ if (result2) {
+ suspend_message(SUSPEND_EAT_MEMORY, SUSPEND_LOW, 1,
+ "Still need to get more storage space for header.\n");
+ return 1;
+ }
+
+ header_space_allocated = param_used;
+
+ suspend_recalculate_image_contents(0);
+
+ suspend_message(SUSPEND_EAT_MEMORY, SUSPEND_LOW, 1,
+ "Amount still needed (%d) > 0:%d. Header: %d < %d: %d,"
+ " Storage allocd: %d < %d + %d: %d.\n",
+ amount_needed(0),
+ (amount_needed(0) > 0),
+ header_space_allocated, header_storage_needed(),
+ header_space_allocated < header_storage_needed(),
+ storage_allocated,
+ header_storage_needed(), main_storage_needed(1, 1),
+ storage_allocated <
+ (header_storage_needed() + main_storage_needed(1, 1)));
+
+ suspend_cond_pause(0, NULL);
+
+ return ((amount_needed(0) > 0) ||
+ header_space_allocated < header_storage_needed() ||
+ storage_allocated <
+ (header_storage_needed() + main_storage_needed(1, 1)));
+}
+
--
Nigel Cunningham nigel at suspend2 dot net
next prev parent reply other threads:[~2006-06-26 22:36 UTC|newest]
Thread overview: 25+ messages / expand[flat|nested] mbox.gz Atom feed top
2006-06-26 22:34 [Suspend2][ 00/20] Prepare image Nigel Cunningham
2006-06-26 22:34 ` [Suspend2][ 01/20] [Suspend2] Prepare_image.c header Nigel Cunningham
2006-06-26 22:34 ` [Suspend2][ 02/20] [Suspend2] Get number of pcp pages Nigel Cunningham
2006-06-26 22:34 ` [Suspend2][ 03/20] [Suspend2] Get the real number of free pages (incl. pcp) Nigel Cunningham
2006-06-26 22:35 ` [Suspend2][ 04/20] [Suspend2] Calculate pagedir1 growth allowance Nigel Cunningham
2006-06-26 22:35 ` [Suspend2][ 05/20] [Suspend2] Get the amount of storage needed for the image proper Nigel Cunningham
2006-06-26 22:35 ` [Suspend2][ 06/20] [Suspend2] Calculate header storage needed Nigel Cunningham
2006-06-26 22:35 ` [Suspend2][ 07/20] [Suspend2] Display image vital statistics Nigel Cunningham
2006-06-26 22:35 ` [Suspend2][ 08/20] [Suspend2] Generate free page bitmap Nigel Cunningham
2006-06-26 22:35 ` [Suspend2][ 09/20] [Suspend2] Get size of a free region Nigel Cunningham
2006-06-26 22:35 ` [Suspend2][ 10/20] [Suspend2] Count pages in image parts Nigel Cunningham
2006-06-26 22:35 ` [Suspend2][ 11/20] [Suspend2] Amount of memory still to be freed Nigel Cunningham
2006-06-26 22:35 ` [Suspend2][ 12/20] [Suspend2] Recalculate image contents Nigel Cunningham
2006-06-26 22:35 ` [Suspend2][ 13/20] [Suspend2] Try to refreeze processes Nigel Cunningham
2006-06-26 22:35 ` Nigel Cunningham [this message]
2006-06-26 22:35 ` [Suspend2][ 15/20] [Suspend2] Attempt to freeze processes Nigel Cunningham
2006-06-27 13:45 ` Pavel Machek
2006-06-27 23:38 ` Nigel Cunningham
2006-06-28 18:59 ` Hugh Dickins
2006-06-28 22:10 ` Nigel Cunningham
2006-06-26 22:35 ` [Suspend2][ 16/20] [Suspend2] Calculate storage needed for an image Nigel Cunningham
2006-06-26 22:35 ` [Suspend2][ 17/20] [Suspend2] Calculate the amount of free memory needed Nigel Cunningham
2006-06-26 22:35 ` [Suspend2][ 18/20] [Suspend2] Free up memory if necessary Nigel Cunningham
2006-06-26 22:35 ` [Suspend2][ 19/20] [Suspend2] Prepare an image Nigel Cunningham
2006-06-26 22:35 ` [Suspend2][ 20/20] [Suspend2] Prepare image 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=20060626223533.4050.88908.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