On Mon, Mar 30, 2026 at 01:11:04PM +0300, Mike Rapoport wrote: > From: "Mike Rapoport (Microsoft)" <[email protected]> > > There is a lengthy code chunk in mfill_atomic() that establishes the PMD > for UFFDIO operations. This code may be called twice: first time when the > copy is performed with VMA/mm locks held and the other time after the copy > is retried with locks dropped. > > Move the code that establishes a PMD into a helper function so it can be > reused later during refactoring of mfill_atomic_pte_copy(). > > Signed-off-by: Mike Rapoport (Microsoft) <[email protected]> > ---
Looks good to me, Acked-by: Harry Yoo (Oracle) <[email protected]> > mm/userfaultfd.c | 102 ++++++++++++++++++++++++----------------------- > 1 file changed, 52 insertions(+), 50 deletions(-) > > diff --git a/mm/userfaultfd.c b/mm/userfaultfd.c > index fa9622ec7279..291e5cfed431 100644 > --- a/mm/userfaultfd.c > +++ b/mm/userfaultfd.c > +static int mfill_establish_pmd(struct mfill_state *state) > +{ > + struct mm_struct *dst_mm = state->ctx->mm; > + pmd_t *dst_pmd, dst_pmdval; > + > + dst_pmd = mm_alloc_pmd(dst_mm, state->dst_addr); > + if (unlikely(!dst_pmd)) > + return -ENOMEM; > + > + dst_pmdval = pmdp_get_lockless(dst_pmd); > + if (unlikely(pmd_none(dst_pmdval)) && > + unlikely(__pte_alloc(dst_mm, dst_pmd))) > + return -ENOMEM; > + > + dst_pmdval = pmdp_get_lockless(dst_pmd); > + /* > + * If the dst_pmd is THP don't override it and just be strict. > + * (This includes the case where the PMD used to be THP and > + * changed back to none after __pte_alloc().) > + */ > + if (unlikely(!pmd_present(dst_pmdval) || pmd_leaf(dst_pmdval))) Just noting: ^ this was pmd_trans_huge() but now it is pmd_leaf(). but since the present bit is separately checked and hugetlb vma is handled in a different path I don't expect functional change. > + return -EEXIST; > + if (unlikely(pmd_bad(dst_pmdval))) > + return -EFAULT; > + > + state->pmd = dst_pmd; > + return 0; > +} -- Cheers, Harry / Hyeonggon

