Skip to content

Commit

Permalink
io_uring: count ctx refs separately from reqs
Browse files Browse the repository at this point in the history
Currently batch free handles request memory freeing and ctx ref putting
together. Separate them and use different counters, that will be needed
for reusing reqs memory.

Signed-off-by: Pavel Begunkov <asml.silence@gmail.com>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
  • Loading branch information
Pavel Begunkov authored and Jens Axboe committed Feb 10, 2021
1 parent 3893f39 commit 9ae7246
Showing 1 changed file with 5 additions and 1 deletion.
6 changes: 5 additions & 1 deletion fs/io_uring.c
Original file line number Diff line number Diff line change
Expand Up @@ -2227,6 +2227,7 @@ static void io_free_req(struct io_kiocb *req)
struct req_batch {
void *reqs[IO_IOPOLL_BATCH];
int to_free;
int ctx_refs;

struct task_struct *task;
int task_refs;
Expand All @@ -2236,14 +2237,14 @@ static inline void io_init_req_batch(struct req_batch *rb)
{
rb->to_free = 0;
rb->task_refs = 0;
rb->ctx_refs = 0;
rb->task = NULL;
}

static void __io_req_free_batch_flush(struct io_ring_ctx *ctx,
struct req_batch *rb)
{
kmem_cache_free_bulk(req_cachep, rb->to_free, rb->reqs);
percpu_ref_put_many(&ctx->refs, rb->to_free);
rb->to_free = 0;
}

Expand All @@ -2256,6 +2257,8 @@ static void io_req_free_batch_finish(struct io_ring_ctx *ctx,
io_put_task(rb->task, rb->task_refs);
rb->task = NULL;
}
if (rb->ctx_refs)
percpu_ref_put_many(&ctx->refs, rb->ctx_refs);
}

static void io_req_free_batch(struct req_batch *rb, struct io_kiocb *req)
Expand All @@ -2269,6 +2272,7 @@ static void io_req_free_batch(struct req_batch *rb, struct io_kiocb *req)
rb->task_refs = 0;
}
rb->task_refs++;
rb->ctx_refs++;

io_dismantle_req(req);
rb->reqs[rb->to_free++] = req;
Expand Down

0 comments on commit 9ae7246

Please sign in to comment.