diff options
author | Pavel Begunkov <asml.silence@gmail.com> | 2021-06-14 02:36:12 +0100 |
---|---|---|
committer | Jens Axboe <axboe@kernel.dk> | 2021-06-14 08:23:12 -0600 |
commit | c7f405d6fa36f778931881bfb1e12dd401d0bc62 (patch) | |
tree | 13603b32cbf5d8dfe4e105f4ad866693685dae5c | |
parent | 976517f162a05f4315b2373fd11585c395506259 (diff) | |
download | linux-c7f405d6fa36f778931881bfb1e12dd401d0bc62.tar.gz linux-c7f405d6fa36f778931881bfb1e12dd401d0bc62.tar.bz2 linux-c7f405d6fa36f778931881bfb1e12dd401d0bc62.zip |
io-wq: embed wqe ptr array into struct io_wq
io-wq keeps an array of pointers to struct io_wqe, allocate this array
as a part of struct io-wq, it's easier to code and saves an extra
indirection for nearly each io-wq call.
Signed-off-by: Pavel Begunkov <asml.silence@gmail.com>
Link: https://lore.kernel.org/r/1482c6a001923bbed662dc38a8a580fb08b1ed8c.1623634181.git.asml.silence@gmail.com
Signed-off-by: Jens Axboe <axboe@kernel.dk>
-rw-r--r-- | fs/io-wq.c | 15 |
1 files changed, 4 insertions, 11 deletions
diff --git a/fs/io-wq.c b/fs/io-wq.c index b3e8624a37d0..1ca98fc7d52b 100644 --- a/fs/io-wq.c +++ b/fs/io-wq.c @@ -102,7 +102,6 @@ struct io_wqe { * Per io_wq state */ struct io_wq { - struct io_wqe **wqes; unsigned long state; free_work_fn *free_work; @@ -118,6 +117,8 @@ struct io_wq { struct hlist_node cpuhp_node; struct task_struct *task; + + struct io_wqe *wqes[]; }; static enum cpuhp_state io_wq_online; @@ -907,17 +908,12 @@ struct io_wq *io_wq_create(unsigned bounded, struct io_wq_data *data) if (WARN_ON_ONCE(!data->free_work || !data->do_work)) return ERR_PTR(-EINVAL); - wq = kzalloc(sizeof(*wq), GFP_KERNEL); + wq = kzalloc(struct_size(wq, wqes, nr_node_ids), GFP_KERNEL); if (!wq) return ERR_PTR(-ENOMEM); - - wq->wqes = kcalloc(nr_node_ids, sizeof(struct io_wqe *), GFP_KERNEL); - if (!wq->wqes) - goto err_wq; - ret = cpuhp_state_add_instance_nocalls(io_wq_online, &wq->cpuhp_node); if (ret) - goto err_wqes; + goto err_wq; refcount_inc(&data->hash->refs); wq->hash = data->hash; @@ -962,8 +958,6 @@ err: cpuhp_state_remove_instance_nocalls(io_wq_online, &wq->cpuhp_node); for_each_node(node) kfree(wq->wqes[node]); -err_wqes: - kfree(wq->wqes); err_wq: kfree(wq); return ERR_PTR(ret); @@ -1036,7 +1030,6 @@ static void io_wq_destroy(struct io_wq *wq) kfree(wqe); } io_wq_put_hash(wq->hash); - kfree(wq->wqes); kfree(wq); } |