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: Pavel Begunkov <asml.silence@gmail.com>
Link: https://lore.kernel.org/r/0827b080b2e61b3dec795380f7e1a1995595d41f.1617287883.git.asml.silence@gmail.com
Signed-off-by: Jens Axboe <axboe@kernel.dk>
This commit is contained in:
Pavel Begunkov 2021-04-01 15:43:43 +01:00 committed by Jens Axboe
parent f3baed3992
commit 82fbcfa996
1 changed files with 13 additions and 26 deletions

View File

@ -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;
}