From 8025517dfa599be4bc795e4af7c9012d10b81bc5 Mon Sep 17 00:00:00 2001 From: Jens Axboe Date: Sat, 12 Jan 2019 22:14:54 -0700 Subject: [PATCH] t/io_uring: add IORING_OP_NOP support Doesn't do anything on the kernel side, just a round trip through the SQ and CQ ring. Signed-off-by: Jens Axboe --- os/io_uring.h | 1 + t/io_uring.c | 28 +++++++++++++++++++++------- 2 files changed, 22 insertions(+), 7 deletions(-) diff --git a/os/io_uring.h b/os/io_uring.h index 74370aed..0f4460d6 100644 --- a/os/io_uring.h +++ b/os/io_uring.h @@ -47,6 +47,7 @@ struct io_uring_sqe { #define IORING_SETUP_SQPOLL (1 << 1) /* SQ poll thread */ #define IORING_SETUP_SQ_AFF (1 << 2) /* sq_thread_cpu is valid */ +#define IORING_OP_NOP 0 #define IORING_OP_READV 1 #define IORING_OP_WRITEV 2 #define IORING_OP_FSYNC 3 diff --git a/t/io_uring.c b/t/io_uring.c index d4160c3d..8d3f3a9b 100644 --- a/t/io_uring.c +++ b/t/io_uring.c @@ -93,6 +93,7 @@ static int fixedbufs = 1; /* use fixed user buffers */ static int buffered = 0; /* use buffered IO, not O_DIRECT */ static int sq_thread_poll = 0; /* use kernel submission/poller thread */ static int sq_thread_cpu = -1; /* pin above thread to this CPU */ +static int do_nop = 0; /* no-op SQ ring commands */ static int io_uring_register_buffers(struct submitter *s) { @@ -101,6 +102,9 @@ static int io_uring_register_buffers(struct submitter *s) .nr_iovecs = DEPTH }; + if (do_nop) + return 0; + return syscall(__NR_sys_io_uring_register, s->ring_fd, IORING_REGISTER_BUFFERS, ®); } @@ -110,6 +114,9 @@ static int io_uring_register_files(struct submitter *s) struct io_uring_register_files reg; int i; + if (do_nop) + return 0; + s->fds = calloc(s->nr_files, sizeof(__s32)); for (i = 0; i < s->nr_files; i++) { s->fds[i] = s->files[i].real_fd; @@ -151,6 +158,11 @@ static void init_io(struct submitter *s, unsigned index) struct file *f; long r; + if (do_nop) { + sqe->opcode = IORING_OP_NOP; + return; + } + if (s->nr_files == 1) { f = &s->files[0]; } else { @@ -248,11 +260,13 @@ static int reap_events(struct submitter *s) if (head == *ring->tail) break; cqe = &ring->cqes[head & cq_ring_mask]; - f = (struct file *) cqe->user_data; - f->pending_ios--; - if (cqe->res != BS) { - printf("io: unexpected ret=%d\n", cqe->res); - return -1; + if (!do_nop) { + f = (struct file *) cqe->user_data; + f->pending_ios--; + if (cqe->res != BS) { + printf("io: unexpected ret=%d\n", cqe->res); + return -1; + } } if (cqe->flags & IOCQE_FLAG_CACHEHIT) s->cachehit++; @@ -454,7 +468,7 @@ int main(int argc, char *argv[]) struct rlimit rlim; void *ret; - if (argc < 2) { + if (!do_nop && argc < 2) { printf("%s: filename\n", argv[0]); return 1; } @@ -464,7 +478,7 @@ int main(int argc, char *argv[]) flags |= O_DIRECT; i = 1; - while (i < argc) { + while (!do_nop && i < argc) { struct file *f = &s->files[s->nr_files]; fd = open(argv[i], flags); -- 2.25.1