io_uring/io-wq: ignore non-busy worker going to sleep
authorJens Axboe <axboe@kernel.dk>
Fri, 23 May 2025 12:05:37 +0000 (06:05 -0600)
committerJens Axboe <axboe@kernel.dk>
Fri, 23 May 2025 12:14:07 +0000 (06:14 -0600)
When an io-wq worker goes to sleep, it checks if there's work to do.
If there is, it'll create a new worker. But if this worker is currently
idle, it'll either get woken right back up immediately, or someone
else has already created the necessary worker to handle this work.

Only go through the worker creation logic if the current worker is
currently handling a work item. That means it's being scheduled out as
part of handling that work, not just going to sleep on its own.

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

index d36d0bd9847de87941243609a712f30efa1a8005..c4af99460399d7d873aeb7481e58d6bd29d7ea8d 100644 (file)
@@ -429,6 +429,8 @@ static void io_wq_dec_running(struct io_worker *worker)
 
        if (!atomic_dec_and_test(&acct->nr_running))
                return;
+       if (!worker->cur_work)
+               return;
        if (!io_acct_run_queue(acct))
                return;