Clean up file flags
[fio.git] / fio.c
diff --git a/fio.c b/fio.c
index f699951dcf58697f87922be056bfe99191e82f96..5bd1baefc29849ec58c225e4443f8a829b95df5d 100644 (file)
--- a/fio.c
+++ b/fio.c
@@ -52,6 +52,7 @@ int temp_stall_ts;
 unsigned long done_secs = 0;
 
 static struct fio_mutex *startup_mutex;
+static struct fio_mutex *writeout_mutex;
 static volatile int fio_abort;
 static int exit_value;
 static struct itimerval itimer;
@@ -382,7 +383,7 @@ static void do_verify(struct thread_data *td)
         * read from disk.
         */
        for_each_file(td, f, i) {
-               if (!(f->flags & FIO_FILE_OPEN))
+               if (!fio_file_open(f))
                        continue;
                if (fio_io_sync(td, f))
                        break;
@@ -699,7 +700,7 @@ sync_done:
                        td_set_runstate(td, TD_FSYNCING);
 
                        for_each_file(td, f, i) {
-                               if (!(f->flags & FIO_FILE_OPEN))
+                               if (!fio_file_open(f))
                                        continue;
                                fio_io_sync(td, f);
                        }
@@ -733,7 +734,7 @@ static int init_io_u(struct thread_data *td)
 {
        struct io_u *io_u;
        unsigned int max_bs;
-       int i, max_units;
+       int cl_align, i, max_units;
        char *p;
 
        max_units = td->o.iodepth;
@@ -761,10 +762,20 @@ static int init_io_u(struct thread_data *td)
        else
                p = td->orig_buffer;
 
+       cl_align = os_cache_line_size();
+
        for (i = 0; i < max_units; i++) {
+               void *ptr;
+
                if (td->terminate)
                        return 1;
-               io_u = malloc(sizeof(*io_u));
+
+               if (posix_memalign(&ptr, cl_align, sizeof(*io_u))) {
+                       log_err("fio: posix_memalign=%s\n", strerror(errno));
+                       break;
+               }
+
+               io_u = ptr;
                memset(io_u, 0, sizeof(*io_u));
                INIT_FLIST_HEAD(&io_u->list);
 
@@ -876,6 +887,11 @@ static void reset_io_counters(struct thread_data *td)
         */
        if (td->o.time_based || td->o.loops)
                td->nr_done_files = 0;
+
+       /*
+        * Set the same seed to get repeatable runs
+        */
+       td_fill_rand_seeds(td);
 }
 
 void reset_all_stats(struct thread_data *td)
@@ -906,7 +922,23 @@ static void clear_io_state(struct thread_data *td)
 
        close_files(td);
        for_each_file(td, f, i)
-               f->flags &= ~FIO_FILE_DONE;
+               fio_file_clear_done(f);
+}
+
+static int exec_string(const char *string)
+{
+       int ret, newlen = strlen(string) + 1 + 8;
+       char *str;
+
+       str = malloc(newlen);
+       sprintf(str, "sh -c %s", string);
+
+       ret = system(str);
+       if (ret == -1)
+               log_err("fio: exec of cmd <%s> failed\n", str);
+
+       free(str);
+       return ret;
 }
 
 /*
@@ -998,7 +1030,12 @@ static void *thread_main(void *data)
                goto err;
 
        if (td->o.exec_prerun) {
-               if (system(td->o.exec_prerun) < 0)
+               if (exec_string(td->o.exec_prerun))
+                       goto err;
+       }
+
+       if (td->o.pre_read) {
+               if (pre_read_files(td) < 0)
                        goto err;
        }
 
@@ -1071,6 +1108,7 @@ static void *thread_main(void *data)
        td->ts.io_bytes[0] = td->io_bytes[0];
        td->ts.io_bytes[1] = td->io_bytes[1];
 
+       fio_mutex_down(writeout_mutex);
        if (td->ts.bw_log) {
                if (td->o.bw_log_file) {
                        finish_log_named(td, td->ts.bw_log,
@@ -1081,7 +1119,7 @@ static void *thread_main(void *data)
        if (td->ts.slat_log) {
                if (td->o.lat_log_file) {
                        finish_log_named(td, td->ts.slat_log,
-                                               td->o.lat_log_file, "clat");
+                                               td->o.lat_log_file, "slat");
                } else
                        finish_log(td, td->ts.slat_log, "slat");
        }
@@ -1092,10 +1130,9 @@ static void *thread_main(void *data)
                } else
                        finish_log(td, td->ts.clat_log, "clat");
        }
-       if (td->o.exec_postrun) {
-               if (system(td->o.exec_postrun) < 0)
-                       log_err("fio: postrun %s failed\n", td->o.exec_postrun);
-       }
+       fio_mutex_up(writeout_mutex);
+       if (td->o.exec_postrun)
+               exec_string(td->o.exec_postrun);
 
        if (exitall_on_terminate)
                terminate_threads(td->groupid);
@@ -1539,6 +1576,7 @@ int main(int argc, char *argv[])
        }
 
        startup_mutex = fio_mutex_init(0);
+       writeout_mutex = fio_mutex_init(1);
 
        set_genesis_time();
 
@@ -1556,5 +1594,6 @@ int main(int argc, char *argv[])
        }
 
        fio_mutex_remove(startup_mutex);
+       fio_mutex_remove(writeout_mutex);
        return exit_value;
 }