diff options
author | Pavel Begunkov <asml.silence@gmail.com> | 2021-01-15 17:37:49 +0000 |
---|---|---|
committer | Jens Axboe <axboe@kernel.dk> | 2021-02-01 10:02:42 -0700 |
commit | bc9744cd162b2f6c38d75dc49c310677dc13afa8 (patch) | |
tree | a751ee35d7dd531f90d11765f37a2c2b194ae337 /fs | |
parent | 6802535df7bf807c94de32a9d0bf0401d3109671 (diff) | |
download | linux-bc9744cd162b2f6c38d75dc49c310677dc13afa8.tar.bz2 |
io_uring: split ref_node alloc and init
A simple prep patch allowing to set refnode callbacks after it was
allocated. This needed to 1) keep ourself off of hi-level functions
where it's not pretty and they are not necessary 2) amortise ref_node
allocation in the future, e.g. for updates.
Signed-off-by: Pavel Begunkov <asml.silence@gmail.com>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
Diffstat (limited to 'fs')
-rw-r--r-- | fs/io_uring.c | 24 |
1 files changed, 11 insertions, 13 deletions
diff --git a/fs/io_uring.c b/fs/io_uring.c index ab5bf1bf0779..bb51f2abd009 100644 --- a/fs/io_uring.c +++ b/fs/io_uring.c @@ -1009,8 +1009,10 @@ static void __io_uring_cancel_task_requests(struct io_ring_ctx *ctx, struct task_struct *task); static void destroy_fixed_rsrc_ref_node(struct fixed_rsrc_ref_node *ref_node); -static struct fixed_rsrc_ref_node *alloc_fixed_file_ref_node( +static struct fixed_rsrc_ref_node *alloc_fixed_rsrc_ref_node( struct io_ring_ctx *ctx); +static void init_fixed_file_ref_node(struct io_ring_ctx *ctx, + struct fixed_rsrc_ref_node *ref_node); static void __io_complete_rw(struct io_kiocb *req, long res, long res2, struct io_comp_state *cs); @@ -7380,9 +7382,10 @@ static int io_sqe_files_unregister(struct io_ring_ctx *ctx) if (!data) return -ENXIO; - backup_node = alloc_fixed_file_ref_node(ctx); + backup_node = alloc_fixed_rsrc_ref_node(ctx); if (!backup_node) return -ENOMEM; + init_fixed_file_ref_node(ctx, backup_node); io_rsrc_ref_lock(ctx); ref_node = data->node; @@ -7819,18 +7822,11 @@ static struct fixed_rsrc_ref_node *alloc_fixed_rsrc_ref_node( return ref_node; } -static struct fixed_rsrc_ref_node *alloc_fixed_file_ref_node( - struct io_ring_ctx *ctx) +static void init_fixed_file_ref_node(struct io_ring_ctx *ctx, + struct fixed_rsrc_ref_node *ref_node) { - struct fixed_rsrc_ref_node *ref_node; - - ref_node = alloc_fixed_rsrc_ref_node(ctx); - if (!ref_node) - return NULL; - ref_node->rsrc_data = ctx->file_data; ref_node->rsrc_put = io_ring_file_put; - return ref_node; } static void destroy_fixed_rsrc_ref_node(struct fixed_rsrc_ref_node *ref_node) @@ -7915,11 +7911,12 @@ static int io_sqe_files_register(struct io_ring_ctx *ctx, void __user *arg, return ret; } - ref_node = alloc_fixed_file_ref_node(ctx); + ref_node = alloc_fixed_rsrc_ref_node(ctx); if (!ref_node) { io_sqe_files_unregister(ctx); return -ENOMEM; } + init_fixed_file_ref_node(ctx, ref_node); io_sqe_rsrc_set_node(ctx, file_data, ref_node); return ret; @@ -8022,9 +8019,10 @@ static int __io_sqe_files_update(struct io_ring_ctx *ctx, if (done > ctx->nr_user_files) return -EINVAL; - ref_node = alloc_fixed_file_ref_node(ctx); + ref_node = alloc_fixed_rsrc_ref_node(ctx); if (!ref_node) return -ENOMEM; + init_fixed_file_ref_node(ctx, ref_node); done = 0; fds = u64_to_user_ptr(up->data); |