diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2017-08-25 21:02:27 -0400 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2017-08-25 21:02:27 -0400 |
| commit | b3242dba9ff285962fe84d1135cafe9383d721f0 (patch) | |
| tree | cf4399b9a45bca863a0b404bfc7edfeff670ab1e /mm/page_alloc.c | |
| parent | 67a3b5cb33633f39db8809ae56c8c1752b541daa (diff) | |
| parent | 91b540f98872a206ea1c49e4aa6ea8eed0886644 (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.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); |
