Patch "thp: fix MADV_DONTNEED vs. MADV_FREE race" has been added to the 4.10-stable tree
Subsystems (3)
This is a note to let you know that I've just added the patch titled
thp: fix MADV_DONTNEED vs. MADV_FREE race
to the 4.10-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
thp-fix-madv_dontneed-vs.-madv_free-race.patch
and it can be found in the queue-4.10 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Quoted 1 line
From
58ceeb6bec86d9140f9d91d71a710e963523d063Mon Sep 17 00:00:00 2001
From: "Kirill A. Shutemov" <[email protected]>
Date: Thu, 13 Apr 2017 14:56:26 -0700
Subject: thp: fix MADV_DONTNEED vs. MADV_FREE race
From: Kirill A. Shutemov <[email protected]>
commit 58ceeb6bec86d9140f9d91d71a710e963523d063 upstream.
Both MADV_DONTNEED and MADV_FREE handled with down_read(mmap_sem).
It's critical to not clear pmd intermittently while handling MADV_FREE to avoid race with MADV_DONTNEED:
CPU0: CPU1: madvise_free_huge_pmd() pmdp_huge_get_and_clear_full()
madvise_dontneed()
zap_pmd_range()
pmd_trans_huge(*pmd) == 0 (without ptl)
// skip the pmd
set_pmd_at(); // pmd is re-established
It results in MADV_DONTNEED skipping the pmd, leaving it not cleared. It violates MADV_DONTNEED interface and can result is userspace misbehaviour.
Basically it's the same race as with numa balancing in change_huge_pmd(), but a bit simpler to mitigate: we don't need to preserve dirty/young flags here due to MADV_FREE functionality.
--- mm/huge_memory.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-)
mm/huge_memory.c +1 -2
@@ -1393,8 +1393,7 @@ bool madvise_free_huge_pmd(struct mmu_gadeactivate_page (page);if (pmd_young (orig_pmd) ||pmd_dirty (orig_pmd)) { - orig_pmd =pmdp_huge_get_and_clear_full (tlb->mm, addr, pmd, - tlb->fullmm); +pmdp_invalidate (vma, addr, pmd); orig_pmd =pmd_mkold (orig_pmd); orig_pmd =pmd_mkclean (orig_pmd);
Patches currently in stable-queue which might be from [email protected] are
queue-4.10/thp-fix-madv_dontneed-vs-clear-soft-dirty-race.patch queue-4.10/thp-fix-madv_dontneed-vs.-madv_free-race.patch