Skip to content

Commit

Permalink
io_uring/rsrc: devirtualise rsrc put callbacks
Browse files Browse the repository at this point in the history
We only have two rsrc types, buffers and files, replace virtual
callbacks for putting resources down with a switch..case.

Signed-off-by: Pavel Begunkov <asml.silence@gmail.com>
Link: https://lore.kernel.org/r/02ca727bf8e5f7f820c2f404e95ae88c8f472930.1681822823.git.asml.silence@gmail.com
Signed-off-by: Jens Axboe <axboe@kernel.dk>
  • Loading branch information
Pavel Begunkov authored and Jens Axboe committed Apr 19, 2023
1 parent 29b26c5 commit fc7f3a8
Show file tree
Hide file tree
Showing 2 changed files with 20 additions and 7 deletions.
25 changes: 19 additions & 6 deletions io_uring/rsrc.c
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,8 @@ struct io_rsrc_update {
u32 offset;
};

static void io_rsrc_buf_put(struct io_ring_ctx *ctx, struct io_rsrc_put *prsrc);
static void io_rsrc_file_put(struct io_ring_ctx *ctx, struct io_rsrc_put *prsrc);
static int io_sqe_buffer_register(struct io_ring_ctx *ctx, struct iovec *iov,
struct io_mapped_ubuf **pimu,
struct page **last_hpage);
Expand Down Expand Up @@ -147,7 +149,18 @@ static void io_rsrc_put_work(struct io_rsrc_node *node)

if (prsrc->tag)
io_post_aux_cqe(data->ctx, prsrc->tag, 0, 0);
data->do_put(data->ctx, prsrc);

switch (data->rsrc_type) {
case IORING_RSRC_FILE:
io_rsrc_file_put(data->ctx, prsrc);
break;
case IORING_RSRC_BUFFER:
io_rsrc_buf_put(data->ctx, prsrc);
break;
default:
WARN_ON_ONCE(1);
break;
}
}

void io_rsrc_node_destroy(struct io_ring_ctx *ctx, struct io_rsrc_node *node)
Expand Down Expand Up @@ -297,8 +310,8 @@ static __cold void **io_alloc_page_table(size_t size)
return table;
}

__cold static int io_rsrc_data_alloc(struct io_ring_ctx *ctx,
rsrc_put_fn *do_put, u64 __user *utags,
__cold static int io_rsrc_data_alloc(struct io_ring_ctx *ctx, int type,
u64 __user *utags,
unsigned nr, struct io_rsrc_data **pdata)
{
struct io_rsrc_data *data;
Expand All @@ -316,7 +329,7 @@ __cold static int io_rsrc_data_alloc(struct io_ring_ctx *ctx,

data->nr = nr;
data->ctx = ctx;
data->do_put = do_put;
data->rsrc_type = type;
if (utags) {
ret = -EFAULT;
for (i = 0; i < nr; i++) {
Expand Down Expand Up @@ -849,7 +862,7 @@ int io_sqe_files_register(struct io_ring_ctx *ctx, void __user *arg,
return -EMFILE;
if (nr_args > rlimit(RLIMIT_NOFILE))
return -EMFILE;
ret = io_rsrc_data_alloc(ctx, io_rsrc_file_put, tags, nr_args,
ret = io_rsrc_data_alloc(ctx, IORING_RSRC_FILE, tags, nr_args,
&ctx->file_data);
if (ret)
return ret;
Expand Down Expand Up @@ -1184,7 +1197,7 @@ int io_sqe_buffers_register(struct io_ring_ctx *ctx, void __user *arg,
return -EBUSY;
if (!nr_args || nr_args > IORING_MAX_REG_BUFFERS)
return -EINVAL;
ret = io_rsrc_data_alloc(ctx, io_rsrc_buf_put, tags, nr_args, &data);
ret = io_rsrc_data_alloc(ctx, IORING_RSRC_BUFFER, tags, nr_args, &data);
if (ret)
return ret;
ret = io_buffers_map_alloc(ctx, nr_args);
Expand Down
2 changes: 1 addition & 1 deletion io_uring/rsrc.h
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ struct io_rsrc_data {

u64 **tags;
unsigned int nr;
rsrc_put_fn *do_put;
u16 rsrc_type;
bool quiesce;
};

Expand Down

0 comments on commit fc7f3a8

Please sign in to comment.