Merge branch 'master' of ssh://brick.kernel.dk/data/git/fio
[fio.git] / fio.c
diff --git a/fio.c b/fio.c
index 30b40cc7e27d8be1e9940695ed2c36c92bba2c46..f0665e072ccbd5f6ac3f4dcd52a5edfe015cbf31 100644 (file)
--- a/fio.c
+++ b/fio.c
@@ -171,13 +171,15 @@ static void set_sig_handlers(void)
 
 static inline int should_check_rate(struct thread_data *td)
 {
+       struct thread_options *o = &td->o;
+
        /*
-        * No minimum rate set, always ok
+        * If some rate setting was given, we need to check it
         */
-       if (!td->o.ratemin && !td->o.rate_iops_min)
-               return 0;
+       if (o->rate || o->ratemin || o->rate_iops || o->rate_iops_min)
+               return 1;
 
-       return 1;
+       return 0;
 }
 
 /*
@@ -731,7 +733,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;
@@ -759,10 +761,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);
 
@@ -874,6 +886,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)
@@ -895,25 +912,16 @@ void reset_all_stats(struct thread_data *td)
        memcpy(&td->start, &tv, sizeof(tv));
 }
 
-static int clear_io_state(struct thread_data *td)
+static void clear_io_state(struct thread_data *td)
 {
        struct fio_file *f;
        unsigned int i;
-       int ret;
 
        reset_io_counters(td);
 
        close_files(td);
-
-       ret = 0;
-       for_each_file(td, f, i) {
+       for_each_file(td, f, i)
                f->flags &= ~FIO_FILE_DONE;
-               ret = td_io_open_file(td, f);
-               if (ret)
-                       break;
-       }
-
-       return ret;
 }
 
 /*
@@ -941,8 +949,11 @@ static void *thread_main(void *data)
        td->io_hist_tree = RB_ROOT;
 
        td_set_runstate(td, TD_INITIALIZED);
+       dprint(FD_MUTEX, "up startup_mutex\n");
        fio_mutex_up(startup_mutex);
+       dprint(FD_MUTEX, "wait on td->mutex\n");
        fio_mutex_down(td->mutex);
+       dprint(FD_MUTEX, "done waiting on td->mutex\n");
 
        /*
         * the ->mutex mutex is now no longer used, close it to avoid
@@ -998,9 +1009,6 @@ static void *thread_main(void *data)
        if (td_io_init(td))
                goto err;
 
-       if (open_files(td))
-               goto err;
-
        if (init_random_map(td))
                goto err;
 
@@ -1023,8 +1031,8 @@ static void *thread_main(void *data)
                        memcpy(&td->lastrate, &td->ts.stat_sample_time,
                                                        sizeof(td->lastrate));
 
-               if (clear_state && clear_io_state(td))
-                       break;
+               if (clear_state)
+                       clear_io_state(td);
 
                prune_io_piece_log(td);
 
@@ -1059,8 +1067,7 @@ static void *thread_main(void *data)
                    (td->io_ops->flags & FIO_UNIDIR))
                        continue;
 
-               if (clear_io_state(td))
-                       break;
+               clear_io_state(td);
 
                fio_gettime(&td->start, NULL);
 
@@ -1089,7 +1096,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");
        }
@@ -1271,16 +1278,23 @@ static void *gtod_thread_main(void *data)
 
 static int fio_start_gtod_thread(void)
 {
-       if (pthread_create(&gtod_thread, NULL, gtod_thread_main, NULL)) {
-               perror("Can't create gtod thread");
+       int ret;
+
+       ret = pthread_create(&gtod_thread, NULL, gtod_thread_main, NULL);
+       if (ret) {
+               log_err("Can't create gtod thread: %s\n", strerror(ret));
                return 1;
        }
-       if (pthread_detach(gtod_thread) < 0) {
-               perror("Can't detatch gtod thread");
+
+       ret = pthread_detach(gtod_thread);
+       if (ret) {
+               log_err("Can't detatch gtod thread: %s\n", strerror(ret));
                return 1;
        }
 
+       dprint(FD_MUTEX, "wait on startup_mutex\n");
        fio_mutex_down(startup_mutex);
+       dprint(FD_MUTEX, "done waiting on startup_mutex\n");
        return 0;
 }
 
@@ -1402,15 +1416,21 @@ static void run_threads(void)
                        nr_started++;
 
                        if (td->o.use_thread) {
+                               int ret;
+
                                dprint(FD_PROCESS, "will pthread_create\n");
-                               if (pthread_create(&td->thread, NULL,
-                                                  thread_main, td)) {
-                                       perror("pthread_create");
+                               ret = pthread_create(&td->thread, NULL,
+                                                       thread_main, td);
+                               if (ret) {
+                                       log_err("pthread_create: %s\n",
+                                                       strerror(ret));
                                        nr_started--;
                                        break;
                                }
-                               if (pthread_detach(td->thread) < 0)
-                                       perror("pthread_detach");
+                               ret = pthread_detach(td->thread);
+                               if (ret)
+                                       log_err("pthread_detach: %s",
+                                                       strerror(ret));
                        } else {
                                pid_t pid;
                                dprint(FD_PROCESS, "will fork\n");
@@ -1422,7 +1442,9 @@ static void run_threads(void)
                                } else if (i == fio_debug_jobno)
                                        *fio_debug_jobp = pid;
                        }
+                       dprint(FD_MUTEX, "wait on startup_mutex\n");
                        fio_mutex_down(startup_mutex);
+                       dprint(FD_MUTEX, "done waiting on startup_mutex\n");
                }
 
                /*