man: update description of normal output latencies
[fio.git] / init.c
diff --git a/init.c b/init.c
index 9b2b63d6befc94866e8336a8a4c69bdc7e5acf06..164e411c6c8d4a9f576434422dce837edac3a988 100644 (file)
--- a/init.c
+++ b/init.c
@@ -698,6 +698,23 @@ static int fixup_options(struct thread_data *td)
        if (o->iodepth_batch_complete_min > o->iodepth_batch_complete_max)
                o->iodepth_batch_complete_max = o->iodepth_batch_complete_min;
 
+       /*
+        * There's no need to check for in-flight overlapping IOs if the job
+        * isn't changing data or the maximum iodepth is guaranteed to be 1
+        */
+       if (o->serialize_overlap && !(td->flags & TD_F_READ_IOLOG) &&
+           (!(td_write(td) || td_trim(td)) || o->iodepth == 1))
+               o->serialize_overlap = 0;
+       /*
+        * Currently can't check for overlaps in offload mode
+        */
+       if (o->serialize_overlap && o->io_submit_mode == IO_MODE_OFFLOAD) {
+               log_err("fio: checking for in-flight overlaps when the "
+                       "io_submit_mode is offload is not supported\n");
+               o->serialize_overlap = 0;
+               ret = warnings_fatal;
+       }
+
        if (o->nr_files > td->files_index)
                o->nr_files = td->files_index;
 
@@ -781,6 +798,11 @@ static int fixup_options(struct thread_data *td)
                        o->unit_base = 8;
        }
 
+#ifndef FIO_HAVE_ANY_FALLOCATE
+       /* Platform doesn't support any fallocate so force it to none */
+       o->fallocate_mode = FIO_FALLOCATE_NONE;
+#endif
+
 #ifndef CONFIG_FDATASYNC
        if (o->fdatasync_blocks) {
                log_info("fio: this platform does not support fdatasync()"
@@ -1000,16 +1022,24 @@ int ioengine_load(struct thread_data *td)
 {
        const char *engine;
 
-       /*
-        * Engine has already been loaded.
-        */
-       if (td->io_ops)
-               return 0;
        if (!td->o.ioengine) {
                log_err("fio: internal fault, no IO engine specified\n");
                return 1;
        }
 
+       if (td->io_ops) {
+               /* An engine is loaded, but the requested ioengine
+                * may have changed.
+                */
+               if (!strcmp(td->io_ops->name, td->o.ioengine)) {
+                       /* The right engine is already loaded */
+                       return 0;
+               }
+
+               /* Unload the old engine. */
+               free_ioengine(td);
+       }
+
        engine = get_engine_name(td->o.ioengine);
        td->io_ops = load_ioengine(td, engine);
        if (!td->io_ops) {
@@ -2530,7 +2560,6 @@ int parse_cmd_line(int argc, char *argv[], int client_type)
                        }
 
                        if (!ret && !strcmp(opt, "ioengine")) {
-                               free_ioengine(td);
                                if (ioengine_load(td)) {
                                        put_job(td);
                                        td = NULL;