From: Liam R. Howlett Date: Thu, 23 Oct 2025 19:36:20 +0000 (-0400) Subject: mm/userfaultfd: Extract hugetlb recovery from mfill_atomic_hugetlb() loop X-Git-Url: https://www.infradead.org/git/?a=commitdiff_plain;h=753417d0f1808fe6d709b934d9e39e3d1dede92d;p=users%2Fjedix%2Flinux-maple.git mm/userfaultfd: Extract hugetlb recovery from mfill_atomic_hugetlb() loop Abstracting the recovery of mfill_atomic_hugetlb() calls will lead to a unity of mfill_atomic() and mfill_atomic_hugetlb(). Since there is a uffd_ops function pointer for recovery already, this should be called hugetlb_failed_do_unlock() for a later patch. Signed-off-by: Liam R. Howlett --- diff --git a/mm/userfaultfd.c b/mm/userfaultfd.c index 8134f206c793..c64c63a80e0f 100644 --- a/mm/userfaultfd.c +++ b/mm/userfaultfd.c @@ -539,6 +539,18 @@ uffd_ctx_lock_and_validate_dst(struct userfaultfd_ctx *ctx, } #ifdef CONFIG_HUGETLB_PAGE +static +ssize_t hugetlb_failed_do_unlock(struct userfaultfd_ctx *ctx, + struct vm_area_struct *dst, struct folio *folio, + unsigned long src_addr) +{ + up_read(&ctx->map_changing_lock); + uffd_mfill_unlock(dst); + VM_WARN_ON_ONCE(!folio); + + return copy_folio_from_user(folio,(const void __user *)src_addr, true); +} + /* * mfill_atomic processing for HUGETLB vmas. Note that this routine is * called with either vma-lock or mmap_lock held, it will release the lock @@ -607,12 +619,8 @@ retry: cond_resched(); if (unlikely(err == -ENOENT)) { - up_read(&ctx->map_changing_lock); - uffd_mfill_unlock(dst_vma); - VM_WARN_ON_ONCE(!folio); - - err = copy_folio_from_user(folio, - (const void __user *)src_addr, true); + err = hugetlb_failed_do_unlock(ctx, dst_vma, folio, + src_addr); if (unlikely(err)) { err = -EFAULT; goto out;