Commit 82fbcfa9 authored by Pavel Begunkov's avatar Pavel Begunkov Committed by Jens Axboe
Browse files

io_uring: encapsulate rsrc node manipulations



io_rsrc_node_get() and io_rsrc_node_set() are always used together,
merge them into one so most users don't even see io_rsrc_node and don't
need to care about it.

It helped to catch io_sqe_files_register() inferring rsrc data argument
for get and set differently, not a problem but a good sign.

Signed-off-by: default avatarPavel Begunkov <asml.silence@gmail.com>
Link: https://lore.kernel.org/r/0827b080b2e61b3dec795380f7e1a1995595d41f.1617287883.git.asml.silence@gmail.com


Signed-off-by: default avatarJens Axboe <axboe@kernel.dk>
parent f3baed39
Loading
Loading
Loading
Loading
+13 −26
Original line number Diff line number Diff line
@@ -7094,8 +7094,17 @@ static inline void io_rsrc_ref_unlock(struct io_ring_ctx *ctx)

static void io_rsrc_node_set(struct io_ring_ctx *ctx,
			     struct io_rsrc_data *rsrc_data,
			     struct io_rsrc_node *rsrc_node)
			     void (*rsrc_put)(struct io_ring_ctx *ctx,
			                      struct io_rsrc_put *prsrc))
{
	struct io_rsrc_node *rsrc_node = ctx->rsrc_backup_node;

	WARN_ON_ONCE(!rsrc_node);

	ctx->rsrc_backup_node = NULL;
	rsrc_node->rsrc_data = rsrc_data;
	rsrc_node->rsrc_put = rsrc_put;

	io_rsrc_ref_lock(ctx);
	rsrc_data->node = rsrc_node;
	list_add_tail(&rsrc_node->node, &ctx->rsrc_ref_list);
@@ -7123,28 +7132,11 @@ static int io_rsrc_node_prealloc(struct io_ring_ctx *ctx)
	return ctx->rsrc_backup_node ? 0 : -ENOMEM;
}

static struct io_rsrc_node *
io_rsrc_node_get(struct io_ring_ctx *ctx,
		 struct io_rsrc_data *rsrc_data,
		 void (*rsrc_put)(struct io_ring_ctx *ctx,
		                  struct io_rsrc_put *prsrc))
{
	struct io_rsrc_node *node = ctx->rsrc_backup_node;

	WARN_ON_ONCE(!node);

	ctx->rsrc_backup_node = NULL;
	node->rsrc_data = rsrc_data;
	node->rsrc_put = rsrc_put;
	return node;
}

static int io_rsrc_ref_quiesce(struct io_rsrc_data *data,
			       struct io_ring_ctx *ctx,
			       void (*rsrc_put)(struct io_ring_ctx *ctx,
			                        struct io_rsrc_put *prsrc))
{
	struct io_rsrc_node *node;
	int ret;

	if (data->quiesce)
@@ -7164,8 +7156,7 @@ static int io_rsrc_ref_quiesce(struct io_rsrc_data *data,
			break;

		percpu_ref_resurrect(&data->refs);
		node = io_rsrc_node_get(ctx, data, rsrc_put);
		io_rsrc_node_set(ctx, data, node);
		io_rsrc_node_set(ctx, data, rsrc_put);
		reinit_completion(&data->done);

		mutex_unlock(&ctx->uring_lock);
@@ -7636,7 +7627,6 @@ static int io_sqe_files_register(struct io_ring_ctx *ctx, void __user *arg,
	unsigned nr_tables, i;
	struct file *file;
	int fd, ret;
	struct io_rsrc_node *ref_node;
	struct io_rsrc_data *file_data;

	if (ctx->file_data)
@@ -7707,8 +7697,7 @@ static int io_sqe_files_register(struct io_ring_ctx *ctx, void __user *arg,
		return ret;
	}

	ref_node = io_rsrc_node_get(ctx, ctx->file_data, io_ring_file_put);
	io_rsrc_node_set(ctx, file_data, ref_node);
	io_rsrc_node_set(ctx, file_data, io_ring_file_put);
	return ret;
out_fput:
	for (i = 0; i < ctx->nr_user_files; i++) {
@@ -7794,7 +7783,6 @@ static int __io_sqe_files_update(struct io_ring_ctx *ctx,
				 unsigned nr_args)
{
	struct io_rsrc_data *data = ctx->file_data;
	struct io_rsrc_node *ref_node;
	struct file *file, **file_slot;
	__s32 __user *fds;
	int fd, i, err;
@@ -7861,8 +7849,7 @@ static int __io_sqe_files_update(struct io_ring_ctx *ctx,

	if (needs_switch) {
		percpu_ref_kill(&data->node->refs);
		ref_node = io_rsrc_node_get(ctx, data, io_ring_file_put);
		io_rsrc_node_set(ctx, data, ref_node);
		io_rsrc_node_set(ctx, data, io_ring_file_put);
	}
	return done ? done : err;
}