Whitespace standardization
[fio.git] / engines / io_uring.c
index ef56345b15be3ed3252acbb1243e97fc28a5fb8f..329f2f071dcd5c1c61d89de2c298d7c651c33f21 100644 (file)
@@ -75,6 +75,18 @@ struct ioring_options {
        unsigned int sqpoll_thread;
        unsigned int sqpoll_set;
        unsigned int sqpoll_cpu;
+       unsigned int nonvectored;
+       unsigned int uncached;
+};
+
+static const int ddir_to_op[2][2] = {
+       { IORING_OP_READV, IORING_OP_READ },
+       { IORING_OP_WRITEV, IORING_OP_WRITE }
+};
+
+static const int fixed_ddir_to_op[2] = {
+       IORING_OP_READ_FIXED,
+       IORING_OP_WRITE_FIXED
 };
 
 static int fio_ioring_sqpoll_cb(void *data, unsigned long long *val)
@@ -132,6 +144,24 @@ static struct fio_option options[] = {
                .category = FIO_OPT_C_ENGINE,
                .group  = FIO_OPT_G_IOURING,
        },
+       {
+               .name   = "nonvectored",
+               .lname  = "Non-vectored",
+               .type   = FIO_OPT_INT,
+               .off1   = offsetof(struct ioring_options, nonvectored),
+               .help   = "Use non-vectored read/write commands",
+               .category = FIO_OPT_C_ENGINE,
+               .group  = FIO_OPT_G_IOURING,
+       },
+       {
+               .name   = "uncached",
+               .lname  = "Uncached",
+               .type   = FIO_OPT_INT,
+               .off1   = offsetof(struct ioring_options, uncached),
+               .help   = "Use RWF_UNCACHED for buffered read/writes",
+               .category = FIO_OPT_C_ENGINE,
+               .group  = FIO_OPT_G_IOURING,
+       },
        {
                .name   = NULL,
        },
@@ -165,21 +195,27 @@ static int fio_ioring_prep(struct thread_data *td, struct io_u *io_u)
 
        if (io_u->ddir == DDIR_READ || io_u->ddir == DDIR_WRITE) {
                if (o->fixedbufs) {
-                       if (io_u->ddir == DDIR_READ)
-                               sqe->opcode = IORING_OP_READ_FIXED;
-                       else
-                               sqe->opcode = IORING_OP_WRITE_FIXED;
+                       sqe->opcode = fixed_ddir_to_op[io_u->ddir];
                        sqe->addr = (unsigned long) io_u->xfer_buf;
                        sqe->len = io_u->xfer_buflen;
                        sqe->buf_index = io_u->index;
                } else {
-                       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->opcode = ddir_to_op[io_u->ddir][!!o->nonvectored];
+                       if (o->nonvectored) {
+                               sqe->addr = (unsigned long)
+                                               ld->iovecs[io_u->index].iov_base;
+                               sqe->len = ld->iovecs[io_u->index].iov_len;
+                       } else {
+                               sqe->addr = (unsigned long) &ld->iovecs[io_u->index];
+                               sqe->len = 1;
+                       }
                }
+               if (!td->o.odirect && o->uncached)
+                       sqe->rw_flags = RWF_UNCACHED;
+               if (fio_option_is_set(&td->o, ioprio_class))
+                       sqe->ioprio = td->o.ioprio_class << 13;
+               if (fio_option_is_set(&td->o, ioprio))
+                       sqe->ioprio |= td->o.ioprio;
                sqe->off = io_u->offset;
        } else if (ddir_sync(io_u->ddir)) {
                if (io_u->ddir == DDIR_SYNC_FILE_RANGE) {