summaryrefslogtreecommitdiffstats
path: root/kernel/power/snapshot.c
diff options
context:
space:
mode:
authorAnisse Astier <anisse@astier.eu>2016-09-09 04:43:32 -0400
committerRafael J. Wysocki <rafael.j.wysocki@intel.com>2016-09-12 20:35:27 -0400
commit1ad1410f632d4141221634308a5e56f339f92009 (patch)
treeabe5eb613d5142ab3b8a6f273c1fd26efef8ffc2 /kernel/power/snapshot.c
parentfa7fd6fa38e36d88bc9f2d0e45e5b9bd0387079f (diff)
PM / Hibernate: allow hibernation with PAGE_POISONING_ZERO
PAGE_POISONING_ZERO disables zeroing new pages on alloc, they are poisoned (zeroed) as they become available. In the hibernate use case, free pages will appear in the system without being cleared, left there by the loading kernel. This patch will make sure free pages are cleared on resume when PAGE_POISONING_ZERO is enabled. We free the pages just after resume because we can't do it later: going through any device resume code might allocate some memory and invalidate the free pages bitmap. Thus we don't need to disable hibernation when PAGE_POISONING_ZERO is enabled. Signed-off-by: Anisse Astier <anisse@astier.eu> Reviewed-by: Kees Cook <keescook@chromium.org> Acked-by: Pavel Machek <pavel@ucw.cz> Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
Diffstat (limited to 'kernel/power/snapshot.c')
-rw-r--r--kernel/power/snapshot.c22
1 files changed, 22 insertions, 0 deletions
diff --git a/kernel/power/snapshot.c b/kernel/power/snapshot.c
index b02228411d57..4f0f0604f1c4 100644
--- a/kernel/power/snapshot.c
+++ b/kernel/power/snapshot.c
@@ -1132,6 +1132,28 @@ void free_basic_memory_bitmaps(void)
1132 pr_debug("PM: Basic memory bitmaps freed\n"); 1132 pr_debug("PM: Basic memory bitmaps freed\n");
1133} 1133}
1134 1134
1135void clear_free_pages(void)
1136{
1137#ifdef CONFIG_PAGE_POISONING_ZERO
1138 struct memory_bitmap *bm = free_pages_map;
1139 unsigned long pfn;
1140
1141 if (WARN_ON(!(free_pages_map)))
1142 return;
1143
1144 memory_bm_position_reset(bm);
1145 pfn = memory_bm_next_pfn(bm);
1146 while (pfn != BM_END_OF_MAP) {
1147 if (pfn_valid(pfn))
1148 clear_highpage(pfn_to_page(pfn));
1149
1150 pfn = memory_bm_next_pfn(bm);
1151 }
1152 memory_bm_position_reset(bm);
1153 pr_info("PM: free pages cleared after restore\n");
1154#endif /* PAGE_POISONING_ZERO */
1155}
1156
1135/** 1157/**
1136 * snapshot_additional_pages - Estimate the number of extra pages needed. 1158 * snapshot_additional_pages - Estimate the number of extra pages needed.
1137 * @zone: Memory zone to carry out the computation for. 1159 * @zone: Memory zone to carry out the computation for.