|
@@ -66,6 +66,7 @@
|
|
|
#include <linux/kthread.h>
|
|
|
#include <linux/memcontrol.h>
|
|
|
#include <linux/ftrace.h>
|
|
|
+#include <linux/nmi.h>
|
|
|
|
|
|
#include <asm/sections.h>
|
|
|
#include <asm/tlbflush.h>
|
|
@@ -2535,9 +2536,14 @@ void drain_all_pages(struct zone *zone)
|
|
|
|
|
|
#ifdef CONFIG_HIBERNATION
|
|
|
|
|
|
+/*
|
|
|
+ * Touch the watchdog for every WD_PAGE_COUNT pages.
|
|
|
+ */
|
|
|
+#define WD_PAGE_COUNT (128*1024)
|
|
|
+
|
|
|
void mark_free_pages(struct zone *zone)
|
|
|
{
|
|
|
- unsigned long pfn, max_zone_pfn;
|
|
|
+ unsigned long pfn, max_zone_pfn, page_count = WD_PAGE_COUNT;
|
|
|
unsigned long flags;
|
|
|
unsigned int order, t;
|
|
|
struct page *page;
|
|
@@ -2552,6 +2558,11 @@ void mark_free_pages(struct zone *zone)
|
|
|
if (pfn_valid(pfn)) {
|
|
|
page = pfn_to_page(pfn);
|
|
|
|
|
|
+ if (!--page_count) {
|
|
|
+ touch_nmi_watchdog();
|
|
|
+ page_count = WD_PAGE_COUNT;
|
|
|
+ }
|
|
|
+
|
|
|
if (page_zone(page) != zone)
|
|
|
continue;
|
|
|
|
|
@@ -2565,8 +2576,13 @@ void mark_free_pages(struct zone *zone)
|
|
|
unsigned long i;
|
|
|
|
|
|
pfn = page_to_pfn(page);
|
|
|
- for (i = 0; i < (1UL << order); i++)
|
|
|
+ for (i = 0; i < (1UL << order); i++) {
|
|
|
+ if (!--page_count) {
|
|
|
+ touch_nmi_watchdog();
|
|
|
+ page_count = WD_PAGE_COUNT;
|
|
|
+ }
|
|
|
swsusp_set_page_free(pfn_to_page(pfn + i));
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
spin_unlock_irqrestore(&zone->lock, flags);
|