diff options
author | Pavel Begunkov <asml.silence@gmail.com> | 2022-03-21 22:02:19 +0000 |
---|---|---|
committer | Jens Axboe <axboe@kernel.dk> | 2022-04-24 17:34:16 -0600 |
commit | 68ca8fc00277ad04c975c382bd6e2d500e5c7185 (patch) | |
tree | 278f6e76b822a266f280c2e49453d53354d2eee6 | |
parent | af2d861d4cd2a4da5137f795ee3509e6f944a25b (diff) | |
download | lwn-68ca8fc00277ad04c975c382bd6e2d500e5c7185.tar.gz lwn-68ca8fc00277ad04c975c382bd6e2d500e5c7185.zip |
io_uring: small optimisation of tctx_task_work
There should be no completions stashed when we first get into
tctx_task_work(), so move completion flushing checks a bit later
after we had a chance to execute some task works.
Signed-off-by: Pavel Begunkov <asml.silence@gmail.com>
Link: https://lore.kernel.org/r/c6765c804f3c438591b9825ab9c43d22039073c4.1647897811.git.asml.silence@gmail.com
Signed-off-by: Jens Axboe <axboe@kernel.dk>
-rw-r--r-- | fs/io_uring.c | 9 |
1 files changed, 4 insertions, 5 deletions
diff --git a/fs/io_uring.c b/fs/io_uring.c index 7625b29153b9..7fefdb9c4ae3 100644 --- a/fs/io_uring.c +++ b/fs/io_uring.c @@ -2475,10 +2475,6 @@ static void tctx_task_work(struct callback_head *cb) while (1) { struct io_wq_work_node *node1, *node2; - if (!tctx->task_list.first && - !tctx->prior_task_list.first && uring_locked) - io_submit_flush_completions(ctx); - spin_lock_irq(&tctx->task_lock); node1 = tctx->prior_task_list.first; node2 = tctx->task_list.first; @@ -2492,10 +2488,13 @@ static void tctx_task_work(struct callback_head *cb) if (node1) handle_prev_tw_list(node1, &ctx, &uring_locked); - if (node2) handle_tw_list(node2, &ctx, &uring_locked); cond_resched(); + + if (!tctx->task_list.first && + !tctx->prior_task_list.first && uring_locked) + io_submit_flush_completions(ctx); } ctx_flush_and_put(ctx, &uring_locked); |