t/io_uring: show IOPS in increments of 1000 IOPS if necessary
[fio.git] / engines / sg.c
index c46b9abaec871e5b97e599f276620bb9e001eaaa..1c0193840df3cacbf276be48542f5cd5af7b80ad 100644 (file)
 
 #ifdef FIO_HAVE_SGIO
 
+#ifndef SGV4_FLAG_HIPRI
+#define SGV4_FLAG_HIPRI 0x800
+#endif
+
 enum {
        FIO_SG_WRITE            = 1,
        FIO_SG_WRITE_VERIFY     = 2,
@@ -68,12 +72,22 @@ enum {
 
 struct sg_options {
        void *pad;
+       unsigned int hipri;
        unsigned int readfua;
        unsigned int writefua;
        unsigned int write_mode;
 };
 
 static struct fio_option options[] = {
+        {
+                .name   = "hipri",
+                .lname  = "High Priority",
+                .type   = FIO_OPT_STR_SET,
+                .off1   = offsetof(struct sg_options, hipri),
+                .help   = "Use polled IO completions",
+                .category = FIO_OPT_C_ENGINE,
+                .group  = FIO_OPT_G_SG,
+        },
        {
                .name   = "readfua",
                .lname  = "sg engine read fua flag support",
@@ -457,10 +471,9 @@ static enum fio_q_status fio_sgio_rw_doio(struct thread_data *td,
                        if (__io_u == io_u)
                                break;
 
-                       if (io_u_sync_complete(td, __io_u)) {
-                               ret = -1;
+                       if (io_u_sync_complete(td, __io_u))
                                break;
-                       }
+
                } while (1);
 
                return FIO_Q_COMPLETED;
@@ -527,6 +540,8 @@ static int fio_sgio_prep(struct thread_data *td, struct io_u *io_u)
                else
                        hdr->cmdp[0] = 0x88; // read(16)
 
+               if (o->hipri)
+                       hdr->flags |= SGV4_FLAG_HIPRI;
                if (o->readfua)
                        hdr->cmdp[1] |= 0x08;
 
@@ -542,6 +557,8 @@ static int fio_sgio_prep(struct thread_data *td, struct io_u *io_u)
                                hdr->cmdp[0] = 0x2a; // write(10)
                        else
                                hdr->cmdp[0] = 0x8a; // write(16)
+                       if (o->hipri)
+                               hdr->flags |= SGV4_FLAG_HIPRI;
                        if (o->writefua)
                                hdr->cmdp[1] |= 0x08;
                        break;
@@ -865,6 +882,7 @@ static int fio_sgio_init(struct thread_data *td)
 {
        struct sgio_data *sd;
        struct sgio_trim *st;
+       struct sg_io_hdr *h3p;
        int i;
 
        sd = calloc(1, sizeof(*sd));
@@ -880,12 +898,13 @@ static int fio_sgio_init(struct thread_data *td)
 #ifdef FIO_SGIO_DEBUG
        sd->trim_queue_map = calloc(td->o.iodepth, sizeof(int));
 #endif
-       for (i = 0; i < td->o.iodepth; i++) {
+       for (i = 0, h3p = sd->sgbuf; i < td->o.iodepth; i++, ++h3p) {
                sd->trim_queues[i] = calloc(1, sizeof(struct sgio_trim));
                st = sd->trim_queues[i];
                st->unmap_param = calloc(td->o.iodepth + 1, sizeof(char[16]));
                st->unmap_range_count = 0;
                st->trim_io_us = calloc(td->o.iodepth, sizeof(struct io_u *));
+               h3p->interface_id = 'S';
        }
 
        td->io_ops_data = sd;
@@ -962,7 +981,7 @@ static int fio_sgio_open(struct thread_data *td, struct fio_file *f)
 
        if (sd && !sd->type_checked && fio_sgio_type_check(td, f)) {
                ret = generic_close_file(td, f);
-               return 1;
+               return ret;
        }
 
        return 0;
@@ -1181,8 +1200,8 @@ static char *fio_sgio_errdetails(struct io_u *io_u)
        }
 
        if (!(hdr->info & SG_INFO_CHECK) && !strlen(msg))
-               strncpy(msg, "SG Driver did not report a Host, Driver or Device check",
-                       MAXERRDETAIL - 1);
+               snprintf(msg, MAXERRDETAIL, "%s",
+                        "SG Driver did not report a Host, Driver or Device check");
 
        return msg;
 }