mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-12-27 12:21:22 -05:00
io_uring/memmap: refactor io_free_region() to take user_struct param
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>
This commit is contained in:
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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, ®ion);
|
||||
io_free_region(ctx->user, ®ion);
|
||||
return -EFAULT;
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user