From: Nigel Cunningham <nigel@suspend2.net>
To: linux-kernel@vger.kernel.org
Subject: [Suspend2][ 7/9] [Suspend2] Relocate a piece of memory if required.
Date: Tue, 27 Jun 2006 08:34:36 +1000 [thread overview]
Message-ID: <20060626223435.3963.65981.stgit@nigel.suspend2.net> (raw)
In-Reply-To: <20060626223412.3963.1484.stgit@nigel.suspend2.net>
Given an address and size (never more than a page and never overlapping
page boundaries), relocate the data to an address that can be safely used
during the atomic restore if that relocation is necessary. The memory to be
freed might be slab or a normal page.
Signed-off-by: Nigel Cunningham <nigel@suspend2.net>
kernel/power/pagedir.c | 20 ++++++++++++++++++++
1 files changed, 20 insertions(+), 0 deletions(-)
diff --git a/kernel/power/pagedir.c b/kernel/power/pagedir.c
index 4cdc0ef..ec75e79 100644
--- a/kernel/power/pagedir.c
+++ b/kernel/power/pagedir.c
@@ -288,3 +288,23 @@ unsigned long suspend_get_nonconflicting
return (unsigned long) page_address(page);
}
+/* relocate_page_if_required
+ *
+ * Description: Given the address of a pointer to a page, we check if the page
+ * needs relocating and do so if needs be, adjusting the pointer
+ * too.
+ */
+
+void suspend_relocate_if_required(unsigned long *current_value, unsigned int size)
+{
+ if (PagePageset1(virt_to_page(*current_value))) {
+ unsigned long new_page = suspend_get_nonconflicting_page();
+ memcpy((char *) new_page, (char *) *current_value, size);
+ if (PageSlab(virt_to_page(*current_value)))
+ kfree((void *) *current_value);
+ else
+ free_page((unsigned long) *current_value);
+ *current_value = new_page;
+ }
+}
+
--
Nigel Cunningham nigel at suspend2 dot net
next prev parent reply other threads:[~2006-06-26 23:38 UTC|newest]
Thread overview: 10+ messages / expand[flat|nested] mbox.gz Atom feed top
2006-06-26 22:34 [Suspend2][ 0/9] Pagedir specific routines Nigel Cunningham
2006-06-26 22:34 ` [Suspend2][ 1/9] [Suspend2] Pagedir.c header Nigel Cunningham
2006-06-26 22:34 ` [Suspend2][ 2/9] [Suspend2] Free extra memory allocated for the atomic copy Nigel Cunningham
2006-06-26 22:34 ` [Suspend2][ 3/9] [Suspend2] Allocate extra memory " Nigel Cunningham
2006-06-26 22:34 ` [Suspend2][ 4/9] [Suspend2] Mark a task as pageset 1 Nigel Cunningham
2006-06-26 22:34 ` [Suspend2][ 5/9] [Suspend2] Mark pages for pageset 2 Nigel Cunningham
2006-06-26 22:34 ` [Suspend2][ 6/9] [Suspend2] Get nonconflicting page Nigel Cunningham
2006-06-26 22:34 ` Nigel Cunningham [this message]
2006-06-26 22:34 ` [Suspend2][ 8/9] [Suspend2] Get pageset1 load addresses Nigel Cunningham
2006-06-26 22:34 ` [Suspend2][ 9/9] [Suspend2] Header file for pagedir functions 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=20060626223435.3963.65981.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
all inboxes | Powered by JetHome®