]> git.proxmox.com Git - mirror_ubuntu-kernels.git/commitdiff
io_uring: don't use complete_all() on SQPOLL thread exit
authorJens Axboe <axboe@kernel.dk>
Fri, 26 Feb 2021 20:46:49 +0000 (13:46 -0700)
committerJens Axboe <axboe@kernel.dk>
Thu, 4 Mar 2021 13:34:04 +0000 (06:34 -0700)
We want to reuse this completion, and a single complete should do just
fine. Ensure that we park ourselves first if requested, as that is what
lead to the initial deadlock in this area. If we've got someone attempting
to park us, then we can't proceed without having them finish first.

Fixes: 37d1e2e3642e ("io_uring: move SQPOLL thread io-wq forked worker")
Signed-off-by: Jens Axboe <axboe@kernel.dk>
fs/io_uring.c

index 9d6696ff5748db0a89668558499f4bd978711e02..904bf0fecc36a86625ab88df1fb654dd6bc05df1 100644 (file)
@@ -6783,10 +6783,13 @@ static int io_sq_thread(void *data)
 
        io_run_task_work();
 
+       if (io_sq_thread_should_park(sqd))
+               io_sq_thread_parkme(sqd);
+
        /*
         * Clear thread under lock so that concurrent parks work correctly
         */
-       complete_all(&sqd->completion);
+       complete(&sqd->completion);
        mutex_lock(&sqd->lock);
        sqd->thread = NULL;
        list_for_each_entry(ctx, &sqd->ctx_list, sqd_list) {