|
@@ -31,6 +31,7 @@
|
|
|
#include <linux/highmem.h>
|
|
|
#include <linux/initrd.h>
|
|
|
#include <linux/pagemap.h>
|
|
|
+#include <linux/suspend.h>
|
|
|
|
|
|
#include <asm/pgalloc.h>
|
|
|
#include <asm/prom.h>
|
|
@@ -276,6 +277,28 @@ void __init do_init_bootmem(void)
|
|
|
init_bootmem_done = 1;
|
|
|
}
|
|
|
|
|
|
+/* mark pages that don't exist as nosave */
|
|
|
+static int __init mark_nonram_nosave(void)
|
|
|
+{
|
|
|
+ unsigned long lmb_next_region_start_pfn,
|
|
|
+ lmb_region_max_pfn;
|
|
|
+ int i;
|
|
|
+
|
|
|
+ for (i = 0; i < lmb.memory.cnt - 1; i++) {
|
|
|
+ lmb_region_max_pfn =
|
|
|
+ (lmb.memory.region[i].base >> PAGE_SHIFT) +
|
|
|
+ (lmb.memory.region[i].size >> PAGE_SHIFT);
|
|
|
+ lmb_next_region_start_pfn =
|
|
|
+ lmb.memory.region[i+1].base >> PAGE_SHIFT;
|
|
|
+
|
|
|
+ if (lmb_region_max_pfn < lmb_next_region_start_pfn)
|
|
|
+ register_nosave_region(lmb_region_max_pfn,
|
|
|
+ lmb_next_region_start_pfn);
|
|
|
+ }
|
|
|
+
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
/*
|
|
|
* paging_init() sets up the page tables - in fact we've already done this.
|
|
|
*/
|
|
@@ -307,6 +330,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 */
|
|
|
|