[Suspend2][ 6/7] [Suspend2] Relocate pageflags.

From: Nigel Cunningham
Date: Mon Jun 26 2006 - 18:30:58 EST


Relocate dynamically allocated pageflags to locations that won't be
overwritten by the memory we're about to restore. This is used for
restoring highmem pages after we've done the atomic restore of low memory.

Signed-off-by: Nigel Cunningham <nigel@xxxxxxxxxxxx>

kernel/power/pageflags.c | 36 ++++++++++++++++++++++++++++++++++++
1 files changed, 36 insertions(+), 0 deletions(-)

diff --git a/kernel/power/pageflags.c b/kernel/power/pageflags.c
index 0b019de..b61b2a6 100644
--- a/kernel/power/pageflags.c
+++ b/kernel/power/pageflags.c
@@ -130,3 +130,39 @@ void load_dyn_pageflags(dyn_pageflags_t
}
}

+/* relocate_dyn_pageflags
+ *
+ * Description: Relocate a set of pageflags to ensure they don't collide with
+ * pageset 1 data which will get overwritten on copyback.
+ * Arguments: dyn_pageflags_t *: Pointer to the bitmap being relocated.
+ */
+
+void relocate_dyn_pageflags(dyn_pageflags_t *pagemap)
+{
+ int i, zone_num = 0;
+ struct zone *zone;
+
+ if (!*pagemap)
+ return;
+
+ suspend_relocate_if_required((void *) pagemap,
+ sizeof(void *) * num_zones());
+ BUG_ON(PagePageset1(virt_to_page(*pagemap)));
+
+ for_each_zone(zone) {
+ int pages = pages_for_zone(zone);
+
+ suspend_relocate_if_required((void *) &((*pagemap)[zone_num]),
+ sizeof(void *) * pages);
+ BUG_ON(PagePageset1(virt_to_page((*pagemap)[zone_num])));
+
+ for (i = 0; i < pages; i++) {
+ suspend_relocate_if_required(
+ (void *) &((*pagemap)[zone_num][i]),
+ PAGE_SIZE);
+ BUG_ON(PagePageset1(virt_to_page(
+ (*pagemap)[zone_num][i])));
+ }
+ zone_num++;
+ }
+}

--
Nigel Cunningham nigel at suspend2 dot net
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/