]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
io_uring: remove drain prealloc checks
authorPavel Begunkov <asml.silence@gmail.com>
Fri, 9 May 2025 11:12:50 +0000 (12:12 +0100)
committerJens Axboe <axboe@kernel.dk>
Fri, 9 May 2025 14:01:01 +0000 (08:01 -0600)
Currently io_drain_req() has two steps. The first is fast path checking
sequence numbers. The second is allocations, rechecking and actual
queuing. Further simplify it by removing the first step.

Signed-off-by: Pavel Begunkov <asml.silence@gmail.com>
Link: https://lore.kernel.org/r/4d06e89ed07611993d7bf89182de2300858379bd.1746788718.git.asml.silence@gmail.com
Signed-off-by: Jens Axboe <axboe@kernel.dk>
io_uring/io_uring.c

index 6b606e9dffa391ced0ed332226919c9b15394ffb..f83abdf8a0560d7f8f22f1bd9b9c1b0b9f3bcec4 100644 (file)
@@ -1674,17 +1674,6 @@ static __cold void io_drain_req(struct io_kiocb *req)
        struct io_defer_entry *de;
        u32 seq = io_get_sequence(req);
 
-       /* Still need defer if there is pending req in defer list. */
-       spin_lock(&ctx->completion_lock);
-       if (!req_need_defer(req, seq) && list_empty_careful(&ctx->defer_list)) {
-               spin_unlock(&ctx->completion_lock);
-queue:
-               ctx->drain_active = false;
-               io_req_task_queue(req);
-               return;
-       }
-       spin_unlock(&ctx->completion_lock);
-
        io_prep_async_link(req);
        de = kmalloc(sizeof(*de), GFP_KERNEL_ACCOUNT);
        if (!de) {
@@ -1696,7 +1685,9 @@ queue:
        if (!req_need_defer(req, seq) && list_empty(&ctx->defer_list)) {
                spin_unlock(&ctx->completion_lock);
                kfree(de);
-               goto queue;
+               ctx->drain_active = false;
+               io_req_task_queue(req);
+               return;
        }
 
        trace_io_uring_defer(req);