diff options
Diffstat (limited to 'test/d4ae271dfaae.c')
-rw-r--r-- | test/d4ae271dfaae.c | 96 |
1 files changed, 96 insertions, 0 deletions
diff --git a/test/d4ae271dfaae.c b/test/d4ae271dfaae.c new file mode 100644 index 0000000..397b94b --- /dev/null +++ b/test/d4ae271dfaae.c @@ -0,0 +1,96 @@ +/* SPDX-License-Identifier: MIT */ +/* + * Test case for SQPOLL missing a 'ret' clear in case of busy. + * + * Heavily based on a test case from + * Xiaoguang Wang <xiaoguang.wang@linux.alibaba.com> + */ +#include <stdio.h> +#include <stdlib.h> +#include <fcntl.h> +#include <unistd.h> +#include <string.h> + +#include "helpers.h" +#include "liburing.h" + +#define FILE_SIZE (128 * 1024) + +int main(int argc, char *argv[]) +{ + struct io_uring ring; + int i, fd, ret; + struct io_uring_sqe *sqe; + struct io_uring_cqe *cqe; + struct iovec *iovecs; + struct io_uring_params p; + char *fname; + void *buf; + + memset(&p, 0, sizeof(p)); + p.flags = IORING_SETUP_SQPOLL; + ret = t_create_ring_params(4, &ring, &p); + if (ret == T_SETUP_SKIP) + return 0; + else if (ret < 0) + return 1; + + if (argc > 1) { + fname = argv[1]; + } else { + fname = ".sqpoll.tmp"; + t_create_file(fname, FILE_SIZE); + } + + fd = open(fname, O_RDONLY | O_DIRECT); + if (fname != argv[1]) + unlink(fname); + if (fd < 0) { + perror("open"); + goto out; + } + + iovecs = t_calloc(10, sizeof(struct iovec)); + for (i = 0; i < 10; i++) { + t_posix_memalign(&buf, 4096, 4096); + iovecs[i].iov_base = buf; + iovecs[i].iov_len = 4096; + } + + ret = io_uring_register_files(&ring, &fd, 1); + if (ret < 0) { + fprintf(stderr, "register files %d\n", ret); + goto out; + } + + for (i = 0; i < 10; i++) { + sqe = io_uring_get_sqe(&ring); + if (!sqe) + break; + + io_uring_prep_readv(sqe, 0, &iovecs[i], 1, 0); + sqe->flags |= IOSQE_FIXED_FILE; + + ret = io_uring_submit(&ring); + usleep(1000); + } + + for (i = 0; i < 10; i++) { + ret = io_uring_wait_cqe(&ring, &cqe); + if (ret) { + fprintf(stderr, "wait_cqe=%d\n", ret); + break; + } + if (cqe->res != 4096) { + fprintf(stderr, "ret=%d, wanted 4096\n", cqe->res); + ret = 1; + break; + } + io_uring_cqe_seen(&ring, cqe); + } + + close(fd); +out: + io_uring_queue_exit(&ring); + return ret; +} |