aboutsummaryrefslogtreecommitdiffstats
path: root/mm/page_alloc.c
diff options
context:
space:
mode:
Diffstat (limited to 'mm/page_alloc.c')
-rw-r--r--mm/page_alloc.c20
1 files changed, 18 insertions, 2 deletions
diff --git a/mm/page_alloc.c b/mm/page_alloc.c
index 1bad301820c7..7a58eb5757e3 100644
--- a/mm/page_alloc.c
+++ b/mm/page_alloc.c
@@ -66,6 +66,7 @@
66#include <linux/kthread.h> 66#include <linux/kthread.h>
67#include <linux/memcontrol.h> 67#include <linux/memcontrol.h>
68#include <linux/ftrace.h> 68#include <linux/ftrace.h>
69#include <linux/nmi.h>
69 70
70#include <asm/sections.h> 71#include <asm/sections.h>
71#include <asm/tlbflush.h> 72#include <asm/tlbflush.h>
@@ -2535,9 +2536,14 @@ void drain_all_pages(struct zone *zone)
2535 2536
2536#ifdef CONFIG_HIBERNATION 2537#ifdef CONFIG_HIBERNATION
2537 2538
2539/*
2540 * Touch the watchdog for every WD_PAGE_COUNT pages.
2541 */
2542#define WD_PAGE_COUNT (128*1024)
2543
2538void mark_free_pages(struct zone *zone) 2544void mark_free_pages(struct zone *zone)
2539{ 2545{
2540 unsigned long pfn, max_zone_pfn; 2546 unsigned long pfn, max_zone_pfn, page_count = WD_PAGE_COUNT;
2541 unsigned long flags; 2547 unsigned long flags;
2542 unsigned int order, t; 2548 unsigned int order, t;
2543 struct page *page; 2549 struct page *page;
@@ -2552,6 +2558,11 @@ void mark_free_pages(struct zone *zone)
2552 if (pfn_valid(pfn)) { 2558 if (pfn_valid(pfn)) {
2553 page = pfn_to_page(pfn); 2559 page = pfn_to_page(pfn);
2554 2560
2561 if (!--page_count) {
2562 touch_nmi_watchdog();
2563 page_count = WD_PAGE_COUNT;
2564 }
2565
2555 if (page_zone(page) != zone) 2566 if (page_zone(page) != zone)
2556 continue; 2567 continue;
2557 2568
@@ -2565,8 +2576,13 @@ void mark_free_pages(struct zone *zone)
2565 unsigned long i; 2576 unsigned long i;
2566 2577
2567 pfn = page_to_pfn(page); 2578 pfn = page_to_pfn(page);
2568 for (i = 0; i < (1UL << order); i++) 2579 for (i = 0; i < (1UL << order); i++) {
2580 if (!--page_count) {
2581 touch_nmi_watchdog();
2582 page_count = WD_PAGE_COUNT;
2583 }
2569 swsusp_set_page_free(pfn_to_page(pfn + i)); 2584 swsusp_set_page_free(pfn_to_page(pfn + i));
2585 }
2570 } 2586 }
2571 } 2587 }
2572 spin_unlock_irqrestore(&zone->lock, flags); 2588 spin_unlock_irqrestore(&zone->lock, flags);