io-wq: make the io_wq ref counted
authorJens Axboe <axboe@kernel.dk>
Thu, 23 Jan 2020 22:33:32 +0000 (15:33 -0700)
committerJens Axboe <axboe@kernel.dk>
Mon, 27 Jan 2020 22:58:42 +0000 (15:58 -0700)
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>
fs/io-wq.c

index 4d902c1..54e270a 100644 (file)
@@ -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);
+}