#include "smalloc.h"
#include "filehash.h"
-static char fio_version_string[] = "fio 1.21-rc3";
+static char fio_version_string[] = "fio 1.23";
#define FIO_RANDSEED (0xb1899bedUL)
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;
{
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);
}
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 "
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;
name = malloc(280);
memset(name, 0, 280);
+ alloc_opts = 8;
+ opts = malloc(sizeof(char *) * alloc_opts);
+ num_opts = 0;
+
stonewall = stonewall_flag;
do {
/*
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;
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;
{ .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)
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;
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;
}