if (error)
                printk(KERN_ERR "PM: Error %d creating hibernation image\n",
                        error);
-       if (!in_suspend)
+       if (!in_suspend) {
                events_check_enabled = false;
+               clear_free_pages();
+       }
 
        platform_leave(platform_mode);
 
        return 1;
 }
 
-static int __init page_poison_nohibernate_setup(char *str)
-{
-#ifdef CONFIG_PAGE_POISONING_ZERO
-       /*
-        * The zeroing option for page poison skips the checks on alloc.
-        * since hibernation doesn't save free pages there's no way to
-        * guarantee the pages will still be zeroed.
-        */
-       if (!strcmp(str, "on")) {
-               pr_info("Disabling hibernation due to page poisoning\n");
-               return nohibernate_setup(str);
-       }
-#endif
-       return 1;
-}
-
 __setup("noresume", noresume_setup);
 __setup("resume_offset=", resume_offset_setup);
 __setup("resume=", resume_setup);
 __setup("resumewait", resumewait_setup);
 __setup("resumedelay=", resumedelay_setup);
 __setup("nohibernate", nohibernate_setup);
-__setup("page_poison=", page_poison_nohibernate_setup);
 
 extern void free_basic_memory_bitmaps(void);
 extern int hibernate_preallocate_memory(void);
 
+extern void clear_free_pages(void);
+
 /**
  *     Auxiliary structure used for reading the snapshot image data and
  *     metadata from and writing them to the list of page backup entries
 
        pr_debug("PM: Basic memory bitmaps freed\n");
 }
 
+void clear_free_pages(void)
+{
+#ifdef CONFIG_PAGE_POISONING_ZERO
+       struct memory_bitmap *bm = free_pages_map;
+       unsigned long pfn;
+
+       if (WARN_ON(!(free_pages_map)))
+               return;
+
+       memory_bm_position_reset(bm);
+       pfn = memory_bm_next_pfn(bm);
+       while (pfn != BM_END_OF_MAP) {
+               if (pfn_valid(pfn))
+                       clear_highpage(pfn_to_page(pfn));
+
+               pfn = memory_bm_next_pfn(bm);
+       }
+       memory_bm_position_reset(bm);
+       pr_info("PM: free pages cleared after restore\n");
+#endif /* PAGE_POISONING_ZERO */
+}
+
 /**
  * snapshot_additional_pages - Estimate the number of extra pages needed.
  * @zone: Memory zone to carry out the computation for.