From 188e89fd8ca830020aa82687335b87d67ea08a50 Mon Sep 17 00:00:00 2001 From: "Liam R. Howlett" Date: Tue, 28 Oct 2025 20:53:47 -0400 Subject: [PATCH] mm/userfaultfd: Don't pass dst_mm, use ctx in uffd_mfill_lock() dst_mm isn't used in the calling function, so just figure it out when necessary. Signed-off-by: Liam R. Howlett --- include/linux/userfaultfd_k.h | 4 +++- mm/userfaultfd.c | 11 ++++++----- 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/include/linux/userfaultfd_k.h b/include/linux/userfaultfd_k.h index 1dc55425f9d2..311ce37b9159 100644 --- a/include/linux/userfaultfd_k.h +++ b/include/linux/userfaultfd_k.h @@ -97,6 +97,7 @@ struct uffd_info { unsigned long src_addr; /* Source address */ unsigned long len; /* Total length to copy */ struct folio *foliop; /* folio pointer for retry */ + struct userfaultfd_ctx *ctx; /* The userfaultfd context */ struct vm_area_struct *dst_vma; /* Target vma */ unsigned long increment; /* Size of each operation */ @@ -105,11 +106,12 @@ struct uffd_info { int (*op)(struct uffd_info *info); /* The operation to perform on the dst */ }; -#define UFFD_STRUCT_INIT(__dst_addr, __src_addr, __len, __wp) { \ +#define UFFD_STRUCT_INIT(__dst_addr, __src_addr, __len, __ctx, __wp) { \ .dst_addr = (__dst_addr), \ .src_addr = (__src_addr), \ .len = (__len), \ .wp = (__wp), \ + .ctx = (__ctx), \ .foliop = NULL, \ } diff --git a/mm/userfaultfd.c b/mm/userfaultfd.c index 90e07c8568aa..e3cda2dad3e1 100644 --- a/mm/userfaultfd.c +++ b/mm/userfaultfd.c @@ -96,8 +96,9 @@ static struct vm_area_struct *uffd_lock_vma(struct mm_struct *mm, return vma; } -static int uffd_mfill_lock(struct mm_struct *dst_mm, struct uffd_info *us) +static int uffd_mfill_lock(struct uffd_info *us) { + struct mm_struct *dst_mm = us->ctx->mm; struct vm_area_struct *dst_vma; dst_vma = uffd_lock_vma(dst_mm, us->dst_addr); @@ -120,8 +121,9 @@ static void uffd_mfill_unlock(struct vm_area_struct *vma) #else -static int uffd_mfill_lock(struct mm_struct *dst_mm, struct uffd_info *us) +static int uffd_mfill_lock(struct uffd_info *us) { + struct mm_struct *dst_mm = us->ctx->mm; struct vm_area_struct *dst_vma; mmap_read_lock(dst_mm); @@ -627,11 +629,10 @@ static __always_inline ssize_t mfill_atomic(struct userfaultfd_ctx *ctx, unsigned long len, uffd_flags_t flags) { - struct mm_struct *dst_mm = ctx->mm; struct vm_area_struct *dst_vma; ssize_t err; long copied; - struct uffd_info info = UFFD_STRUCT_INIT(dst_start, src_start, len, + struct uffd_info info = UFFD_STRUCT_INIT(dst_start, src_start, len, ctx, flags & MFILL_ATOMIC_WP); /* @@ -651,7 +652,7 @@ retry: * Make sure the vma is not shared, that the dst range is * both valid and fully within a single existing vma. */ - err = uffd_mfill_lock(dst_mm, &info); + err = uffd_mfill_lock(&info); if (err) goto out; -- 2.51.0