From: Pavel Begunkov Date: Thu, 17 Jun 2021 17:14:08 +0000 (+0100) Subject: io_uring: refactor tctx task_work list splicing X-Git-Tag: microblaze-v5.15~116^2~21 X-Git-Url: http://git.monstr.eu/?p=linux-2.6-microblaze.git;a=commitdiff_plain;h=c6538be9e4883d1371adaff45712b1b2172773dd io_uring: refactor tctx task_work list splicing We don't need a full copy of tctx->task_list in tctx_task_work(), but only a first one, so just assign node directly. Taking into account that task_works are run in a context of a task, it's very unlikely to first see non-empty tctx->task_list and then splice it empty, can only happen with task_work cancellations that is not-normal slow path anyway. Hence, get rid of the check in the end, it's there not for validity but "performance" purposes. Signed-off-by: Pavel Begunkov Link: https://lore.kernel.org/r/d076c83fedb8253baf43acb23b8fafd7c5da1714.1623949695.git.asml.silence@gmail.com Signed-off-by: Jens Axboe --- diff --git a/fs/io_uring.c b/fs/io_uring.c index 49f06484ba0e..51db0d80b67b 100644 --- a/fs/io_uring.c +++ b/fs/io_uring.c @@ -1897,15 +1897,13 @@ static void tctx_task_work(struct callback_head *cb) clear_bit(0, &tctx->task_state); while (!wq_list_empty(&tctx->task_list)) { - struct io_wq_work_list list; struct io_wq_work_node *node; spin_lock_irq(&tctx->task_lock); - list = tctx->task_list; + node = tctx->task_list.first; INIT_WQ_LIST(&tctx->task_list); spin_unlock_irq(&tctx->task_lock); - node = list.first; while (node) { struct io_wq_work_node *next = node->next; struct io_kiocb *req = container_of(node, struct io_kiocb, @@ -1919,9 +1917,6 @@ static void tctx_task_work(struct callback_head *cb) req->task_work.func(&req->task_work); node = next; } - - if (!list.first) - break; cond_resched(); }