From: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
To: stable@vger.kernel.org
Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
patches@lists.linux.dev, Josef Bacik <josef@toxicpanda.com>,
Jens Axboe <axboe@kernel.dk>
Subject: [PATCH 6.18 052/109] io_uring/io-wq: dont exit with a creation pending
Date: Wed, 28 Oct 2026 18:00:36 +0100 [thread overview]
Message-ID: <20261028165943.585404886@linuxfoundation.org> (raw)
In-Reply-To: <20261028165942.357251485@linuxfoundation.org>
6.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Josef Bacik <josef@toxicpanda.com>
Commit e231d2e8f80d3649ecd3851b7f2abdfbe606c04b upstream.
A worker that is the last one to go to sleep while work is pending asks
for another worker. io_wq_dec_running() bumps ->nr_running on behalf of
the new worker and queues create_worker_cb() as task_work for the owner
of the io-wq. Until that has run, everybody else takes it that a worker
is running which is going to look after the work list: io_wq_enqueue()
doesn't create one, and other workers that go to sleep don't find
themselves to be the last.
If the worker that made the request exits, io_worker_exit() cancels the
task_work, and io_worker_cancel_cb() drops ->nr_running without a look at
the work list:
worker A worker B io_wq_enqueue()
blocks, work is pending
nr_running++
queues create_worker_cb()
wakes, handles the work
idle timeout, decides to exit
picks up work 1
queues work 2
B is on the free list
still: wakes B
work 1 blocks
nr_running 2 -> 1
io_worker_exit()
io_worker_cancel_cb()
nr_running 1 -> 0
Work 2 has to wait for work 1, although there is room for more workers.
It takes an owner that doesn't get around to run its task_work for the
time of the idle timeout, less if the worker exits because its affinity
was changed or the io-wq is marked exit-on-idle.
Let the worker stay around until its request has been dealt with. Only
the worker itself sets ->create_state, so it can't be set behind its
back once it has decided to leave.
Fixes: 1d5f5ea7cb7d ("io-wq: remove worker to owner tw dependency")
Assisted-by: LLM
Signed-off-by: Josef Bacik <josef@toxicpanda.com>
Link: https://patch.msgid.link/20261015-b4-io-uring-fixes-v1-12-c1556f5d7bf5@toxicpanda.com
Signed-off-by: Jens Axboe <axboe@kernel.dk>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
---
io_uring/io-wq.c | 8 ++++++--
1 file changed, 6 insertions(+), 2 deletions(-)
--- a/io_uring/io-wq.c
+++ b/io_uring/io-wq.c
@@ -755,9 +755,13 @@ static int io_wq_worker(void *data)
* idle-exit, drop the worker as well. This is used to avoid
* keeping io-wq workers around for tasks that no longer have
* any active io_uring instances.
+ * Not as long as a request of ours for another worker is
+ * pending, though. It is accounted as a running worker, which
+ * others rely on, and io_worker_exit() would cancel it.
*/
- if ((last_timeout && (exit_mask || acct->nr_workers > 1)) ||
- test_bit(IO_WQ_BIT_EXIT_ON_IDLE, &wq->state)) {
+ if (((last_timeout && (exit_mask || acct->nr_workers > 1)) ||
+ test_bit(IO_WQ_BIT_EXIT_ON_IDLE, &wq->state)) &&
+ !test_bit(0, &worker->create_state)) {
acct->nr_workers--;
if (test_and_clear_bit(IO_WORKER_F_FREE, &worker->flags))
hlist_nulls_del_init_rcu(&worker->nulls_node);
next prev parent reply other threads:[~2026-10-28 17:48 UTC|newest]
Thread overview: 117+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-10-28 16:59 [PATCH 6.18 000/109] 6.18.60-rc1 review Greg Kroah-Hartman
2026-10-28 16:59 ` [PATCH 6.18 001/109] eventfs: fix SRCU read lock leak in eventfs_iterate() Greg Kroah-Hartman
2026-10-28 16:59 ` [PATCH 6.18 002/109] ACPI: scan: Register platform devices for fixed event buttons Greg Kroah-Hartman
2026-10-28 16:59 ` [PATCH 6.18 003/109] ice: fix rxq info registering in mbuf packets Greg Kroah-Hartman
2026-10-28 16:59 ` [PATCH 6.18 004/109] ice: change XDP RxQ frag_size from DMA write length to xdp.frame_sz Greg Kroah-Hartman
2026-10-28 16:59 ` [PATCH 6.18 005/109] rose: clear stale N(R)/N(S) before (re)transmitting a data frame Greg Kroah-Hartman
2026-10-28 16:59 ` [PATCH 6.18 006/109] netrom: linearize and validate lengths in nr_rx_frame() Greg Kroah-Hartman
2026-10-28 16:59 ` [PATCH 6.18 007/109] netrom: require full NET/ROM headers in nr_route_frame() Greg Kroah-Hartman
2026-10-28 16:59 ` [PATCH 6.18 008/109] net: netrom: validate source address in nr_find_socket() Greg Kroah-Hartman
2026-10-28 16:59 ` [PATCH 6.18 009/109] netrom: bound fragment reassembly in nr_queue_rx_frame() Greg Kroah-Hartman
2026-10-28 16:59 ` [PATCH 6.18 010/109] ax25: fix OOB read after address header strip in ax25_rcv() Greg Kroah-Hartman
2026-10-28 16:59 ` [PATCH 6.18 011/109] ax25: check frame length in ax25_decode() and ax25_rx_iframe() Greg Kroah-Hartman
2026-10-28 16:59 ` [PATCH 6.18 012/109] net: ax25: fix integer overflow in ax25_rx_fragment() Greg Kroah-Hartman
2026-10-28 16:59 ` [PATCH 6.18 013/109] netrom: use a single lock for the node and neighbour lists Greg Kroah-Hartman
2026-10-28 16:59 ` [PATCH 6.18 014/109] netrom: look up and update routes in one critical section Greg Kroah-Hartman
2026-10-28 16:59 ` [PATCH 6.18 015/109] netrom: fix reference count leak in nr_rt_device_down Greg Kroah-Hartman
2026-10-28 17:00 ` [PATCH 6.18 016/109] netrom: clear nr_neigh->ax25 under the routing lock in nr_link_failed() Greg Kroah-Hartman
2026-10-28 17:00 ` [PATCH 6.18 017/109] netrom: fix nr_node leak when nr_del_node() removes the last route Greg Kroah-Hartman
2026-10-28 17:00 ` [PATCH 6.18 018/109] rose: clear through routes when a neighbour is removed from the tables Greg Kroah-Hartman
2026-10-28 17:00 ` [PATCH 6.18 019/109] rose: restart the link of a neighbour created over a live AX.25 connection Greg Kroah-Hartman
2026-10-28 17:00 ` [PATCH 6.18 020/109] ax25: serialise the transmission of I frames on a connection Greg Kroah-Hartman
2026-10-28 17:00 ` [PATCH 6.18 021/109] rose: process received frames and send with the socket locked Greg Kroah-Hartman
2026-10-28 17:00 ` [PATCH 6.18 022/109] ax25: dont create two connections for the same link in ax25_send_frame() Greg Kroah-Hartman
2026-10-28 17:00 ` [PATCH 6.18 023/109] ax25: read the connections ax25_dev only once when walking ax25_list Greg Kroah-Hartman
2026-10-28 17:00 ` [PATCH 6.18 024/109] ax25: wait for ax25_send_frame() before detaching the connections of a device Greg Kroah-Hartman
2026-10-28 17:00 ` [PATCH 6.18 025/109] ax25: dont accept frames on a device that is going down Greg Kroah-Hartman
2026-10-28 17:00 ` [PATCH 6.18 026/109] ax25: send a private copy of each I frame Greg Kroah-Hartman
2026-10-28 17:00 ` [PATCH 6.18 027/109] rose: clear the circuits of a neighbour that restarts the link Greg Kroah-Hartman
2026-10-28 17:00 ` [PATCH 6.18 028/109] ax25: send unacknowledged I frames again when a link is re-established Greg Kroah-Hartman
2026-10-28 17:00 ` [PATCH 6.18 029/109] rose: bring up the link of the preferred route passed over by a connect request Greg Kroah-Hartman
2026-10-28 17:00 ` [PATCH 6.18 030/109] ax25: dont free an incoming SABM skb left on the listeners queue Greg Kroah-Hartman
2026-10-28 17:00 ` [PATCH 6.18 031/109] block: avoid potential deadlock on zone revalidation failure Greg Kroah-Hartman
2026-10-28 17:00 ` [PATCH 6.18 032/109] mm/damon/core: error damos_commit_quota_goal() for zero target_value Greg Kroah-Hartman
2026-10-28 17:00 ` [PATCH 6.18 033/109] net_sched: codel: fix stale state for empty flows in fq_codel Greg Kroah-Hartman
2026-10-28 17:00 ` [PATCH 6.18 034/109] Bluetooth: L2CAP: refuse __l2cap_chan_add if chan already has conn Greg Kroah-Hartman
2026-10-28 17:00 ` [PATCH 6.18 035/109] tracing: Hold trace_types_lock when updating modules in persistent instances Greg Kroah-Hartman
2026-10-28 17:00 ` [PATCH 6.18 036/109] tracing: Hold trace_types_lock when resetting last boot data from readers Greg Kroah-Hartman
2026-10-28 17:00 ` [PATCH 6.18 037/109] tracing: Reject incomplete event filter expressions Greg Kroah-Hartman
2026-10-28 17:00 ` [PATCH 6.18 038/109] tracing: Save the event file instead of the compatible histogram Greg Kroah-Hartman
2026-10-28 17:00 ` [PATCH 6.18 039/109] tracing: Unregister field variable histograms when the command fails Greg Kroah-Hartman
2026-10-28 17:00 ` [PATCH 6.18 040/109] tracing: Fix 64-bit and signed histogram fields on 32-bit kernels Greg Kroah-Hartman
2026-10-28 17:00 ` [PATCH 6.18 041/109] tracing/histograms: Verify event_call identity when updating synth_event refcount Greg Kroah-Hartman
2026-10-28 17:00 ` [PATCH 6.18 042/109] net: gso: limit recursive IP-in-IP segmentation Greg Kroah-Hartman
2026-10-28 17:00 ` [PATCH 6.18 043/109] io-wq: order the exit bit against worker creation task work Greg Kroah-Hartman
2026-10-28 17:00 ` [PATCH 6.18 044/109] io_uring/waitid: own the request before clearing ->head Greg Kroah-Hartman
2026-10-28 17:00 ` [PATCH 6.18 045/109] io_uring/cmd: dont leave list poison in ->hash_node Greg Kroah-Hartman
2026-10-28 17:00 ` [PATCH 6.18 046/109] io_uring/wait: dont spin on a stuck overflow list Greg Kroah-Hartman
2026-10-28 17:00 ` [PATCH 6.18 047/109] io_uring/io-wq: dont lose the signal that ends work Greg Kroah-Hartman
2026-10-28 17:00 ` [PATCH 6.18 048/109] io_uring/io-wq: dont hide a link from cancellations Greg Kroah-Hartman
2026-10-28 17:00 ` [PATCH 6.18 049/109] io_uring: dont flood a cancelling task with task_work Greg Kroah-Hartman
2026-10-28 17:00 ` [PATCH 6.18 050/109] io_uring/io-wq: dont go to sleep on pending work Greg Kroah-Hartman
2026-10-28 17:00 ` [PATCH 6.18 051/109] io_uring/io-wq: dont strand work when a worker exits Greg Kroah-Hartman
2026-10-28 17:00 ` Greg Kroah-Hartman [this message]
2026-10-28 17:00 ` [PATCH 6.18 053/109] io_uring/io-wq: let cancel find picked up hashed work Greg Kroah-Hartman
2026-10-28 17:00 ` [PATCH 6.18 054/109] io_uring/poll: dont lose a cancel as io-wq arms poll Greg Kroah-Hartman
2026-10-28 17:00 ` [PATCH 6.18 055/109] io_uring: dont lose a cancel as io-wq parks a request Greg Kroah-Hartman
2026-10-28 17:00 ` [PATCH 6.18 056/109] io_uring/cancel: dont forget that the work was running Greg Kroah-Hartman
2026-10-28 17:00 ` [PATCH 6.18 057/109] io_uring/cancel: recognize "no timeout" on 32-bit Greg Kroah-Hartman
2026-10-28 17:00 ` [PATCH 6.18 058/109] io_uring/cancel: let CANCEL_ALL find parked requests Greg Kroah-Hartman
2026-10-28 17:00 ` [PATCH 6.18 059/109] io_uring: wake ring pollers for local task_work Greg Kroah-Hartman
2026-10-28 17:00 ` [PATCH 6.18 060/109] io_uring/wait: look at all CQ waiters on wake up Greg Kroah-Hartman
2026-10-28 17:00 ` [PATCH 6.18 061/109] io_uring/poll: drop stale double poll entry on rearm Greg Kroah-Hartman
2026-10-28 17:00 ` [PATCH 6.18 062/109] io_uring/futex: allocate private hash before waiting Greg Kroah-Hartman
2026-10-28 17:00 ` [PATCH 6.18 063/109] io_uring: drop the CQE cache if a refill fails Greg Kroah-Hartman
2026-10-28 17:00 ` [PATCH 6.18 064/109] io_uring/register: dont wrap 32b CQEs when resizing Greg Kroah-Hartman
2026-10-28 17:00 ` [PATCH 6.18 065/109] io_uring/register: handle index wrap " Greg Kroah-Hartman
2026-10-28 17:00 ` [PATCH 6.18 066/109] io_uring/fdinfo: fix CQE dump of CQE32 rings Greg Kroah-Hartman
2026-10-28 17:00 ` [PATCH 6.18 067/109] io_uring/timeout: dont skip over reached sequences Greg Kroah-Hartman
2026-10-28 17:00 ` [PATCH 6.18 068/109] io_uring/timeout: keep repeat count on multishot update Greg Kroah-Hartman
2026-10-28 17:00 ` [PATCH 6.18 069/109] io_uring/wait: no early -ETIME if min_wait finds work Greg Kroah-Hartman
2026-10-28 17:00 ` [PATCH 6.18 070/109] io_uring/napi: make stale entries time out after 60s Greg Kroah-Hartman
2026-10-28 17:00 ` [PATCH 6.18 071/109] io_uring/napi: dont busy poll past an expired timeout Greg Kroah-Hartman
2026-10-28 17:00 ` [PATCH 6.18 072/109] io_uring/zcrx: fix buffer offsets in areas above 4GB Greg Kroah-Hartman
2026-10-28 17:00 ` [PATCH 6.18 073/109] io_uring/kbuf: handle index wrap in last buffer check Greg Kroah-Hartman
2026-10-28 17:00 ` [PATCH 6.18 074/109] io_uring/sqpoll: let the thread sleep on disabled rings Greg Kroah-Hartman
2026-10-28 17:00 ` [PATCH 6.18 075/109] io_uring/openclose: keep the lock in io_pipe_fixed() Greg Kroah-Hartman
2026-10-28 17:01 ` [PATCH 6.18 076/109] io_uring: dont pass restart error codes to userspace Greg Kroah-Hartman
2026-10-28 17:01 ` [PATCH 6.18 077/109] io_uring/net: dont retry recv on uncommitted buffers Greg Kroah-Hartman
2026-10-28 17:01 ` [PATCH 6.18 078/109] io_uring/timeout: no ABS update of multishot timeouts Greg Kroah-Hartman
2026-10-28 17:01 ` [PATCH 6.18 079/109] io_uring/timeout: dont end a linked timeout with 1 Greg Kroah-Hartman
2026-10-28 17:01 ` [PATCH 6.18 080/109] io_uring: look up the file before queueing to io-wq Greg Kroah-Hartman
2026-10-28 17:01 ` [PATCH 6.18 081/109] io_uring/poll: avoid retry wakeup loss when dropping ownership Greg Kroah-Hartman
2026-10-28 17:01 ` [PATCH 6.18 082/109] io_uring/timeout: dont put a sequence target behind the last flush Greg Kroah-Hartman
2026-10-28 17:01 ` [PATCH 6.18 083/109] io_uring/timeout: dont flush with the sequence " Greg Kroah-Hartman
2026-10-28 17:01 ` [PATCH 6.18 084/109] io_uring/timeout: dont lose a cancel as io-wq arms a timeout Greg Kroah-Hartman
2026-10-28 17:01 ` [PATCH 6.18 085/109] io_uring/poll: dont loop on HUP with multiple references Greg Kroah-Hartman
2026-10-28 17:01 ` [PATCH 6.18 086/109] io_uring/net: keep recv buffer select length within MAX_RW_COUNT Greg Kroah-Hartman
2026-10-28 17:01 ` [PATCH 6.18 087/109] io_uring/wait: wake real-time waiters from hard interrupt context Greg Kroah-Hartman
2026-10-28 17:01 ` [PATCH 6.18 088/109] io_uring/waitid: prevent cancel reference wrap Greg Kroah-Hartman
2026-10-28 17:01 ` [PATCH 6.18 089/109] io_uring: end the drain when the drain request completes Greg Kroah-Hartman
2026-10-28 17:01 ` [PATCH 6.18 090/109] io_uring: keep the drain active when a deferred drain request is started Greg Kroah-Hartman
2026-10-28 17:01 ` [PATCH 6.18 091/109] keys: Avoid the owner account dereference in named keyring lookup Greg Kroah-Hartman
2026-10-28 17:01 ` [PATCH 6.18 092/109] keys: Check the authorization payload in process keyring searches Greg Kroah-Hartman
2026-10-28 17:01 ` [PATCH 6.18 093/109] keys: Protect the type name while describing a key Greg Kroah-Hartman
2026-10-28 17:01 ` [PATCH 6.18 094/109] keys: make keyring indexes independent of kernel addresses Greg Kroah-Hartman
2026-10-28 17:01 ` [PATCH 6.18 095/109] keys: Protect the read method check against type removal Greg Kroah-Hartman
2026-10-28 17:01 ` [PATCH 6.18 096/109] KEYS: Fix key_reject_and_link() race with keyring restriction Greg Kroah-Hartman
2026-10-28 17:01 ` [PATCH 6.18 097/109] KEYS: trusted: Fix blob allocation size in tpm2_key_decode() Greg Kroah-Hartman
2026-10-28 17:01 ` [PATCH 6.18 098/109] keys/trusted_keys: return immediately after TPM unseal failure Greg Kroah-Hartman
2026-10-28 17:01 ` [PATCH 6.18 099/109] asymmetric_keys: reject trust keys without IDs Greg Kroah-Hartman
2026-10-28 17:01 ` [PATCH 6.18 100/109] ftrace: Initialize modname and offset in print_rec() Greg Kroah-Hartman
2026-10-28 17:01 ` [PATCH 6.18 101/109] coredump: hold RCU while releasing parked threads Greg Kroah-Hartman
2026-10-28 17:01 ` [PATCH 6.18 102/109] signal: only SIGKILL and the freezers interrupt a coredumping task Greg Kroah-Hartman
2026-10-28 17:01 ` [PATCH 6.18 103/109] signal: dont retarget shared signals in a dying thread group Greg Kroah-Hartman
2026-10-28 17:01 ` [PATCH 6.18 104/109] ptrace: refuse to change the signal mask of a user worker Greg Kroah-Hartman
2026-10-28 17:01 ` [PATCH 6.18 105/109] fork: release the files of a failed fork after sched_cancel_fork() Greg Kroah-Hartman
2026-10-28 17:01 ` [PATCH 6.18 106/109] exit: hang up the tty before closing the files Greg Kroah-Hartman
2026-10-28 17:01 ` [PATCH 6.18 107/109] pid_namespace: prevent TIF_NOTIFY_SIGNAL from interrupting the reaper Greg Kroah-Hartman
2026-10-28 17:01 ` [PATCH 6.18 108/109] signal: allow taks to temporarily block TIF_NOTIFY_SIGNAL Greg Kroah-Hartman
2026-10-28 17:01 ` [PATCH 6.18 109/109] ACPI: scan: Avoid registering platform devices with resource overlaps Greg Kroah-Hartman
2026-10-28 19:39 ` [PATCH 6.18 000/109] 6.18.60-rc1 review Brett A C Sheffield
2026-10-29 3:09 ` Peter Schneider
2026-10-29 10:07 ` Pavel Machek
2026-10-29 13:43 ` Miguel Ojeda
2026-10-29 14:23 ` Ron Economos
2026-10-29 15:21 ` Shuah Khan
2026-10-29 16:29 ` Florian Fainelli
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20261028165943.585404886@linuxfoundation.org \
--to=gregkh@linuxfoundation.org \
--cc=axboe@kernel.dk \
--cc=josef@toxicpanda.com \
--cc=patches@lists.linux.dev \
--cc=stable@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox