diff options
Diffstat (limited to 'mm/page_alloc.c')
-rw-r--r-- | mm/page_alloc.c | 20 |
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 | |||
2538 | void mark_free_pages(struct zone *zone) | 2544 | void 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); |