]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
mm/userfaultfd: Extract hugetlb recovery from mfill_atomic_hugetlb() loop
authorLiam R. Howlett <Liam.Howlett@oracle.com>
Thu, 23 Oct 2025 19:36:20 +0000 (15:36 -0400)
committerLiam R. Howlett <Liam.Howlett@oracle.com>
Thu, 30 Oct 2025 16:23:22 +0000 (12:23 -0400)
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 <Liam.Howlett@oracle.com>
mm/userfaultfd.c

index 8134f206c79349ed699ae98ccc412ea79c7f2eb5..c64c63a80e0f460e94df656aa176160d66f3d5f6 100644 (file)
@@ -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;