Skip to content

Commit

Permalink
io_uring/rsrc: encode node type and ctx together
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
axboe committed Nov 6, 2024
1 parent 01ee194 commit 6af82f7
Show file tree
Hide file tree
Showing 2 changed files with 19 additions and 9 deletions.
11 changes: 5 additions & 6 deletions io_uring/rsrc.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
Expand Down Expand Up @@ -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);
Expand Down
17 changes: 14 additions & 3 deletions io_uring/rsrc.h
Original file line number Diff line number Diff line change
Expand Up @@ -11,12 +11,13 @@
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 {
Expand Down Expand Up @@ -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);
Expand Down

0 comments on commit 6af82f7

Please sign in to comment.