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

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.comSigned-off-by: default avatarJens Axboe <axboe@kernel.dk>
parent f3baed39
...@@ -7094,8 +7094,17 @@ static inline void io_rsrc_ref_unlock(struct io_ring_ctx *ctx) ...@@ -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, static void io_rsrc_node_set(struct io_ring_ctx *ctx,
struct io_rsrc_data *rsrc_data, 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); io_rsrc_ref_lock(ctx);
rsrc_data->node = rsrc_node; rsrc_data->node = rsrc_node;
list_add_tail(&rsrc_node->node, &ctx->rsrc_ref_list); 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) ...@@ -7123,28 +7132,11 @@ static int io_rsrc_node_prealloc(struct io_ring_ctx *ctx)
return ctx->rsrc_backup_node ? 0 : -ENOMEM; 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, static int io_rsrc_ref_quiesce(struct io_rsrc_data *data,
struct io_ring_ctx *ctx, struct io_ring_ctx *ctx,
void (*rsrc_put)(struct io_ring_ctx *ctx, void (*rsrc_put)(struct io_ring_ctx *ctx,
struct io_rsrc_put *prsrc)) struct io_rsrc_put *prsrc))
{ {
struct io_rsrc_node *node;
int ret; int ret;
if (data->quiesce) if (data->quiesce)
...@@ -7164,8 +7156,7 @@ static int io_rsrc_ref_quiesce(struct io_rsrc_data *data, ...@@ -7164,8 +7156,7 @@ static int io_rsrc_ref_quiesce(struct io_rsrc_data *data,
break; break;
percpu_ref_resurrect(&data->refs); percpu_ref_resurrect(&data->refs);
node = io_rsrc_node_get(ctx, data, rsrc_put); io_rsrc_node_set(ctx, data, rsrc_put);
io_rsrc_node_set(ctx, data, node);
reinit_completion(&data->done); reinit_completion(&data->done);
mutex_unlock(&ctx->uring_lock); mutex_unlock(&ctx->uring_lock);
...@@ -7636,7 +7627,6 @@ static int io_sqe_files_register(struct io_ring_ctx *ctx, void __user *arg, ...@@ -7636,7 +7627,6 @@ static int io_sqe_files_register(struct io_ring_ctx *ctx, void __user *arg,
unsigned nr_tables, i; unsigned nr_tables, i;
struct file *file; struct file *file;
int fd, ret; int fd, ret;
struct io_rsrc_node *ref_node;
struct io_rsrc_data *file_data; struct io_rsrc_data *file_data;
if (ctx->file_data) if (ctx->file_data)
...@@ -7707,8 +7697,7 @@ static int io_sqe_files_register(struct io_ring_ctx *ctx, void __user *arg, ...@@ -7707,8 +7697,7 @@ static int io_sqe_files_register(struct io_ring_ctx *ctx, void __user *arg,
return ret; return ret;
} }
ref_node = io_rsrc_node_get(ctx, ctx->file_data, io_ring_file_put); io_rsrc_node_set(ctx, file_data, io_ring_file_put);
io_rsrc_node_set(ctx, file_data, ref_node);
return ret; return ret;
out_fput: out_fput:
for (i = 0; i < ctx->nr_user_files; i++) { for (i = 0; i < ctx->nr_user_files; i++) {
...@@ -7794,7 +7783,6 @@ static int __io_sqe_files_update(struct io_ring_ctx *ctx, ...@@ -7794,7 +7783,6 @@ static int __io_sqe_files_update(struct io_ring_ctx *ctx,
unsigned nr_args) unsigned nr_args)
{ {
struct io_rsrc_data *data = ctx->file_data; struct io_rsrc_data *data = ctx->file_data;
struct io_rsrc_node *ref_node;
struct file *file, **file_slot; struct file *file, **file_slot;
__s32 __user *fds; __s32 __user *fds;
int fd, i, err; int fd, i, err;
...@@ -7861,8 +7849,7 @@ static int __io_sqe_files_update(struct io_ring_ctx *ctx, ...@@ -7861,8 +7849,7 @@ static int __io_sqe_files_update(struct io_ring_ctx *ctx,
if (needs_switch) { if (needs_switch) {
percpu_ref_kill(&data->node->refs); percpu_ref_kill(&data->node->refs);
ref_node = io_rsrc_node_get(ctx, data, io_ring_file_put); io_rsrc_node_set(ctx, data, io_ring_file_put);
io_rsrc_node_set(ctx, data, ref_node);
} }
return done ? done : err; return done ? done : err;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment