summaryrefslogtreecommitdiffstats
path: root/io_uring/rsrc.h
diff options
context:
space:
mode:
authorPavel Begunkov <asml.silence@gmail.com>2023-04-04 14:39:54 +0200
committerJens Axboe <axboe@kernel.dk>2023-04-04 17:30:39 +0200
commit9eae8655f9cd2eeed99fb7a0d2bb22816c17e497 (patch)
tree9839eb9739e972da6b62d363843f1fa95e48ea4b /io_uring/rsrc.h
parentio_uring/rsrc: don't offload node free (diff)
downloadlinux-9eae8655f9cd2eeed99fb7a0d2bb22816c17e497.tar.xz
linux-9eae8655f9cd2eeed99fb7a0d2bb22816c17e497.zip
io_uring/rsrc: cache struct io_rsrc_node
Add allocation cache for struct io_rsrc_node, it's always allocated and put under ->uring_lock, so it doesn't need any extra synchronisation around caches. Signed-off-by: Pavel Begunkov <asml.silence@gmail.com> Link: https://lore.kernel.org/r/252a9d9ef9654e6467af30fdc02f57c0118fb76e.1680576071.git.asml.silence@gmail.com Signed-off-by: Jens Axboe <axboe@kernel.dk>
Diffstat (limited to '')
-rw-r--r--io_uring/rsrc.h9
1 files changed, 7 insertions, 2 deletions
diff --git a/io_uring/rsrc.h b/io_uring/rsrc.h
index 11703082d125..3b9f4c57c47c 100644
--- a/io_uring/rsrc.h
+++ b/io_uring/rsrc.h
@@ -4,6 +4,8 @@
#include <net/af_unix.h>
+#include "alloc_cache.h"
+
#define IO_RSRC_TAG_TABLE_SHIFT (PAGE_SHIFT - 3)
#define IO_RSRC_TAG_TABLE_MAX (1U << IO_RSRC_TAG_TABLE_SHIFT)
#define IO_RSRC_TAG_TABLE_MASK (IO_RSRC_TAG_TABLE_MAX - 1)
@@ -37,8 +39,11 @@ struct io_rsrc_data {
};
struct io_rsrc_node {
+ union {
+ struct io_cache_entry cache;
+ struct io_rsrc_data *rsrc_data;
+ };
struct list_head node;
- struct io_rsrc_data *rsrc_data;
struct llist_node llist;
int refs;
bool done;
@@ -65,7 +70,7 @@ void io_rsrc_put_tw(struct callback_head *cb);
void io_rsrc_node_ref_zero(struct io_rsrc_node *node);
void io_rsrc_put_work(struct work_struct *work);
void io_wait_rsrc_data(struct io_rsrc_data *data);
-void io_rsrc_node_destroy(struct io_rsrc_node *ref_node);
+void io_rsrc_node_destroy(struct io_ring_ctx *ctx, struct io_rsrc_node *ref_node);
int io_rsrc_node_switch_start(struct io_ring_ctx *ctx);
int io_queue_rsrc_removal(struct io_rsrc_data *data, unsigned idx,
struct io_rsrc_node *node, void *rsrc);