diff options
author | Jens Axboe <axboe@kernel.dk> | 2020-01-24 01:33:32 +0300 |
---|---|---|
committer | Jens Axboe <axboe@kernel.dk> | 2020-01-28 01:58:42 +0300 |
commit | 848f7e1887c46f21679c2c12b9e8022f17750721 (patch) | |
tree | cb797018e76a576c1def3298deb5ae23092582f9 /fs/io-wq.c | |
parent | 9466f43741bc08edd7b1bee642dd6f5561091634 (diff) | |
download | linux-848f7e1887c46f21679c2c12b9e8022f17750721.tar.xz |
io-wq: make the io_wq ref counted
In preparation for sharing an io-wq across different users, add a
reference count that manages destruction of it.
Reviewed-by: Pavel Begunkov <asml.silence@gmail.com>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
Diffstat (limited to 'fs/io-wq.c')
-rw-r--r-- | fs/io-wq.c | 11 |
1 files changed, 10 insertions, 1 deletions
diff --git a/fs/io-wq.c b/fs/io-wq.c index 4d902c19ee5f..54e270ae12ab 100644 --- a/fs/io-wq.c +++ b/fs/io-wq.c @@ -113,6 +113,8 @@ struct io_wq { struct mm_struct *mm; refcount_t refs; struct completion done; + + refcount_t use_refs; }; static bool io_worker_get(struct io_worker *worker) @@ -1073,6 +1075,7 @@ struct io_wq *io_wq_create(unsigned bounded, struct io_wq_data *data) ret = -ENOMEM; goto err; } + refcount_set(&wq->use_refs, 1); reinit_completion(&wq->done); return wq; } @@ -1093,7 +1096,7 @@ static bool io_wq_worker_wake(struct io_worker *worker, void *data) return false; } -void io_wq_destroy(struct io_wq *wq) +static void __io_wq_destroy(struct io_wq *wq) { int node; @@ -1113,3 +1116,9 @@ void io_wq_destroy(struct io_wq *wq) kfree(wq->wqes); kfree(wq); } + +void io_wq_destroy(struct io_wq *wq) +{ + if (refcount_dec_and_test(&wq->use_refs)) + __io_wq_destroy(wq); +} |