aboutsummaryrefslogtreecommitdiffstats
path: root/mm/page_alloc.c
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2017-08-25 21:02:27 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2017-08-25 21:02:27 -0400
commitb3242dba9ff285962fe84d1135cafe9383d721f0 (patch)
treecf4399b9a45bca863a0b404bfc7edfeff670ab1e /mm/page_alloc.c
parent67a3b5cb33633f39db8809ae56c8c1752b541daa (diff)
parent91b540f98872a206ea1c49e4aa6ea8eed0886644 (diff)
Merge branch 'akpm' (patches from Andrew)
Merge misc fixes from Andrew Morton: "6 fixes" * emailed patches from Andrew Morton <akpm@linux-foundation.org>: mm/memblock.c: reversed logic in memblock_discard() fork: fix incorrect fput of ->exe_file causing use-after-free mm/madvise.c: fix freeing of locked page with MADV_FREE dax: fix deadlock due to misaligned PMD faults mm, shmem: fix handling /sys/kernel/mm/transparent_hugepage/shmem_enabled PM/hibernate: touch NMI watchdog when creating snapshot
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);