Commit 1fa7a341 authored by David Wei's avatar David Wei Committed by Jens Axboe
Browse files

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: default avatarDavid Wei <dw@davidwei.uk>
Reviewed-by: default avatarPavel Begunkov <asml.silence@gmail.com>
Signed-off-by: default avatarJens Axboe <axboe@kernel.dk>
parent a5af56a9
Loading
Loading
Loading
Loading
+3 −3
Original line number Diff line number Diff line
@@ -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);
+2 −2
Original line number Diff line number Diff line
@@ -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;
}
+4 −4
Original line number Diff line number Diff line
@@ -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;
}

+1 −1
Original line number Diff line number Diff line
@@ -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);
+3 −3
Original line number Diff line number Diff line
@@ -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;
	}

Loading