On 1/15/21 11:31 AM, Marcelo Diop-Gonzalez wrote: > On Fri, Jan 15, 2021 at 10:02:12AM -0700, Jens Axboe wrote: >> On 1/15/21 9:54 AM, 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): >>> >>> #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); >>> } >>> } >> >> Can you turn this into a test case for liburing? I'll apply the >> associated patch, thanks (and to Pavel for review as well). > > Yup, can do. I'll try to clean it up some first (especially so it > doesn't just hang when it fails :/) That'd of course be nice, but not a hard requirement. A lot of the regressions tests will crash a broken kernel, so... -- Jens Axboe