[PATCH 04/12] powerpc: mark pages that dont exist as Nosave

Johannes Berg
2007-02-07T12:45:40Z

[-- Attachment #1: powerpc-mark-nonram-nosave.patch --]
[-- Type: text/plain, Size: 1664 bytes --]

On some powerpc architectures (notably 64-bit powermac) there is a memory
hole, for example on powermacs between 2G and 4G. Since we use the flat
memory model regardless, these pages must be marked as Nosave (for suspend
to disk.)

Signed-off-by: Johannes Berg <johannes@sipsolutions.net>
Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Cc: Rafael J. Wysocki <rjw@sisk.pl>

---
This replaces swsusp-dont-copy-pages-that-arent-ram.patch and works just as
well, except that it doesn't modify the generic code.

Tested on powerbook and powermac.

--- linux-2.6-git.orig/arch/powerpc/mm/mem.c 2007-02-07 02:55:03.319884289 +0100
+++ linux-2.6-git/arch/powerpc/mm/mem.c 2007-02-07 02:55:30.496884289 +0100
@@ -284,6 +284,27 @@ void __init do_init_bootmem(void)
init_bootmem_done = 1;
}

+/* mark lowmem pages that don't exist as nosave, highmem
+ * pages always exist but aren't treated as RAM pages */
+static int __init mark_nonram_nosave(void)
+{
+ struct zone *zone;
+ unsigned long pfn, max_zone_pfn;
+
+ for_each_zone(zone) {
+ if (is_highmem(zone))
+ continue;
+
+ max_zone_pfn = zone->zone_start_pfn + zone->spanned_pages;
+
+ for (pfn = zone->zone_start_pfn; pfn < max_zone_pfn; pfn++)
+ if (!page_is_ram(pfn))
+ SetPageNosave(pfn_to_page(pfn));
+ }
+
+ return 0;
+}
+
/*
* paging_init() sets up the page tables - in fact we've already done this.
*/
@@ -315,6 +336,8 @@ void __init paging_init(void)
max_zone_pfns[ZONE_DMA] = top_of_ram >> PAGE_SHIFT;
#endif
free_area_init_nodes(max_zone_pfns);
+
+ mark_nonram_nosave();
}
#endif /* ! CONFIG_NEED_MULTIPLE_NODES */

--