Fio 1.24
[fio.git] / init.c
diff --git a/init.c b/init.c
index 56a1d331625ae6804bb92540a36551bd4a855d34..95c282acaae8bff48b30eedbd9ef2ffde5427ead 100644 (file)
--- a/init.c
+++ b/init.c
@@ -19,7 +19,7 @@
 #include "smalloc.h"
 #include "filehash.h"
 
-static char fio_version_string[] = "fio 1.21-rc3";
+static char fio_version_string[] = "fio 1.24";
 
 #define FIO_RANDSEED           (0xb1899bedUL)
 
@@ -27,7 +27,7 @@ static char **ini_file;
 static int max_jobs = MAX_JOBS;
 static int dump_cmdline;
 
-struct thread_data def_thread;
+static struct thread_data def_thread;
 struct thread_data *threads = NULL;
 
 int exitall_on_terminate = 0;
@@ -214,6 +214,23 @@ static int fixup_options(struct thread_data *td)
 {
        struct thread_options *o = &td->o;
 
+#ifndef FIO_HAVE_PSHARED_MUTEX
+       if (!td->o.use_thread) {
+               log_info("fio: this platform does not support process shared"
+                        " mutexes, forcing use of threads. Use the 'thread'"
+                        " option to get rid of this warning.\n");
+               td->o.use_thread = 1;
+       }
+#endif
+
+#ifndef FIO_HAVE_CPU_AFFINITY
+       if (td->o.gtod_cpu) {
+               log_err("fio: platform must support CPU affinity for"
+                       "gettimeofday() offloading\n");
+               return 1;
+       }
+#endif
+
        if (read_only && td_write(td)) {
                log_err("fio: job <%s> has write bit set, but fio is in"
                        " read-only mode\n", td->o.name);
@@ -307,7 +324,7 @@ static int fixup_options(struct thread_data *td)
        }
 
        if (o->fill_device && !o->size)
-               o->size = ULONG_LONG_MAX;
+               o->size = -1ULL;
 
        if (td_rw(td) && td->o.verify != VERIFY_NONE)
                log_info("fio: mixed read/write workload with verify. May not "
@@ -614,6 +631,8 @@ static int parse_jobs_ini(char *file, int stonewall_flag)
        int first_sect = 1;
        int skip_fgets = 0;
        int inside_skip = 0;
+       char **opts;
+       int i, alloc_opts, num_opts;
 
        if (!strcmp(file, "-"))
                f = stdin;
@@ -633,6 +652,10 @@ static int parse_jobs_ini(char *file, int stonewall_flag)
        name = malloc(280);
        memset(name, 0, 280);
 
+       alloc_opts = 8;
+       opts = malloc(sizeof(char *) * alloc_opts);
+       num_opts = 0;
+
        stonewall = stonewall_flag;
        do {
                /*
@@ -691,6 +714,9 @@ static int parse_jobs_ini(char *file, int stonewall_flag)
                        stonewall = 0;
                }
 
+               num_opts = 0;
+               memset(opts, 0, alloc_opts * sizeof(char *));
+
                while ((p = fgets(string, 4096, f)) != NULL) {
                        if (is_empty_or_comment(p))
                                continue;
@@ -708,29 +734,42 @@ static int parse_jobs_ini(char *file, int stonewall_flag)
 
                        strip_blank_end(p);
 
-                       /*
-                        * Don't break here, continue parsing options so we
-                        * dump all the bad ones. Makes trial/error fixups
-                        * easier on the user.
-                        */
-                       ret |= fio_option_parse(td, p);
-                       if (!ret && dump_cmdline)
-                               log_info("--%s ", p);
+                       if (num_opts == alloc_opts) {
+                               alloc_opts <<= 1;
+                               opts = realloc(opts,
+                                               alloc_opts * sizeof(char *));
+                       }
+
+                       opts[num_opts] = strdup(p);
+                       num_opts++;
                }
 
-               if (!ret)
+               ret = fio_options_parse(td, opts, num_opts);
+               if (!ret) {
+                       if (dump_cmdline)
+                               for (i = 0; i < num_opts; i++)
+                                       log_info("--%s ", opts[i]);
+
                        ret = add_job(td, name, 0);
-               else {
+               else {
                        log_err("fio: job %s dropped\n", name);
                        put_job(td);
                }
+
+               for (i = 0; i < num_opts; i++)
+                       free(opts[i]);
+               num_opts = 0;
        } while (!ret);
 
        if (dump_cmdline)
                log_info("\n");
 
+       for (i = 0; i < num_opts; i++)
+               free(opts[i]);
+
        free(string);
        free(name);
+       free(opts);
        if (f != stdin)
                fclose(f);
        return ret;
@@ -856,7 +895,8 @@ struct debug_level debug_levels[] = {
        { .name = "parse",      .shift = FD_PARSE },
        { .name = "diskutil",   .shift = FD_DISKUTIL },
        { .name = "job",        .shift = FD_JOB },
-       { },
+       { .name = "mutex",      .shift = FD_MUTEX },
+       { .name = NULL, },
 };
 
 static int set_debug(const char *string)
@@ -916,7 +956,7 @@ static int set_debug(const char *string)
        return 0;
 }
 #else
-static void set_debug(const char *string)
+static int set_debug(const char *string)
 {
        log_err("fio: debug tracing not included in build\n");
        return 1;
@@ -1082,5 +1122,11 @@ int parse_options(int argc, char *argv[])
                return 1;
        }
 
+       if (def_thread.o.gtod_offload) {
+               fio_gtod_init();
+               fio_gtod_offload = 1;
+               fio_gtod_cpu = def_thread.o.gtod_cpu;
+       }
+
        return 0;
 }