On Tue, Feb 12, 2019 at 10:56:21AM +0800, Peter Xu wrote: > 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 <peterx@xxxxxxxxxx> Reviewed-by: Mike Rapoport <rppt@xxxxxxxxxxxxx> > --- > mm/huge_memory.c | 8 ++++++++ > mm/memory.c | 8 ++++++++ > 2 files changed, 16 insertions(+) > > diff --git a/mm/huge_memory.c b/mm/huge_memory.c > index 817335b443c2..fb2234cb595a 100644 > --- a/mm/huge_memory.c > +++ b/mm/huge_memory.c > @@ -938,6 +938,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); > diff --git a/mm/memory.c b/mm/memory.c > index b5d67bafae35..c2035539e9fd 100644 > --- a/mm/memory.c > +++ b/mm/memory.c > @@ -788,6 +788,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); > -- > 2.17.1 > -- Sincerely yours, Mike.