arm64: ensure CPU clock retrieval issues isb()
[fio.git] / rate-submit.c
index 3bcb5053d8be1b69d6f68906239ceb6a939a2c44..268356d17a1f1b35a6eaa0ad82219db86177a4de 100644 (file)
@@ -4,6 +4,7 @@
  * Copyright (C) 2015 Jens Axboe <axboe@kernel.dk>
  *
  */
+#include <assert.h>
 #include "fio.h"
 #include "ioengines.h"
 #include "lib/getrusage.h"
@@ -11,7 +12,7 @@
 
 static void check_overlap(struct io_u *io_u)
 {
-       int i;
+       int i, res;
        struct thread_data *td;
 
        /*
@@ -26,7 +27,8 @@ static void check_overlap(struct io_u *io_u)
         * IO_U_F_FLIGHT flag is set so that this io_u can be checked by other
         * threads as they assess overlap.
         */
-       pthread_mutex_lock(&overlap_check);
+       res = pthread_mutex_lock(&overlap_check);
+       assert(res == 0);
 
 retry:
        for_each_td(td, i) {
@@ -39,8 +41,10 @@ retry:
                if (!in_flight_overlap(&td->io_u_all, io_u))
                        continue;
 
-               pthread_mutex_unlock(&overlap_check);
-               pthread_mutex_lock(&overlap_check);
+               res = pthread_mutex_unlock(&overlap_check);
+               assert(res == 0);
+               res = pthread_mutex_lock(&overlap_check);
+               assert(res == 0);
                goto retry;
        }
 }
@@ -93,8 +97,11 @@ static int io_workqueue_fn(struct submit_worker *sw,
                        td->cur_depth -= ret;
        }
 
-       if (error || td->error)
+       if (error || td->error) {
+               pthread_mutex_lock(&td->io_u_lock);
                pthread_cond_signal(&td->parent->free_cond);
+               pthread_mutex_unlock(&td->io_u_lock);
+       }
 
        return 0;
 }
@@ -166,7 +173,7 @@ static int io_workqueue_init_worker_fn(struct submit_worker *sw)
        if (td->io_ops->post_init && td->io_ops->post_init(td))
                goto err_io_init;
 
-       set_epoch_time(td, td->o.log_unix_epoch);
+       set_epoch_time(td, td->o.log_unix_epoch | td->o.log_alternate_epoch, td->o.log_alternate_epoch_clock_id);
        fio_getrusage(&td->ru_start);
        clear_io_state(td, 1);
 
@@ -188,7 +195,16 @@ static void io_workqueue_exit_worker_fn(struct submit_worker *sw,
        struct thread_data *td = sw->priv;
 
        (*sum_cnt)++;
-       sum_thread_stats(&sw->wq->td->ts, &td->ts, *sum_cnt == 1);
+
+       /*
+        * io_workqueue_update_acct_fn() doesn't support per prio stats, and
+        * even if it did, offload can't be used with all async IO engines.
+        * If group reporting is set in the parent td, the group result
+        * generated by __show_run_stats() can still contain multiple prios
+        * from different offloaded jobs.
+        */
+       sw->wq->td->ts.disable_prio_stat = 1;
+       sum_thread_stats(&sw->wq->td->ts, &td->ts);
 
        fio_options_free(td);
        close_and_free_files(td);