Commit c16361c1 authored by Jens Axboe's avatar Jens Axboe
Browse files

io_uring: add io_kiocb ref count



We'll use this for the POLL implementation. Regular requests will
NOT be using references, so initialize it to 0. Any real use of
the io_kiocb ref will initialize it to at least 2.

Reviewed-by: default avatarHannes Reinecke <hare@suse.com>
Reviewed-by: default avatarChristoph Hellwig <hch@lst.de>
Signed-off-by: default avatarJens Axboe <axboe@kernel.dk>
parent 6c271ce2
Loading
Loading
Loading
Loading
+6 −2
Original line number Diff line number Diff line
@@ -184,6 +184,7 @@ struct io_kiocb {
	struct io_ring_ctx	*ctx;
	struct list_head	list;
	unsigned int		flags;
	refcount_t		refs;
#define REQ_F_FORCE_NONBLOCK	1	/* inline submission attempt */
#define REQ_F_IOPOLL_COMPLETED	2	/* polled IO has completed */
#define REQ_F_FIXED_FILE	4	/* ctx owns file */
@@ -377,6 +378,7 @@ static struct io_kiocb *io_get_req(struct io_ring_ctx *ctx,

	req->ctx = ctx;
	req->flags = 0;
	refcount_set(&req->refs, 0);
	return req;
out:
	io_ring_drop_ctx_refs(ctx, 1);
@@ -394,9 +396,11 @@ static void io_free_req_many(struct io_ring_ctx *ctx, void **reqs, int *nr)

static void io_free_req(struct io_kiocb *req)
{
	if (!refcount_read(&req->refs) || refcount_dec_and_test(&req->refs)) {
		io_ring_drop_ctx_refs(req->ctx, 1);
		kmem_cache_free(req_cachep, req);
	}
}

/*
 * Find and free completed poll iocbs