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

io_uring: refactor tctx_task_work



Merge almost identical sections of tctx_task_work(), this will make code
modifications later easier and also inlines handle_tw_list().

Signed-off-by: default avatarPavel Begunkov <asml.silence@gmail.com>
Link: https://lore.kernel.org/r/d06592d91e3e7559e7a4dbb8907d110863008dc7.1674484266.git.asml.silence@gmail.com


[axboe: fold in setting count to zero patch from Tom Rix]
Signed-off-by: default avatarJens Axboe <axboe@kernel.dk>
parent 5afa4650
Loading
Loading
Loading
Loading
+5 −8
Original line number Diff line number Diff line
@@ -1166,7 +1166,7 @@ static unsigned int handle_tw_list(struct llist_node *node,
{
	unsigned int count = 0;

	while (node != last) {
	while (node && node != last) {
		struct llist_node *next = node->next;
		struct io_kiocb *req = container_of(node, struct io_kiocb,
						    io_task_work.node);
@@ -1226,23 +1226,20 @@ void tctx_task_work(struct callback_head *cb)
						  task_work);
	struct llist_node fake = {};
	struct llist_node *node;
	unsigned int loops = 1;
	unsigned int count;
	unsigned int loops = 0;
	unsigned int count = 0;

	if (unlikely(current->flags & PF_EXITING)) {
		io_fallback_tw(tctx);
		return;
	}

	node = io_llist_xchg(&tctx->task_list, &fake);
	count = handle_tw_list(node, &ctx, &uring_locked, NULL);
	node = io_llist_cmpxchg(&tctx->task_list, &fake, NULL);
	while (node != &fake) {
	do {
		loops++;
		node = io_llist_xchg(&tctx->task_list, &fake);
		count += handle_tw_list(node, &ctx, &uring_locked, &fake);
		node = io_llist_cmpxchg(&tctx->task_list, &fake, NULL);
	}
	} while (node != &fake);

	ctx_flush_and_put(ctx, &uring_locked);