X-Git-Url: https://git.kernel.dk/?a=blobdiff_plain;f=engines%2Fio_uring.c;h=9bcfec1726b05402bbc0875b2a53bf3edfc13e52;hb=576d4cf9b040e49ca467cd94db0567d392510e9d;hp=7591190a8cb4fee649ab6d67732612040e0aa644;hpb=3d7d00a35f8230451b8113804cfdc713cfdc7664;p=fio.git diff --git a/engines/io_uring.c b/engines/io_uring.c index 7591190a..9bcfec17 100644 --- a/engines/io_uring.c +++ b/engines/io_uring.c @@ -21,7 +21,7 @@ #ifdef ARCH_HAVE_IOURING #include "../lib/types.h" -#include "../os/io_uring.h" +#include "../os/linux/io_uring.h" struct io_sq_ring { unsigned *head; @@ -48,7 +48,6 @@ struct ioring_mmap { struct ioring_data { int ring_fd; - struct io_u **io_us; struct io_u **io_u_index; struct io_sq_ring sq_ring; @@ -63,9 +62,6 @@ struct ioring_data { int cq_ring_off; unsigned iodepth; - uint64_t cachehit; - uint64_t cachemiss; - struct ioring_mmap mmap[3]; }; @@ -133,7 +129,7 @@ static int io_uring_enter(struct ioring_data *ld, unsigned int to_submit, unsigned int min_complete, unsigned int flags) { return syscall(__NR_sys_io_uring_enter, ld->ring_fd, to_submit, - min_complete, flags); + min_complete, flags, NULL, 0); } static int fio_ioring_prep(struct thread_data *td, struct io_u *io_u) @@ -150,25 +146,31 @@ static int fio_ioring_prep(struct thread_data *td, struct io_u *io_u) sqe->buf_index = 0; if (io_u->ddir == DDIR_READ || io_u->ddir == DDIR_WRITE) { - if (io_u->ddir == DDIR_READ) - sqe->opcode = IORING_OP_READV; - else - sqe->opcode = IORING_OP_WRITEV; - if (o->fixedbufs) { - sqe->flags |= IOSQE_FIXED_BUFFER; - sqe->addr = io_u->xfer_buf; + if (io_u->ddir == DDIR_READ) + sqe->opcode = IORING_OP_READ_FIXED; + else + sqe->opcode = IORING_OP_WRITE_FIXED; + sqe->addr = (unsigned long) io_u->xfer_buf; sqe->len = io_u->xfer_buflen; sqe->buf_index = io_u->index; } else { - sqe->addr = &ld->iovecs[io_u->index]; + if (io_u->ddir == DDIR_READ) + sqe->opcode = IORING_OP_READV; + else + sqe->opcode = IORING_OP_WRITEV; + sqe->addr = (unsigned long) &ld->iovecs[io_u->index]; sqe->len = 1; } sqe->off = io_u->offset; - } else if (ddir_sync(io_u->ddir)) + } else if (ddir_sync(io_u->ddir)) { + sqe->fsync_flags = 0; + if (io_u->ddir == DDIR_DATASYNC) + sqe->fsync_flags |= IORING_FSYNC_DATASYNC; sqe->opcode = IORING_OP_FSYNC; + } - sqe->data = (unsigned long) io_u; + sqe->user_data = (unsigned long) io_u; return 0; } @@ -182,7 +184,7 @@ static struct io_u *fio_ioring_event(struct thread_data *td, int event) index = (event + ld->cq_ring_off) & ld->cq_ring_mask; cqe = &ld->cq_ring.cqes[index]; - io_u = (struct io_u *) cqe->data; + io_u = (struct io_u *) (uintptr_t) cqe->user_data; if (cqe->res != io_u->xfer_buflen) { if (cqe->res > io_u->xfer_buflen) @@ -192,13 +194,6 @@ static struct io_u *fio_ioring_event(struct thread_data *td, int event) } else io_u->error = 0; - if (io_u->ddir == DDIR_READ) { - if (cqe->flags & IOCQE_FLAG_CACHEHIT) - ld->cachehit++; - else - ld->cachemiss++; - } - return io_u; } @@ -238,6 +233,8 @@ static int fio_ioring_getevents(struct thread_data *td, unsigned int min, r = fio_ioring_cqring_reap(td, events, max); if (r) { events += r; + if (actual_min != 0) + actual_min -= r; continue; } @@ -284,6 +281,8 @@ static enum fio_q_status fio_ioring_queue(struct thread_data *td, if (next_tail == *ring->head) return FIO_Q_BUSY; + /* ensure sqe stores are ordered with tail update */ + write_barrier(); ring->array[tail & ld->sq_ring_mask] = io_u->index; *ring->tail = next_tail; write_barrier(); @@ -333,7 +332,8 @@ static int fio_ioring_commit(struct thread_data *td) read_barrier(); if (*ring->flags & IORING_SQ_NEED_WAKEUP) - io_uring_enter(ld, ld->queued, 0, 0); + io_uring_enter(ld, ld->queued, 0, + IORING_ENTER_SQ_WAKEUP); ld->queued = 0; return 0; } @@ -383,14 +383,10 @@ static void fio_ioring_cleanup(struct thread_data *td) struct ioring_data *ld = td->io_ops_data; if (ld) { - td->ts.cachehit += ld->cachehit; - td->ts.cachemiss += ld->cachemiss; - if (!(td->flags & TD_F_CHILD)) fio_ioring_unmap(ld); free(ld->io_u_index); - free(ld->io_us); free(ld->iovecs); free(ld); } @@ -456,15 +452,6 @@ static int fio_ioring_queue_init(struct thread_data *td) } } - if (o->fixedbufs) { - struct rlimit rlim = { - .rlim_cur = RLIM_INFINITY, - .rlim_max = RLIM_INFINITY, - }; - - setrlimit(RLIMIT_MEMLOCK, &rlim); - } - ret = syscall(__NR_sys_io_uring_setup, depth, &p); if (ret < 0) return ret; @@ -472,13 +459,16 @@ static int fio_ioring_queue_init(struct thread_data *td) ld->ring_fd = ret; if (o->fixedbufs) { - struct io_uring_register_buffers reg = { - .iovecs = ld->iovecs, - .nr_iovecs = depth + struct rlimit rlim = { + .rlim_cur = RLIM_INFINITY, + .rlim_max = RLIM_INFINITY, }; + if (setrlimit(RLIMIT_MEMLOCK, &rlim) < 0) + return -1; + ret = syscall(__NR_sys_io_uring_register, ld->ring_fd, - IORING_REGISTER_BUFFERS, ®); + IORING_REGISTER_BUFFERS, ld->iovecs, depth); if (ret < 0) return ret; } @@ -526,7 +516,6 @@ static int fio_ioring_init(struct thread_data *td) /* io_u index */ ld->io_u_index = calloc(td->o.iodepth, sizeof(struct io_u *)); - ld->io_us = calloc(td->o.iodepth, sizeof(struct io_u *)); ld->iovecs = calloc(td->o.iodepth, sizeof(struct iovec)); td->io_ops_data = ld; @@ -544,6 +533,7 @@ static int fio_ioring_io_u_init(struct thread_data *td, struct io_u *io_u) static struct ioengine_ops ioengine = { .name = "io_uring", .version = FIO_IOOPS_VERSION, + .flags = FIO_ASYNCIO_SYNC_TRIM, .init = fio_ioring_init, .post_init = fio_ioring_post_init, .io_u_init = fio_ioring_io_u_init,