Skip to content

Commit c93cc9e

Browse files
committed
io_uring: iopoll requests should also wake task ->in_idle state
If we're freeing/finishing iopoll requests, ensure we check if the task is in idling in terms of cancelation. Otherwise we could end up waiting forever in __io_uring_task_cancel() if the task has active iopoll requests that need cancelation. Cc: [email protected] # 5.9+ Signed-off-by: Jens Axboe <[email protected]>
1 parent a8d13db commit c93cc9e

File tree

1 file changed

+4
-0
lines changed

1 file changed

+4
-0
lines changed

fs/io_uring.c

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2270,6 +2270,8 @@ static void io_req_free_batch_finish(struct io_ring_ctx *ctx,
22702270
struct io_uring_task *tctx = rb->task->io_uring;
22712271

22722272
percpu_counter_sub(&tctx->inflight, rb->task_refs);
2273+
if (atomic_read(&tctx->in_idle))
2274+
wake_up(&tctx->wait);
22732275
put_task_struct_many(rb->task, rb->task_refs);
22742276
rb->task = NULL;
22752277
}
@@ -2288,6 +2290,8 @@ static void io_req_free_batch(struct req_batch *rb, struct io_kiocb *req)
22882290
struct io_uring_task *tctx = rb->task->io_uring;
22892291

22902292
percpu_counter_sub(&tctx->inflight, rb->task_refs);
2293+
if (atomic_read(&tctx->in_idle))
2294+
wake_up(&tctx->wait);
22912295
put_task_struct_many(rb->task, rb->task_refs);
22922296
}
22932297
rb->task = req->task;

0 commit comments

Comments
 (0)