From 79a7d3a3f6710dc257dfb2095d5d91d73d0b93bf Mon Sep 17 00:00:00 2001 From: Jens Axboe Date: Thu, 17 Jan 2019 13:05:52 -0700 Subject: Add IORING_OP_POLL_CANCEL test Signed-off-by: Jens Axboe --- test/poll-cancel.c | 98 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 98 insertions(+) create mode 100644 test/poll-cancel.c (limited to 'test/poll-cancel.c') diff --git a/test/poll-cancel.c b/test/poll-cancel.c new file mode 100644 index 0000000..ec12353 --- /dev/null +++ b/test/poll-cancel.c @@ -0,0 +1,98 @@ +/* + * Description: test io_uring poll cancel handling + * + */ +#include +#include +#include +#include +#include +#include + +#include "../src/liburing.h" + +int main(int argc, char *argv[]) +{ + struct io_uring ring; + int pipe1[2]; + struct io_uring_cqe *cqe; + struct io_uring_sqe *sqe; + unsigned long addr; + int ret; + + if (pipe(pipe1) != 0) { + printf("pipe failed\n"); + return 1; + } + + ret = io_uring_queue_init(2, &ring, 0); + if (ret) { + printf("child: ring setup failed\n"); + return 1; + } + + sqe = io_uring_get_sqe(&ring); + if (!sqe) { + printf("child: get sqe failed\n"); + return 1; + } + sqe->opcode = IORING_OP_POLL; + sqe->flags = 0; + sqe->ioprio = 0; + sqe->fd = pipe1[0]; + sqe->addr = POLLIN; + sqe->off = 0; + sqe->len = 0; + sqe->buf_index = 0; + sqe->user_data = addr = (unsigned long) &sqe; + + ret = io_uring_submit(&ring); + if (ret <= 0) { + printf("child: sqe submit failed\n"); + return 1; + } + + sqe = io_uring_get_sqe(&ring); + if (!sqe) { + printf("child: get sqe failed\n"); + return 1; + } + sqe->opcode = IORING_OP_POLL_CANCEL; + sqe->flags = 0; + sqe->ioprio = 0; + sqe->fd = 0; + sqe->addr = addr; + sqe->off = 0; + sqe->len = 0; + sqe->buf_index = 0; + sqe->user_data = (unsigned long) &sqe; + + ret = io_uring_submit(&ring); + if (ret <= 0) { + printf("child: sqe submit failed\n"); + return 1; + } + + ret = io_uring_wait_completion(&ring, &cqe); + if (ret < 0) { + printf("child: get cqe failed\n"); + return 1; + } + + if (cqe->user_data != addr) { + printf("first complete not poll\n"); + return 1; + } + + ret = io_uring_wait_completion(&ring, &cqe); + if (ret < 0) { + printf("parent: get failed\n"); + return 1; + } + if (cqe->user_data != (unsigned long) &sqe) { + printf("second not cancel\n"); + return 1; + } + + return 0; +} -- cgit