On 10/25/23 9:31 AM, Andres Freund wrote: > Hi, > > On 2023-10-24 18:34:05 -0600, Jens Axboe wrote: >> Yeah I'm going to do a revert of the io_uring side, which effectively >> disables it. Then a revised series can be done, and when done, we could >> bring it back. > > I'm queueing a test to confirm that the revert actually fixes things. > Is there still benefit in testing your other patch in addition > upstream? Don't think there's much point to testing the quick hack, I believe it should work. So testing the most recent revert is useful, though I also fully expect that to work. And then we can test the re-enable once that is sent out, I did prepare a series. But timing is obviously unfortunate for that, as it'll miss 6.6 and now also 6.7 due to the report timing. FWIW, I wrote a small test case which does seem to trigger it very fast, as expected: #define _GNU_SOURCE #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <fcntl.h> #include <string.h> #include <liburing.h> #define BS 4096 #define FSIZE (128 * 1024 * 1024UL) static int set_file_size(int fd, off_t file_size) { off_t this_size; char buf[BS]; int ret; memset(buf, 0, BS); this_size = 0; while (this_size < file_size) { ret = write(fd, buf, BS); if (ret != BS) { fprintf(stderr, "write ret %d\n", ret); return 1; } this_size += BS; } fsync(fd); posix_fadvise(fd, 0, file_size, POSIX_FADV_DONTNEED); return 0; } int main(int argc, char *argv[]) { struct io_uring_sqe *sqe; struct io_uring_cqe *cqe; struct io_uring ring; off_t off, foff; int fd, i, ret; void *buf; if (argc < 2) { fprintf(stderr, "%s <file>\n", argv[0]); return 1; } fd = open(argv[1], O_RDWR | O_CREAT | O_TRUNC | O_DIRECT, 0644); if (fd < 0) { perror("open"); return 1; } if (set_file_size(fd, FSIZE)) return 1; if (posix_memalign(&buf, 4096, BS)) return 1; io_uring_queue_init(8, &ring, 0); i = 0; off = 0; foff = FSIZE + BS; do { sqe = io_uring_get_sqe(&ring); io_uring_prep_write(sqe, fd, buf, BS, off); off += BS; if (off == FSIZE) off = 0; io_uring_submit(&ring); ret = posix_fallocate(fd, 0, foff); if (ret < 0) { perror("fallocate"); return 1; } foff += BS; ret = io_uring_wait_cqe(&ring, &cqe); if (ret) { fprintf(stderr, "wait cqe %d\n", ret); return 1; } io_uring_cqe_seen(&ring, cqe); i++; if (!(i & 1023)) fprintf(stdout, "Loop iteration %d\n", i); } while (1); return 0; } -- Jens Axboe