X-Git-Url: https://git.kernel.dk/?a=blobdiff_plain;ds=sidebyside;f=t%2Fio_uring.c;h=7c75c887eb4f511616dfdba9fa48068e23832dd7;hb=154a95828fe08b01774b59602544de394b2d3aa6;hp=78b92685316cb7bc751cd3b49295be388f8a5807;hpb=e4db5bd917962ce3c4ccf2d88c908059e4ab15cb;p=fio.git diff --git a/t/io_uring.c b/t/io_uring.c index 78b92685..7c75c887 100644 --- a/t/io_uring.c +++ b/t/io_uring.c @@ -24,8 +24,6 @@ #include "../lib/types.h" #include "../os/linux/io_uring.h" -#define barrier() __asm__ __volatile__("": : :"memory") - #define min(a, b) ((a < b) ? (a) : (b)) struct io_sq_ring { @@ -98,21 +96,15 @@ static int do_nop = 0; /* no-op SQ ring commands */ static int io_uring_register_buffers(struct submitter *s) { - struct io_uring_register_buffers reg = { - .iovecs = s->iovecs, - .nr_iovecs = DEPTH - }; - if (do_nop) return 0; return syscall(__NR_sys_io_uring_register, s->ring_fd, - IORING_REGISTER_BUFFERS, ®); + IORING_REGISTER_BUFFERS, s->iovecs, DEPTH); } static int io_uring_register_files(struct submitter *s) { - struct io_uring_register_files reg; int i; if (do_nop) @@ -123,11 +115,9 @@ static int io_uring_register_files(struct submitter *s) s->fds[i] = s->files[i].real_fd; s->files[i].fixed_fd = i; } - reg.fds = s->fds; - reg.nr_fds = s->nr_files; return syscall(__NR_sys_io_uring_register, s->ring_fd, - IORING_REGISTER_FILES, ®); + IORING_REGISTER_FILES, s->fds, s->nr_files); } static int io_uring_setup(unsigned entries, struct io_uring_params *p) @@ -139,7 +129,7 @@ static int io_uring_enter(struct submitter *s, unsigned int to_submit, unsigned int min_complete, unsigned int flags) { return syscall(__NR_sys_io_uring_enter, s->ring_fd, to_submit, - min_complete, flags); + min_complete, flags, NULL, 0); } static int gettid(void) @@ -189,12 +179,12 @@ static void init_io(struct submitter *s, unsigned index) } if (fixedbufs) { sqe->opcode = IORING_OP_READ_FIXED; - sqe->addr = s->iovecs[index].iov_base; + sqe->addr = (unsigned long) s->iovecs[index].iov_base; sqe->len = BS; sqe->buf_index = index; } else { sqe->opcode = IORING_OP_READV; - sqe->addr = &s->iovecs[index]; + sqe->addr = (unsigned long) &s->iovecs[index]; sqe->len = 1; sqe->buf_index = 0; } @@ -211,7 +201,7 @@ static int prep_more_ios(struct submitter *s, int max_ios) next_tail = tail = *ring->tail; do { next_tail++; - barrier(); + read_barrier(); if (next_tail == *ring->head) break; @@ -224,9 +214,9 @@ static int prep_more_ios(struct submitter *s, int max_ios) if (*ring->tail != tail) { /* order tail store with writes to sqes above */ - barrier(); + write_barrier(); *ring->tail = tail; - barrier(); + write_barrier(); } return prepped; } @@ -263,7 +253,7 @@ static int reap_events(struct submitter *s) do { struct file *f; - barrier(); + read_barrier(); if (head == *ring->tail) break; cqe = &ring->cqes[head & cq_ring_mask]; @@ -272,6 +262,8 @@ static int reap_events(struct submitter *s) f->pending_ios--; if (cqe->res != BS) { printf("io: unexpected ret=%d\n", cqe->res); + if (polled && cqe->res == -EOPNOTSUPP) + printf("Your filesystem doesn't support poll\n"); return -1; } } @@ -285,7 +277,7 @@ static int reap_events(struct submitter *s) s->inflight -= reaped; *ring->head = head; - barrier(); + write_barrier(); return reaped; } @@ -325,6 +317,8 @@ submit: if (to_wait) flags = IORING_ENTER_GETEVENTS; + if ((*ring->flags & IORING_SQ_NEED_WAKEUP)) + flags |= IORING_ENTER_SQ_WAKEUP; ret = io_uring_enter(s, to_submit, to_wait, flags); s->calls++; } @@ -338,9 +332,10 @@ submit: do { int r; r = reap_events(s); - if (r == -1) + if (r == -1) { + s->finish = 1; break; - else if (r > 0) + } else if (r > 0) this_reap += r; } while (sq_thread_poll && this_reap < to_wait); s->reaps += this_reap; @@ -406,7 +401,7 @@ static int setup_ring(struct submitter *s) memset(&p, 0, sizeof(p)); - if (polled) + if (polled && !do_nop) p.flags |= IORING_SETUP_IOPOLL; if (sq_thread_poll) { p.flags |= IORING_SETUP_SQPOLL; @@ -475,6 +470,7 @@ static void file_depths(char *buf) char *p; int i; + buf[0] = '\0'; p = buf; for (i = 0; i < s->nr_files; i++) { struct file *f = &s->files[i];