Patch "io_uring: ensure that cached task references are always put on exit" has been added to the 5.10-stable tree

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This is a note to let you know that I've just added the patch titled

    io_uring: ensure that cached task references are always put on exit

to the 5.10-stable tree which can be found at:
    http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

The filename of the patch is:
     io_uring-ensure-that-cached-task-references-are-alwa.patch
and it can be found in the queue-5.10 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree,
please let <stable@xxxxxxxxxxxxxxx> know about it.



commit a0e88106b70717e45b0957db31d9a30f027f8638
Author: Jens Axboe <axboe@xxxxxxxxx>
Date:   Sat Jan 21 12:36:08 2023 -0700

    io_uring: ensure that cached task references are always put on exit
    
    commit e775f93f2ab976a2cdb4a7b53063cbe890904f73 upstream.
    
    io_uring caches task references to avoid doing atomics for each of them
    per request. If a request is put from the same task that allocated it,
    then we can maintain a per-ctx cache of them. This obviously relies
    on io_uring always pruning caches in a reliable way, and there's
    currently a case off io_uring fd release where we can miss that.
    
    One example is a ring setup with IOPOLL, which relies on the task
    polling for completions, which will free them. However, if such a task
    submits a request and then exits or closes the ring without reaping
    the completion, then ring release will reap and put. If release happens
    from that very same task, the completed request task refs will get
    put back into the cache pool. This is problematic, as we're now beyond
    the point of pruning caches.
    
    Manually drop these caches after doing an IOPOLL reap. This releases
    references from the current task, which is enough. If another task
    happens to be doing the release, then the caching will not be
    triggered and there's no issue.
    
    Cc: stable@xxxxxxxxxxxxxxx
    Fixes: e98e49b2bbf7 ("io_uring: extend task put optimisations")
    Reported-by: Homin Rhee <hominlab@xxxxxxxxx>
    Signed-off-by: Jens Axboe <axboe@xxxxxxxxx>
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/io_uring/io_uring.c b/io_uring/io_uring.c
index e8852d56b1ec..f8a0d228d799 100644
--- a/io_uring/io_uring.c
+++ b/io_uring/io_uring.c
@@ -9513,6 +9513,10 @@ static void io_ring_ctx_wait_and_kill(struct io_ring_ctx *ctx)
 	/* if we failed setting up the ctx, we might not have any rings */
 	io_iopoll_try_reap_events(ctx);
 
+	/* drop cached put refs after potentially doing completions */
+	if (current->io_uring)
+		io_uring_drop_tctx_refs(current);
+
 	INIT_WORK(&ctx->exit_work, io_ring_exit_work);
 	/*
 	 * Use system_unbound_wq to avoid spawning tons of event kworkers



[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux