On 3/5/25 10:03 AM, Jens Axboe wrote: > On 3/5/25 9:57 AM, John Garry wrote: >> On 04/03/2025 18:10, John Garry wrote: >> >> + >> >>> On 09/01/2025 18:15, Jens Axboe wrote: >>>> Rather than try and have io_read/io_write turn REQ_F_REISSUE into >>>> -EAGAIN, catch the REQ_F_REISSUE when the request is otherwise >>>> considered as done. This is saner as we know this isn't happening >>>> during an actual submission, and it removes the need to randomly >>>> check REQ_F_REISSUE after read/write submission. >>>> >>>> If REQ_F_REISSUE is set, __io_submit_flush_completions() will skip over >>>> this request in terms of posting a CQE, and the regular request >>>> cleaning will ensure that it gets reissued via io-wq. >>>> >>>> Signed-off-by: Jens Axboe <axboe@xxxxxxxxx> >>> >> >> Further info, I can easily recreate this on latest block/io_uring-6.14 on real NVMe HW: > > Thanks, I'll take a look! Can you give this a spin? diff --git a/io_uring/rw.c b/io_uring/rw.c index 9edc6baebd01..e5528cebcd06 100644 --- a/io_uring/rw.c +++ b/io_uring/rw.c @@ -560,11 +560,10 @@ static void io_complete_rw_iopoll(struct kiocb *kiocb, long res) if (kiocb->ki_flags & IOCB_WRITE) io_req_end_write(req); if (unlikely(res != req->cqe.res)) { - if (res == -EAGAIN && io_rw_should_reissue(req)) { + if (res == -EAGAIN && io_rw_should_reissue(req)) req->flags |= REQ_F_REISSUE | REQ_F_BL_NO_RECYCLE; - return; - } - req->cqe.res = res; + else + req->cqe.res = res; } /* order with io_iopoll_complete() checking ->iopoll_completed */ -- Jens Axboe