Skip to content

Commit 45500dc

Browse files
isilenceaxboe
authored andcommitted
io_uring: break out of iowq iopoll on teardown
io-wq will retry iopoll even when it failed with -EAGAIN. If that races with task exit, which sets TIF_NOTIFY_SIGNAL for all its workers, such workers might potentially infinitely spin retrying iopoll again and again and each time failing on some allocation / waiting / etc. Don't keep spinning if io-wq is dying. Fixes: 561fb04 ("io_uring: replace workqueue usage with io-wq") Cc: stable@vger.kernel.org Signed-off-by: Pavel Begunkov <asml.silence@gmail.com> Signed-off-by: Jens Axboe <axboe@kernel.dk>
1 parent 76d3cce commit 45500dc

File tree

3 files changed

+13
-0
lines changed

3 files changed

+13
-0
lines changed

io_uring/io-wq.c

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -174,6 +174,16 @@ static void io_worker_ref_put(struct io_wq *wq)
174174
complete(&wq->worker_done);
175175
}
176176

177+
bool io_wq_worker_stopped(void)
178+
{
179+
struct io_worker *worker = current->worker_private;
180+
181+
if (WARN_ON_ONCE(!io_wq_current_is_worker()))
182+
return true;
183+
184+
return test_bit(IO_WQ_BIT_EXIT, &worker->wq->state);
185+
}
186+
177187
static void io_worker_cancel_cb(struct io_worker *worker)
178188
{
179189
struct io_wq_acct *acct = io_wq_get_acct(worker);

io_uring/io-wq.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@ void io_wq_hash_work(struct io_wq_work *work, void *val);
5252

5353
int io_wq_cpu_affinity(struct io_uring_task *tctx, cpumask_var_t mask);
5454
int io_wq_max_workers(struct io_wq *wq, int *new_count);
55+
bool io_wq_worker_stopped(void);
5556

5657
static inline bool io_wq_is_hashed(struct io_wq_work *work)
5758
{

io_uring/io_uring.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1975,6 +1975,8 @@ void io_wq_submit_work(struct io_wq_work *work)
19751975
if (!needs_poll) {
19761976
if (!(req->ctx->flags & IORING_SETUP_IOPOLL))
19771977
break;
1978+
if (io_wq_worker_stopped())
1979+
break;
19781980
cond_resched();
19791981
continue;
19801982
}

0 commit comments

Comments
 (0)