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: Hannes Reinecke <hare@suse.com>
Reviewed-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
This commit is contained in:
Jens Axboe 2019-01-17 08:39:48 -07:00
Родитель 6c271ce2f1
Коммит c16361c1d8
1 изменённых файлов: 6 добавлений и 2 удалений

Просмотреть файл

@ -184,6 +184,7 @@ struct io_kiocb {
struct io_ring_ctx *ctx; struct io_ring_ctx *ctx;
struct list_head list; struct list_head list;
unsigned int flags; unsigned int flags;
refcount_t refs;
#define REQ_F_FORCE_NONBLOCK 1 /* inline submission attempt */ #define REQ_F_FORCE_NONBLOCK 1 /* inline submission attempt */
#define REQ_F_IOPOLL_COMPLETED 2 /* polled IO has completed */ #define REQ_F_IOPOLL_COMPLETED 2 /* polled IO has completed */
#define REQ_F_FIXED_FILE 4 /* ctx owns file */ #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->ctx = ctx;
req->flags = 0; req->flags = 0;
refcount_set(&req->refs, 0);
return req; return req;
out: out:
io_ring_drop_ctx_refs(ctx, 1); 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) 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); io_ring_drop_ctx_refs(req->ctx, 1);
kmem_cache_free(req_cachep, req); kmem_cache_free(req_cachep, req);
} }
}
/* /*
* Find and free completed poll iocbs * Find and free completed poll iocbs