]> Gentwo Git Trees - linux/.git/commitdiff
io_uring/memmap: refactor io_free_region() to take user_struct param
authorDavid Wei <dw@davidwei.uk>
Tue, 4 Nov 2025 22:44:53 +0000 (14:44 -0800)
committerJens Axboe <axboe@kernel.dk>
Thu, 6 Nov 2025 23:23:21 +0000 (16:23 -0700)
Refactor io_free_region() to take user_struct directly, instead of
accessing it from the ring ctx.

Signed-off-by: David Wei <dw@davidwei.uk>
Reviewed-by: Pavel Begunkov <asml.silence@gmail.com>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
io_uring/io_uring.c
io_uring/kbuf.c
io_uring/memmap.c
io_uring/memmap.h
io_uring/register.c
io_uring/zcrx.c

index 2d49b48568ab2de668c85f7f47bad524bc9b9ec5..85081d7453b70f876f54210c6e163925f62c86a9 100644 (file)
@@ -2751,8 +2751,8 @@ static int io_cqring_wait(struct io_ring_ctx *ctx, int min_events, u32 flags,
 
 static void io_rings_free(struct io_ring_ctx *ctx)
 {
-       io_free_region(ctx, &ctx->sq_region);
-       io_free_region(ctx, &ctx->ring_region);
+       io_free_region(ctx->user, &ctx->sq_region);
+       io_free_region(ctx->user, &ctx->ring_region);
        ctx->rings = NULL;
        ctx->sq_sqes = NULL;
 }
@@ -2837,7 +2837,7 @@ static __cold void io_ring_ctx_free(struct io_ring_ctx *ctx)
        io_eventfd_unregister(ctx);
        io_free_alloc_caches(ctx);
        io_destroy_buffers(ctx);
-       io_free_region(ctx, &ctx->param_region);
+       io_free_region(ctx->user, &ctx->param_region);
        mutex_unlock(&ctx->uring_lock);
        if (ctx->sq_creds)
                put_cred(ctx->sq_creds);
index e271b44ff73e60ea886f7bb155c7531d35920e73..f1d644189068b12ed37ef41f56161e66460ca206 100644 (file)
@@ -417,7 +417,7 @@ static int io_remove_buffers_legacy(struct io_ring_ctx *ctx,
 static void io_put_bl(struct io_ring_ctx *ctx, struct io_buffer_list *bl)
 {
        if (bl->flags & IOBL_BUF_RING)
-               io_free_region(ctx, &bl->region);
+               io_free_region(ctx->user, &bl->region);
        else
                io_remove_buffers_legacy(ctx, bl, -1U);
 
@@ -661,7 +661,7 @@ int io_register_pbuf_ring(struct io_ring_ctx *ctx, void __user *arg)
        io_buffer_add_list(ctx, bl, reg.bgid);
        return 0;
 fail:
-       io_free_region(ctx, &bl->region);
+       io_free_region(ctx->user, &bl->region);
        kfree(bl);
        return ret;
 }
index 11be347a49d7c79067ce0dc93a26c0c11ae28b4c..24da17a5f08f9738990c03bc521d06044e59fb9e 100644 (file)
@@ -88,7 +88,7 @@ enum {
        IO_REGION_F_SINGLE_REF                  = 4,
 };
 
-void io_free_region(struct io_ring_ctx *ctx, struct io_mapped_region *mr)
+void io_free_region(struct user_struct *user, struct io_mapped_region *mr)
 {
        if (mr->pages) {
                long nr_refs = mr->nr_pages;
@@ -105,8 +105,8 @@ void io_free_region(struct io_ring_ctx *ctx, struct io_mapped_region *mr)
        }
        if ((mr->flags & IO_REGION_F_VMAP) && mr->ptr)
                vunmap(mr->ptr);
-       if (mr->nr_pages && ctx->user)
-               __io_unaccount_mem(ctx->user, mr->nr_pages);
+       if (mr->nr_pages && user)
+               __io_unaccount_mem(user, mr->nr_pages);
 
        memset(mr, 0, sizeof(*mr));
 }
@@ -226,7 +226,7 @@ int io_create_region(struct io_ring_ctx *ctx, struct io_mapped_region *mr,
                goto out_free;
        return 0;
 out_free:
-       io_free_region(ctx, mr);
+       io_free_region(ctx->user, mr);
        return ret;
 }
 
index f9e94458c01f45980929ba3848804947c2fbcfab..a6c63ca2c6f1f33befe549e3371097f968fa7d97 100644 (file)
@@ -16,7 +16,7 @@ unsigned long io_uring_get_unmapped_area(struct file *file, unsigned long addr,
                                         unsigned long flags);
 int io_uring_mmap(struct file *file, struct vm_area_struct *vma);
 
-void io_free_region(struct io_ring_ctx *ctx, struct io_mapped_region *mr);
+void io_free_region(struct user_struct *user, struct io_mapped_region *mr);
 int io_create_region(struct io_ring_ctx *ctx, struct io_mapped_region *mr,
                     struct io_uring_region_desc *reg,
                     unsigned long mmap_offset);
index 1a3e05be6e7b2940d076697ff905d85088885fa0..023f5e7a18dab4ca28a530a5485fe3f399069941 100644 (file)
@@ -381,8 +381,8 @@ struct io_ring_ctx_rings {
 static void io_register_free_rings(struct io_ring_ctx *ctx,
                                   struct io_ring_ctx_rings *r)
 {
-       io_free_region(ctx, &r->sq_region);
-       io_free_region(ctx, &r->ring_region);
+       io_free_region(ctx->user, &r->sq_region);
+       io_free_region(ctx->user, &r->ring_region);
 }
 
 #define swap_old(ctx, o, n, field)             \
@@ -604,7 +604,7 @@ static int io_register_mem_region(struct io_ring_ctx *ctx, void __user *uarg)
        if (ret)
                return ret;
        if (copy_to_user(rd_uptr, &rd, sizeof(rd))) {
-               io_free_region(ctx, &region);
+               io_free_region(ctx->user, &region);
                return -EFAULT;
        }
 
index a816f5902091cdcd3b77a5cd4c6f91562fba5cf6..d1545388400495d595157d478f8510ba5449a792 100644 (file)
@@ -378,7 +378,7 @@ static int io_allocate_rbuf_ring(struct io_zcrx_ifq *ifq,
 
 static void io_free_rbuf_ring(struct io_zcrx_ifq *ifq)
 {
-       io_free_region(ifq->ctx, &ifq->region);
+       io_free_region(ifq->ctx->user, &ifq->region);
        ifq->rq_ring = NULL;
        ifq->rqes = NULL;
 }