mirror of
git://git.kernel.org/pub/scm/linux/kernel/git/xiang/erofs.git
synced 2026-10-31 14:23:49 +01:00
userfaultfd: wp: drop _PAGE_UFFD_WP properly when fork
UFFD_EVENT_FORK support for uffd-wp should be already there, except that we should clean the uffd-wp bit if uffd fork event is not enabled. Detect that to avoid _PAGE_UFFD_WP being set even if the VMA is not being tracked by VM_UFFD_WP. Do this for both small PTEs and huge PMDs. Signed-off-by: Peter Xu <[email protected]> Signed-off-by: Andrew Morton <[email protected]> Reviewed-by: Jerome Glisse <[email protected]> Reviewed-by: Mike Rapoport <[email protected]> Cc: Andrea Arcangeli <[email protected]> Cc: Bobby Powers <[email protected]> Cc: Brian Geffon <[email protected]> Cc: David Hildenbrand <[email protected]> Cc: Denis Plotnikov <[email protected]> Cc: "Dr . David Alan Gilbert" <[email protected]> Cc: Hugh Dickins <[email protected]> Cc: Johannes Weiner <[email protected]> Cc: "Kirill A . Shutemov" <[email protected]> Cc: Martin Cracauer <[email protected]> Cc: Marty McFadden <[email protected]> Cc: Maya Gokhale <[email protected]> Cc: Mel Gorman <[email protected]> Cc: Mike Kravetz <[email protected]> Cc: Pavel Emelyanov <[email protected]> Cc: Rik van Riel <[email protected]> Cc: Shaohua Li <[email protected]> Link: http://lkml.kernel.org/r/[email protected] Signed-off-by: Linus Torvalds <[email protected]>
This commit is contained in:
1 parent
292924b260
commit
b569a17607
2 files changed
+16
No files matched your search
@@ -1044,6 +1044,14 @@ int copy_huge_pmd(struct mm_struct *dst_mm, struct mm_struct *src_mm,
|
||||
ret = -EAGAIN;
|
||||
pmd = *src_pmd;
|
||||
|
||||
/*
|
||||
* Make sure the _PAGE_UFFD_WP bit is cleared if the new VMA
|
||||
* does not have the VM_UFFD_WP, which means that the uffd
|
||||
* fork event is not enabled.
|
||||
*/
|
||||
if (!(vma->vm_flags & VM_UFFD_WP))
|
||||
pmd = pmd_clear_uffd_wp(pmd);
|
||||
|
||||
#ifdef CONFIG_ARCH_ENABLE_THP_MIGRATION
|
||||
if (unlikely(is_swap_pmd(pmd))) {
|
||||
swp_entry_t entry = pmd_to_swp_entry(pmd);
|
||||
|
||||
@@ -785,6 +785,14 @@ copy_one_pte(struct mm_struct *dst_mm, struct mm_struct *src_mm,
|
||||
pte = pte_mkclean(pte);
|
||||
pte = pte_mkold(pte);
|
||||
|
||||
/*
|
||||
* Make sure the _PAGE_UFFD_WP bit is cleared if the new VMA
|
||||
* does not have the VM_UFFD_WP, which means that the uffd
|
||||
* fork event is not enabled.
|
||||
*/
|
||||
if (!(vm_flags & VM_UFFD_WP))
|
||||
pte = pte_clear_uffd_wp(pte);
|
||||
|
||||
page = vm_normal_page(vma, addr, pte);
|
||||
if (page) {
|
||||
get_page(page);
|
||||
|
||||
Reference in new issue
Block a user