Commit c6538be9 authored by Pavel Begunkov's avatar Pavel Begunkov Committed by Jens Axboe
Browse files

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: default avatarPavel Begunkov <asml.silence@gmail.com>
Link: https://lore.kernel.org/r/d076c83fedb8253baf43acb23b8fafd7c5da1714.1623949695.git.asml.silence@gmail.com


Signed-off-by: default avatarJens Axboe <axboe@kernel.dk>
parent ebd0df2e
Loading
Loading
Loading
Loading
+1 −6
Original line number Diff line number Diff line
@@ -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();
	}