diff options
author | Pavel Begunkov <asml.silence@gmail.com> | 2023-04-18 16:06:41 +0300 |
---|---|---|
committer | Jens Axboe <axboe@kernel.dk> | 2023-04-19 04:38:26 +0300 |
commit | 2236b3905b4d4e9cd4d149ab35767858c02bb79b (patch) | |
tree | e45f7bc09e3855b42b99aa8de806556eb98436b7 /io_uring | |
parent | fc7f3a8d3a78503c4f3e108155fb9a233dc307a4 (diff) | |
download | linux-2236b3905b4d4e9cd4d149ab35767858c02bb79b.tar.xz |
io_uring/rsrc: disassociate nodes and rsrc_data
Make rsrc nodes independent from rsrd_data, for that we keep ctx and
rsrc type in nodes.
Signed-off-by: Pavel Begunkov <asml.silence@gmail.com>
Link: https://lore.kernel.org/r/4f259abe9cd4eea6a3b4ed83508635218acd3c3f.1681822823.git.asml.silence@gmail.com
Signed-off-by: Jens Axboe <axboe@kernel.dk>
Diffstat (limited to 'io_uring')
-rw-r--r-- | io_uring/rsrc.c | 20 | ||||
-rw-r--r-- | io_uring/rsrc.h | 3 |
2 files changed, 11 insertions, 12 deletions
diff --git a/io_uring/rsrc.c b/io_uring/rsrc.c index 62988b3aa927..20dcc7668cb0 100644 --- a/io_uring/rsrc.c +++ b/io_uring/rsrc.c @@ -144,18 +144,17 @@ static void io_buffer_unmap(struct io_ring_ctx *ctx, struct io_mapped_ubuf **slo static void io_rsrc_put_work(struct io_rsrc_node *node) { - struct io_rsrc_data *data = node->rsrc_data; struct io_rsrc_put *prsrc = &node->item; if (prsrc->tag) - io_post_aux_cqe(data->ctx, prsrc->tag, 0, 0); + io_post_aux_cqe(node->ctx, prsrc->tag, 0, 0); - switch (data->rsrc_type) { + switch (node->type) { case IORING_RSRC_FILE: - io_rsrc_file_put(data->ctx, prsrc); + io_rsrc_file_put(node->ctx, prsrc); break; case IORING_RSRC_BUFFER: - io_rsrc_buf_put(data->ctx, prsrc); + io_rsrc_buf_put(node->ctx, prsrc); break; default: WARN_ON_ONCE(1); @@ -170,9 +169,9 @@ void io_rsrc_node_destroy(struct io_ring_ctx *ctx, struct io_rsrc_node *node) } void io_rsrc_node_ref_zero(struct io_rsrc_node *node) - __must_hold(&node->rsrc_data->ctx->uring_lock) + __must_hold(&node->ctx->uring_lock) { - struct io_ring_ctx *ctx = node->rsrc_data->ctx; + struct io_ring_ctx *ctx = node->ctx; while (!list_empty(&ctx->rsrc_ref_list)) { node = list_first_entry(&ctx->rsrc_ref_list, @@ -204,7 +203,7 @@ struct io_rsrc_node *io_rsrc_node_alloc(struct io_ring_ctx *ctx) return NULL; } - ref_node->rsrc_data = NULL; + ref_node->ctx = ctx; ref_node->empty = 0; ref_node->refs = 1; return ref_node; @@ -225,7 +224,7 @@ __cold static int io_rsrc_ref_quiesce(struct io_rsrc_data *data, if (!backup) return -ENOMEM; ctx->rsrc_node->empty = true; - ctx->rsrc_node->rsrc_data = data; + ctx->rsrc_node->type = -1; list_add_tail(&ctx->rsrc_node->node, &ctx->rsrc_ref_list); io_put_rsrc_node(ctx, ctx->rsrc_node); ctx->rsrc_node = backup; @@ -655,10 +654,9 @@ int io_queue_rsrc_removal(struct io_rsrc_data *data, unsigned idx, void *rsrc) } node->item.rsrc = rsrc; + node->type = data->rsrc_type; node->item.tag = *tag_slot; *tag_slot = 0; - - node->rsrc_data = data; list_add_tail(&node->node, &ctx->rsrc_ref_list); io_put_rsrc_node(ctx, node); return 0; diff --git a/io_uring/rsrc.h b/io_uring/rsrc.h index 5d0733c4c08d..0a8a95e9b99e 100644 --- a/io_uring/rsrc.h +++ b/io_uring/rsrc.h @@ -40,10 +40,11 @@ struct io_rsrc_data { struct io_rsrc_node { union { struct io_cache_entry cache; - struct io_rsrc_data *rsrc_data; + struct io_ring_ctx *ctx; }; int refs; bool empty; + u16 type; struct list_head node; struct io_rsrc_put item; }; |