X-Git-Url: https://git.kernel.dk/?p=fio.git;a=blobdiff_plain;f=t%2Fio_uring.c;h=8d3f3a9ba198086dd1145d48ef01185c9849054f;hp=0c8058ba089ed997274005edb871e00e4324be90;hb=8025517dfa599be4bc795e4af7c9012d10b81bc5;hpb=48e698fa59d6258f989d56890851d7658566aefc diff --git a/t/io_uring.c b/t/io_uring.c index 0c8058ba..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++; @@ -300,8 +314,11 @@ submit: * poll, or if IORING_SQ_NEED_WAKEUP is set. */ if (!sq_thread_poll || (*ring->flags & IORING_SQ_NEED_WAKEUP)) { - ret = io_uring_enter(s, to_submit, to_wait, - IORING_ENTER_GETEVENTS); + unsigned flags = 0; + + if (to_wait) + flags = IORING_ENTER_GETEVENTS; + ret = io_uring_enter(s, to_submit, to_wait, flags); s->calls++; } @@ -386,8 +403,10 @@ static int setup_ring(struct submitter *s) p.flags |= IORING_SETUP_IOPOLL; if (sq_thread_poll) { p.flags |= IORING_SETUP_SQPOLL; - if (sq_thread_cpu != -1) + if (sq_thread_cpu != -1) { p.flags |= IORING_SETUP_SQ_AFF; + p.sq_thread_cpu = sq_thread_cpu; + } } fd = io_uring_setup(DEPTH, &p); @@ -449,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; } @@ -459,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);