Re: [PATCH] io_uring: fix IO hang in io_wq_put_and_exit from do_exit()

Ming Lei
2023-09-01T01:57:53Z

On Thu, Aug 31, 2023 at 11:59:42AM -0600, Jens Axboe wrote:
> On 8/31/23 1:42 AM, Ming Lei wrote:
> > @@ -3313,11 +3323,12 @@ __cold void io_uring_cancel_generic(bool cancel_all, struct io_sq_data *sqd)
> > atomic_inc(&tctx->in_cancel);
> > do {
> > bool loop = false;
> > + bool wq_cancelled;
>
> Minor nit, but io_uring generally uses US spelling, so this should be
> wq_canceled.

OK.

>
> >
> > io_uring_drop_tctx_refs(current);
> > /* read completions before cancelations */
> > inflight = tctx_inflight(tctx, !cancel_all);
> > - if (!inflight)
> > + if (!inflight && !tctx->io_wq)
> > break;
>
> Not sure I follow this one, is it just for checking of io_wq was ever
> setup? How could it not be?

Here if we have io_wq, all requests in io_wq have to be canceled no
matter if inflight is zero or not because tctx_inflight(tctx, true)
doesn't track FIXED_FILE IOs, but there still can be such IOs in io_wq.

>
> > - if (loop) {
> > + if (!wq_cancelled || (inflight && loop)) {
> > cond_resched();
> > continue;
> > }
>
> And this one is a bit puzzling to me too - if we didn't cancel anything
> but don't have anything inflight, why are we looping? Should it be
> something ala:
>
> if (inflight && (!wq_cancelled || loop)) {

There can be FIXED_FILE IOs in io_wq even though inflight is zero.

Thanks,
Ming