diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2026-01-09 15:21:15 -1000 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2026-01-09 15:21:15 -1000 |
| commit | 68ad2095ca0f42a92d16d8cd1df0fb4f4bff634a (patch) | |
| tree | bf7dcf081a974e348dfbe52690f0f11cc1e5a63f /io_uring | |
| parent | e28ddd0b7af218e1a8863c524e15918895af9ac8 (diff) | |
| parent | e4fdbca2dc774366aca6532b57bfcdaae29aaf63 (diff) | |
Merge tag 'io_uring-6.19-20260109' of git://git.kernel.org/pub/scm/linux/kernel/git/axboe/linux
Pull io_uring fixes from Jens Axboe:
"A single fix for a regression introduced in 6.15, where a failure to
wake up idle io-wq workers at ring exit will wait for the timeout to
expire.
This isn't normally noticeable, as the exit is async.
But if a parent task created a thread that sets up a ring and uses
requests that cause io-wq threads to be created, and the parent task
then waits for the thread to exit, then it can take 5 seconds for that
pthread_join() to succeed as the child thread is waiting for its
children to exit.
On top of that, just a basic cleanup as well"
* tag 'io_uring-6.19-20260109' of git://git.kernel.org/pub/scm/linux/kernel/git/axboe/linux:
io_uring/io-wq: remove io_wq_for_each_worker() return value
io_uring/io-wq: fix incorrect io_wq_for_each_worker() termination logic
Diffstat (limited to 'io_uring')
| -rw-r--r-- | io_uring/io-wq.c | 11 |
1 files changed, 4 insertions, 7 deletions
diff --git a/io_uring/io-wq.c b/io_uring/io-wq.c index cd13d8aac3d2..9fd9f6ab722c 100644 --- a/io_uring/io-wq.c +++ b/io_uring/io-wq.c @@ -947,16 +947,13 @@ static bool io_acct_for_each_worker(struct io_wq_acct *acct, return ret; } -static bool io_wq_for_each_worker(struct io_wq *wq, +static void io_wq_for_each_worker(struct io_wq *wq, bool (*func)(struct io_worker *, void *), void *data) { - for (int i = 0; i < IO_WQ_ACCT_NR; i++) { - if (!io_acct_for_each_worker(&wq->acct[i], func, data)) - return false; - } - - return true; + for (int i = 0; i < IO_WQ_ACCT_NR; i++) + if (io_acct_for_each_worker(&wq->acct[i], func, data)) + break; } static bool io_wq_worker_wake(struct io_worker *worker, void *data) |
