Revert "io_uring: fix IO hang in io_wq_put_and_exit from do_exit()"

This reverts commit b484a40dc1.

This commit cancels all requests with io-wq, not just the ones from the
originating task. This breaks use cases that have thread pools, or just
multiple tasks issuing requests on the same ring. The liburing
regression test for this also shows that problem:

$ test/thread-exit.t
cqe->res=-125, Expected 512

where an IO thread gets its request canceled rather than complete
successfully.

Signed-off-by: Jens Axboe <axboe@kernel.dk>
This commit is contained in:
Jens Axboe 2023-09-07 09:41:49 -06:00
parent 27122c079f
commit 023464fe33

View File

@ -3317,37 +3317,6 @@ static s64 tctx_inflight(struct io_uring_task *tctx, bool tracked)
return percpu_counter_sum(&tctx->inflight);
}
static void io_uring_cancel_wq(struct io_uring_task *tctx)
{
int ret;
if (!tctx->io_wq)
return;
/*
* FIXED_FILE request isn't tracked in do_exit(), and these
* requests may be submitted to our io_wq as iopoll, so have to
* cancel them before destroying io_wq for avoiding IO hang
*/
do {
struct io_tctx_node *node;
unsigned long index;
ret = 0;
xa_for_each(&tctx->xa, index, node) {
struct io_ring_ctx *ctx = node->ctx;
struct io_task_cancel cancel = { .task = current, .all = true, };
enum io_wq_cancel cret;
io_iopoll_try_reap_events(ctx);
cret = io_wq_cancel_cb(tctx->io_wq, io_cancel_task_cb,
&cancel, true);
ret |= (cret != IO_WQ_CANCEL_NOTFOUND);
cond_resched();
}
} while (ret);
}
/*
* Find any io_uring ctx that this task has registered or done IO on, and cancel
* requests. @sqd should be not-null IFF it's an SQPOLL thread cancellation.
@ -3419,7 +3388,6 @@ __cold void io_uring_cancel_generic(bool cancel_all, struct io_sq_data *sqd)
finish_wait(&tctx->wait, &wait);
} while (1);
io_uring_cancel_wq(tctx);
io_uring_clean_tctx(tctx);
if (cancel_all) {
/*