io_uring: handle traditional task_work in FIFO order
authorJens Axboe <axboe@kernel.dk>
Tue, 30 Jan 2024 14:04:52 +0000 (07:04 -0700)
committerJens Axboe <axboe@kernel.dk>
Thu, 8 Feb 2024 20:27:06 +0000 (13:27 -0700)
For local task_work, which is used if IORING_SETUP_DEFER_TASKRUN is set,
we reverse the order of the lockless list before processing the work.
This is done to process items in the order in which they were queued, as
the llist always adds to the head.

Do the same for traditional task_work, so we have the same behavior for
both types.

Signed-off-by: Jens Axboe <axboe@kernel.dk>
io_uring/io_uring.c

index b1892cdd25c637eafa3e09255d77a3435293e363..4678d9ec810be7496054d7272a4b50c120e714d4 100644 (file)
@@ -1266,7 +1266,7 @@ void tctx_task_work(struct callback_head *cb)
 
        node = llist_del_all(&tctx->task_list);
        if (node)
-               count = handle_tw_list(node, &ctx, &ts);
+               count = handle_tw_list(llist_reverse_order(node), &ctx, &ts);
 
        ctx_flush_and_put(ctx, &ts);