If filename not given, use jobname
[fio.git] / init.c
diff --git a/init.c b/init.c
index a4f641a293fb0bcce1e9793f5ff20663bc7c0860..62080f74949f09a9abbdb1ce2fa40ee2b9a7731d 100644 (file)
--- a/init.c
+++ b/init.c
@@ -22,7 +22,6 @@
 
 #define td_var_offset(var)     ((size_t) &((struct thread_data *)0)->var)
 
-static int str_ioengine_cb(void *, const char *);
 static int str_mem_cb(void *, const char *);
 static int str_lockmem_cb(void *, unsigned long *);
 #ifdef FIO_HAVE_IOPRIO
@@ -80,8 +79,8 @@ static struct fio_option options[] = {
        },
        {
                .name   = "ioengine",
-               .type   = FIO_OPT_STR,
-               .cb     = str_ioengine_cb,
+               .type   = FIO_OPT_STR_STORE,
+               .off1   = td_var_offset(ioengine),
                .help   = "IO engine to use",
                .def    = "sync",
                .posval = {
@@ -103,6 +102,7 @@ static struct fio_option options[] = {
 #ifdef FIO_HAVE_SYSLET
                          { .ival = "syslet-rw", },
 #endif
+                         { .ival = "cpuio", },
                          { .ival = "external", },
                          },
        },
@@ -181,6 +181,12 @@ static struct fio_option options[] = {
                .help   = "Split job workload between this number of files",
                .def    = "1",
        },
+       {
+               .name   = "openfiles",
+               .type   = FIO_OPT_INT,
+               .off1   = td_var_offset(open_files),
+               .help   = "Number of files to keep open at the same time",
+       },
        {
                .name   = "file_service_type",
                .type   = FIO_OPT_STR,
@@ -469,7 +475,8 @@ static struct fio_option options[] = {
                .name   = "cpuchunks",
                .type   = FIO_OPT_INT,
                .off1   = td_var_offset(cpucycle),
-               .help   = "Length of the CPU burn cycles",
+               .help   = "Length of the CPU burn cycles (usecs)",
+               .def    = "50000",
        },
 #ifdef FIO_HAVE_CPU_AFFINITY
        {
@@ -530,6 +537,12 @@ static struct fio_option options[] = {
                .help   = "When using hugepages, specify size of each page",
                .def    = __stringify(FIO_HUGE_PAGE),
        },
+       {
+               .name   = "group_reporting",
+               .type   = FIO_OPT_STR_SET,
+               .off1   = td_var_offset(group_reporting),
+               .help   = "Do reporting on a per-group basis",
+       },
        {
                .name = NULL,
        },
@@ -591,7 +604,7 @@ static struct option long_options[FIO_JOB_OPTS + FIO_CMD_OPTS] = {
 
 static int def_timeout = 0;
 
-static char fio_version_string[] = "fio 1.12";
+static char fio_version_string[] = "fio 1.13";
 
 static char **ini_file;
 static int max_jobs = MAX_JOBS;
@@ -668,13 +681,13 @@ static void fixup_options(struct thread_data *td)
                td->iodepth = 1;
        else {
                if (!td->iodepth)
-                       td->iodepth = td->nr_files;
+                       td->iodepth = td->open_files;
        }
 
        /*
         * only really works for sequential io for now, and with 1 file
         */
-       if (td->zone_size && td_random(td) && td->nr_files == 1)
+       if (td->zone_size && td_random(td) && td->open_files == 1)
                td->zone_size = 0;
 
        /*
@@ -736,6 +749,9 @@ static void fixup_options(struct thread_data *td)
         */
        if (td->iodepth_batch > td->iodepth || !td->iodepth_batch)
                td->iodepth_batch = td->iodepth;
+
+       if (td->open_files > td->nr_files || !td->open_files)
+               td->open_files = td->nr_files;
 }
 
 /*
@@ -759,6 +775,20 @@ static char *to_kmg(unsigned int val)
        return buf;
 }
 
+/* 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;
+}
+
 /*
  * Adds a job to the list of things todo. Sanitizes the various options
  * to make sure we don't have conflicts, and initializes various
@@ -771,6 +801,7 @@ static int add_job(struct thread_data *td, const char *jobname, int job_add_num)
        struct stat sb;
        int numjobs, i;
        struct fio_file *f;
+       const char *engine;
 
        /*
         * the def_thread is just for options, it's not a real job
@@ -778,13 +809,21 @@ static int add_job(struct thread_data *td, const char *jobname, int job_add_num)
        if (td == &def_thread)
                return 0;
 
-       assert(td->io_ops);
+       engine = get_engine_name(td->ioengine);
+       td->io_ops = load_ioengine(td, engine);
+       if (!td->io_ops) {
+               log_err("fio: failed to load engine %s\n", engine);
+               return 1;
+       }
 
        if (td->odirect)
                td->io_ops->flags |= FIO_RAWIO;
 
+       if (!td->filename)
+               td->filename = strdup(jobname);
+
        td->filetype = FIO_TYPE_FILE;
-       if (td->filename && !lstat(td->filename, &sb)) {
+       if (!lstat(td->filename, &sb)) {
                if (S_ISBLK(sb.st_mode))
                        td->filetype = FIO_TYPE_BD;
                else if (S_ISCHR(sb.st_mode))
@@ -796,7 +835,7 @@ static int add_job(struct thread_data *td, const char *jobname, int job_add_num)
        if (td->filename)
                td->nr_uniq_files = 1;
        else
-               td->nr_uniq_files = td->nr_files;
+               td->nr_uniq_files = td->open_files;
 
        if (td->filetype == FIO_TYPE_FILE || td->filename) {
                char tmp[PATH_MAX];
@@ -815,7 +854,7 @@ static int add_job(struct thread_data *td, const char *jobname, int job_add_num)
                        len = sprintf(tmp, "%s/", td->directory);
                }
 
-               td->files = malloc(sizeof(struct fio_file) * td->nr_files);
+               td->files = malloc(sizeof(struct fio_file) * td->open_files);
 
                for_each_file(td, f, i) {
                        memset(f, 0, sizeof(*f));
@@ -828,7 +867,7 @@ static int add_job(struct thread_data *td, const char *jobname, int job_add_num)
                        f->file_name = strdup(tmp);
                }
        } else {
-               td->nr_files = 1;
+               td->open_files = td->nr_files = 1;
                td->files = malloc(sizeof(struct fio_file));
                f = &td->files[0];
 
@@ -842,7 +881,7 @@ static int add_job(struct thread_data *td, const char *jobname, int job_add_num)
                f->file_offset = td->start_offset;
        }
                
-       fio_sem_init(&td->mutex, 0);
+       td->mutex = fio_sem_init(0);
 
        td->ts.clat_stat[0].min_val = td->ts.clat_stat[1].min_val = ULONG_MAX;
        td->ts.slat_stat[0].min_val = td->ts.slat_stat[1].min_val = ULONG_MAX;
@@ -868,7 +907,7 @@ static int add_job(struct thread_data *td, const char *jobname, int job_add_num)
 
        if (!terse_output) {
                if (!job_add_num) {
-                       if (td->io_ops->flags & FIO_CPUIO)
+                       if (!strcmp(td->io_ops->name, "cpuio"))
                                fprintf(f_out, "%s: ioengine=cpu, cpuload=%u, cpucycle=%u\n", td->name, td->cpuload, td->cpucycle);
                        else {
                                char *c1, *c2, *c3, *c4;
@@ -923,7 +962,7 @@ int init_random_state(struct thread_data *td)
        int fd, num_maps, blocks, i;
        struct fio_file *f;
 
-       if (td->io_ops->flags & FIO_CPUIO)
+       if (td->io_ops->flags & FIO_DISKLESSIO)
                return 0;
 
        fd = open("/dev/urandom", O_RDONLY);
@@ -1028,32 +1067,6 @@ 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, name);
-       if (td->io_ops)
-               return 0;
-
-       return 1;
-}
-
 static int str_lockmem_cb(void fio_unused *data, unsigned long *val)
 {
        mlock_size = *val;