On Fri, Dec 18, 2020 at 11:49 AM Pavel Begunkov <asml.silence@xxxxxxxxx> wrote: > > On 18/12/2020 16:24, Marcelo Diop-Gonzalez wrote: > > Right now io_flush_timeouts() checks if the current number of events > > is equal to ->timeout.target_seq, but this will miss some timeouts if > > there have been more than 1 event added since the last time they were > > flushed (possible in io_submit_flush_completions(), for example). The > > test below hangs before this change (unless you run with > > $ ./a.out ~/somefile 1) > > > [...] > > > > Signed-off-by: Marcelo Diop-Gonzalez <marcelo827@xxxxxxxxx> > > --- > > fs/io_uring.c | 2 +- > > 1 file changed, 1 insertion(+), 1 deletion(-) > > > > diff --git a/fs/io_uring.c b/fs/io_uring.c > > index b74957856e68..ae7244f8e842 100644 > > --- a/fs/io_uring.c > > +++ b/fs/io_uring.c > > @@ -1639,7 +1639,7 @@ static void io_flush_timeouts(struct io_ring_ctx *ctx) > > > > if (io_is_timeout_noseq(req)) > > break; > > - if (req->timeout.target_seq != ctx->cached_cq_tail > > + if (req->timeout.target_seq > ctx->cached_cq_tail > > There was an pretty old patch for probably that problem, which got > lost... Please consider that target_seq and others are u32 and may > easily overflow, you can't do comparisons as freely. It would be > great to finally fix it, but that can be a bit harder to do. Ahh whoops! Good point, didn't think of that. -Marcelo > > > - atomic_read(&ctx->cq_timeouts)) > > break; > > > > > > -- > Pavel Begunkov