Excessive passing around of struct fio_file
[fio.git] / init.c
diff --git a/init.c b/init.c
index 557382b6a1b8c2e25c4ff42aaf1ab85a1c0ff0fa..c6837c9f91d3bea0db10d7a8a4a106bcf9268deb 100644 (file)
--- a/init.c
+++ b/init.c
@@ -85,11 +85,25 @@ static struct fio_option options[] = {
                .help   = "IO engine to use",
                .def    = "sync",
                .posval = {
-                         { .ival = "sync", }, { .ival = "libaio", },
-                         { .ival = "posixaio", }, { .ival = "mmap", },
-                         { .ival = "splice", }, { .ival = "sg", },
+                         { .ival = "sync", },
+#ifdef FIO_HAVE_LIBAIO
+                         { .ival = "libaio", },
+#endif
+#ifdef FIO_HAVE_POSIXAIO
+                         { .ival = "posixaio", },
+#endif
+                         { .ival = "mmap", },
+#ifdef FIO_HAVE_SPLICE
+                         { .ival = "splice", },
+#endif
+#ifdef FIO_HAVE_SGIO
+                         { .ival = "sg", },
+#endif
                          { .ival = "null", }, { .ival = "net", },
+#ifdef FIO_HAVE_SYSLET
                          { .ival = "syslet-rw", },
+#endif
+                         { .ival = "external", },
                          },
        },
        {
@@ -99,6 +113,12 @@ static struct fio_option options[] = {
                .help   = "Amount of IO buffers to keep in flight",
                .def    = "1",
        },
+       {
+               .name   = "iodepth_batch",
+               .type   = FIO_OPT_INT,
+               .off1   = td_var_offset(iodepth_batch),
+               .help   = "Number of IO to submit in one go",
+       },
        {
                .name   = "iodepth_low",
                .type   = FIO_OPT_INT,
@@ -571,7 +591,7 @@ static struct option long_options[FIO_JOB_OPTS + FIO_CMD_OPTS] = {
 
 static int def_timeout = 0;
 
-static char fio_version_string[] = "fio 1.11";
+static char fio_version_string[] = "fio 1.12";
 
 static char **ini_file;
 static int max_jobs = MAX_JOBS;
@@ -588,6 +608,16 @@ FILE *f_err = NULL;
 static int write_lat_log = 0;
 int write_bw_log = 0;
 
+FILE *get_f_out()
+{
+       return f_out;
+}
+
+FILE *get_f_err()
+{
+       return f_err;
+}
+
 /*
  * Return a free job structure.
  */
@@ -689,8 +719,23 @@ static void fixup_options(struct thread_data *td)
        /*
         * The low water mark cannot be bigger than the iodepth
         */
-       if (td->iodepth_low > td->iodepth || !td->iodepth_low)
-               td->iodepth_low = td->iodepth;
+       if (td->iodepth_low > td->iodepth || !td->iodepth_low) {
+               /*
+                * syslet work around - if the workload is sequential,
+                * we want to let the queue drain all the way down to
+                * avoid seeking between async threads
+                */
+               if (!strcmp(td->io_ops->name, "syslet-rw") && !td_random(td))
+                       td->iodepth_low = 1;
+               else
+                       td->iodepth_low = td->iodepth;
+       }
+
+       /*
+        * If batch number isn't set, default to the same as iodepth
+        */
+       if (td->iodepth_batch > td->iodepth || !td->iodepth_batch)
+               td->iodepth_batch = td->iodepth;
 }
 
 /*
@@ -983,16 +1028,29 @@ static int str_mem_cb(void *data, const char *mem)
        return 0;
 }
 
+/* External engines are specified by "external:name.o") */
+static const char *get_engine_name(const char *str)
+{
+       char *p = strstr(str, ":");
+
+       if (!p)
+               return str;
+
+       p++;
+       strip_blank_front(&p);
+       strip_blank_end(p);
+       return p;
+}
+
 static int str_ioengine_cb(void *data, const char *str)
 {
        struct thread_data *td = data;
+       const char *name = get_engine_name(str);
 
-       td->io_ops = load_ioengine(td, str);
+       td->io_ops = load_ioengine(td, name);
        if (td->io_ops)
                return 0;
 
-       log_err("fio: ioengine= libaio, posixaio, sync, syslet-rw, mmap, sgio, splice, cpu, null\n");
-       log_err("fio: or specify path to dynamic ioengine module\n");
        return 1;
 }
 
@@ -1217,10 +1275,8 @@ static int parse_cmd_line(int argc, char *argv[])
                        }
 
                        ret = parse_cmd_option(opt, val, options, td);
-                       if (ret) {
+                       if (ret)
                                dont_add_job = 1;
-                               log_err("fio: job dropped\n");
-                       }
                        break;
                }
                default: