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. > - atomic_read(&ctx->cq_timeouts)) > break; > > -- Pavel Begunkov