io_uring/rsrc: encode node type and ctx together
authorJens Axboe <axboe@kernel.dk>
Sun, 3 Nov 2024 15:17:28 +0000 (08:17 -0700)
committerJens Axboe <axboe@kernel.dk>
Wed, 6 Nov 2024 20:54:15 +0000 (13:54 -0700)
Rather than keep the type field separate rom ctx, use the fact that we
can encode up to 4 types of nodes in the LSB of the ctx pointer. Doesn't
reclaim any space right now on 64-bit archs, but it leaves a full int
for future use.

Signed-off-by: Jens Axboe <axboe@kernel.dk>
io_uring/rsrc.c
io_uring/rsrc.h

index 60fa857985cbd5a056d379c9fd41fb911af3e228..2fb1791d7255b4d337b9e471f8241b1987d5aad4 100644 (file)
@@ -124,9 +124,8 @@ struct io_rsrc_node *io_rsrc_node_alloc(struct io_ring_ctx *ctx, int type)
 
        node = kzalloc(sizeof(*node), GFP_KERNEL);
        if (node) {
-               node->ctx = ctx;
+               node->ctx_ptr = (unsigned long) ctx | type;
                node->refs = 1;
-               node->type = type;
        }
        return node;
 }
@@ -445,21 +444,21 @@ int io_files_update(struct io_kiocb *req, unsigned int issue_flags)
 
 void io_free_rsrc_node(struct io_rsrc_node *node)
 {
-       struct io_ring_ctx *ctx = node->ctx;
+       struct io_ring_ctx *ctx = io_rsrc_node_ctx(node);
 
        lockdep_assert_held(&ctx->uring_lock);
 
        if (node->tag)
-               io_post_aux_cqe(node->ctx, node->tag, 0, 0);
+               io_post_aux_cqe(ctx, node->tag, 0, 0);
 
-       switch (node->type) {
+       switch (io_rsrc_node_type(node)) {
        case IORING_RSRC_FILE:
                if (io_slot_file(node))
                        fput(io_slot_file(node));
                break;
        case IORING_RSRC_BUFFER:
                if (node->buf)
-                       io_buffer_unmap(node->ctx, node);
+                       io_buffer_unmap(ctx, node);
                break;
        default:
                WARN_ON_ONCE(1);
index a40fad783a69418c075da22cf875cfbbe8e75d1e..9a8fac31fa49d9bb7e5f8c85e0d397242b8b5e24 100644 (file)
 enum {
        IORING_RSRC_FILE                = 0,
        IORING_RSRC_BUFFER              = 1,
+
+       IORING_RSRC_TYPE_MASK           = 0x3UL,
 };
 
 struct io_rsrc_node {
-       struct io_ring_ctx              *ctx;
+       unsigned long                   ctx_ptr;
        int                             refs;
-       u16                             type;
 
        u64 tag;
        union {
@@ -100,11 +101,21 @@ static inline void io_req_put_rsrc_nodes(struct io_kiocb *req)
        req->rsrc_nodes[IORING_RSRC_BUFFER] = NULL;
 }
 
+static inline struct io_ring_ctx *io_rsrc_node_ctx(struct io_rsrc_node *node)
+{
+       return (struct io_ring_ctx *) (node->ctx_ptr & ~IORING_RSRC_TYPE_MASK);
+}
+
+static inline int io_rsrc_node_type(struct io_rsrc_node *node)
+{
+       return node->ctx_ptr & IORING_RSRC_TYPE_MASK;
+}
+
 static inline void io_req_assign_rsrc_node(struct io_kiocb *req,
                                           struct io_rsrc_node *node)
 {
        node->refs++;
-       req->rsrc_nodes[node->type] = node;
+       req->rsrc_nodes[io_rsrc_node_type(node)] = node;
 }
 
 int io_files_update(struct io_kiocb *req, unsigned int issue_flags);