Skip to content

Commit

Permalink
io_uring: buffer registration infrastructure
Browse files Browse the repository at this point in the history
This just prepares the ring for having lists of buffers associated with
it, that the application can provide for SQEs to consume instead of
providing their own.

The buffers are organized by group ID.

Signed-off-by: Jens Axboe <axboe@kernel.dk>
  • Loading branch information
Jens Axboe committed Mar 4, 2020
1 parent e9fd939 commit 5a2e745
Showing 1 changed file with 35 additions and 0 deletions.
35 changes: 35 additions & 0 deletions fs/io_uring.c
Original file line number Diff line number Diff line change
Expand Up @@ -195,6 +195,13 @@ struct fixed_file_data {
struct completion done;
};

struct io_buffer {
struct list_head list;
__u64 addr;
__s32 len;
__u16 bid;
};

struct io_ring_ctx {
struct {
struct percpu_ref refs;
Expand Down Expand Up @@ -272,6 +279,8 @@ struct io_ring_ctx {
struct socket *ring_sock;
#endif

struct idr io_buffer_idr;

struct idr personality_idr;

struct {
Expand Down Expand Up @@ -875,6 +884,7 @@ static struct io_ring_ctx *io_ring_ctx_alloc(struct io_uring_params *p)
INIT_LIST_HEAD(&ctx->cq_overflow_list);
init_completion(&ctx->completions[0]);
init_completion(&ctx->completions[1]);
idr_init(&ctx->io_buffer_idr);
idr_init(&ctx->personality_idr);
mutex_init(&ctx->uring_lock);
init_waitqueue_head(&ctx->wait);
Expand Down Expand Up @@ -6524,6 +6534,30 @@ static int io_eventfd_unregister(struct io_ring_ctx *ctx)
return -ENXIO;
}

static int __io_destroy_buffers(int id, void *p, void *data)
{
struct io_ring_ctx *ctx = data;
struct io_buffer *buf = p;

/* the head kbuf is the list itself */
while (!list_empty(&buf->list)) {
struct io_buffer *nxt;

nxt = list_first_entry(&buf->list, struct io_buffer, list);
list_del(&nxt->list);
kfree(nxt);
}
kfree(buf);
idr_remove(&ctx->io_buffer_idr, id);
return 0;
}

static void io_destroy_buffers(struct io_ring_ctx *ctx)
{
idr_for_each(&ctx->io_buffer_idr, __io_destroy_buffers, ctx);
idr_destroy(&ctx->io_buffer_idr);
}

static void io_ring_ctx_free(struct io_ring_ctx *ctx)
{
io_finish_async(ctx);
Expand All @@ -6534,6 +6568,7 @@ static void io_ring_ctx_free(struct io_ring_ctx *ctx)
io_sqe_buffer_unregister(ctx);
io_sqe_files_unregister(ctx);
io_eventfd_unregister(ctx);
io_destroy_buffers(ctx);
idr_destroy(&ctx->personality_idr);

#if defined(CONFIG_UNIX)
Expand Down

0 comments on commit 5a2e745

Please sign in to comment.