| From 2a4e783b082cbaf221240215c35a338fd8582bce Mon Sep 17 00:00:00 2001 |
| From: "Kirill A. Shutemov" <kirill.shutemov@linux.intel.com> |
| Date: Thu, 13 Apr 2017 14:56:28 -0700 |
| Subject: [PATCH] thp: fix MADV_DONTNEED vs clear soft dirty race |
| |
| commit 5b7abeae3af8c08c577e599dd0578b9e3ee6687b upstream. |
| |
| Yet another instance of the same race. |
| |
| Fix is identical to change_huge_pmd(). |
| |
| See "thp: fix MADV_DONTNEED vs. numa balancing race" for more details. |
| |
| Link: http://lkml.kernel.org/r/20170302151034.27829-5-kirill.shutemov@linux.intel.com |
| Signed-off-by: Kirill A. Shutemov <kirill.shutemov@linux.intel.com> |
| Cc: Andrea Arcangeli <aarcange@redhat.com> |
| Cc: Hillf Danton <hillf.zj@alibaba-inc.com> |
| Cc: <stable@vger.kernel.org> |
| Signed-off-by: Andrew Morton <akpm@linux-foundation.org> |
| Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org> |
| Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com> |
| |
| diff --git a/fs/proc/task_mmu.c b/fs/proc/task_mmu.c |
| index f6fa99eca515..431551db3f05 100644 |
| --- a/fs/proc/task_mmu.c |
| +++ b/fs/proc/task_mmu.c |
| @@ -906,7 +906,14 @@ static inline void clear_soft_dirty(struct vm_area_struct *vma, |
| static inline void clear_soft_dirty_pmd(struct vm_area_struct *vma, |
| unsigned long addr, pmd_t *pmdp) |
| { |
| - pmd_t pmd = pmdp_huge_get_and_clear(vma->vm_mm, addr, pmdp); |
| + pmd_t pmd = *pmdp; |
| + |
| + /* See comment in change_huge_pmd() */ |
| + pmdp_invalidate(vma, addr, pmdp); |
| + if (pmd_dirty(*pmdp)) |
| + pmd = pmd_mkdirty(pmd); |
| + if (pmd_young(*pmdp)) |
| + pmd = pmd_mkyoung(pmd); |
| |
| pmd = pmd_wrprotect(pmd); |
| pmd = pmd_clear_soft_dirty(pmd); |
| -- |
| 2.12.0 |
| |