On Thu, Jan 14, 2021 at 09:42:36PM +0000, Pavel Begunkov wrote: > On 14/01/2021 15:50, Marcelo Diop-Gonzalez wrote: > > This patch tries to fix a problem with IORING_OP_TIMEOUT events > > not being flushed if they should already have expired. The test below > > hangs before this change (unless you run with $ ./a.out ~/somefile 1): > > How sending it as a liburing test? Oh yea I didn't even think of that. I can clean it up some and send a patch -Marcelo > > BTW, there was a test before triggering this issue but was shut off > with "return 0" at some point, but that's not for sure. > > > > > #include <fcntl.h> > > #include <stdio.h> > > #include <stdlib.h> > > #include <string.h> > > #include <unistd.h> > > > > #include <liburing.h> > > > > int main(int argc, char **argv) { > > if (argc < 2) > > return 1; > > > > int fd = open(argv[1], O_RDONLY); > > if (fd < 0) { > > perror("open"); > > return 1; > > } > > > > struct io_uring ring; > > io_uring_queue_init(4, &ring, 0); > > > > struct io_uring_sqe *sqe = io_uring_get_sqe(&ring); > > > > struct __kernel_timespec ts = { .tv_sec = 9999999 }; > > io_uring_prep_timeout(sqe, &ts, 1, 0); > > sqe->user_data = 123; > > int ret = io_uring_submit(&ring); > > if (ret < 0) { > > fprintf(stderr, "submit(timeout_sqe): %d\n", ret); > > return 1; > > } > > > > int n = 2; > > if (argc > 2) > > n = atoi(argv[2]); > > > > char buf; > > for (int i = 0; i < n; i++) { > > sqe = io_uring_get_sqe(&ring); > > if (!sqe) { > > fprintf(stderr, "too many\n"); > > exit(1); > > } > > io_uring_prep_read(sqe, fd, &buf, 1, 0); > > } > > ret = io_uring_submit(&ring); > > if (ret < 0) { > > fprintf(stderr, "submit(read_sqe): %d\n", ret); > > exit(1); > > } > > > > struct io_uring_cqe *cqe; > > for (int i = 0; i < n+1; i++) { > > struct io_uring_cqe *cqe; > > int ret = io_uring_wait_cqe(&ring, &cqe); > > if (ret < 0) { > > fprintf(stderr, "wait_cqe(): %d\n", ret); > > return 1; > > } > > if (cqe->user_data == 123) > > printf("timeout found\n"); > > io_uring_cqe_seen(&ring, cqe); > > } > > } > > > > v3: Add ->last_flush member to handle more overflow issues > > v2: Properly handle u32 overflow issues > > > > Marcelo Diop-Gonzalez (1): > > io_uring: flush timeouts that should already have expired > > > > fs/io_uring.c | 29 +++++++++++++++++++++++++---- > > 1 file changed, 25 insertions(+), 4 deletions(-) > > > > -- > Pavel Begunkov