Fix confusion between terse and json output
[fio.git] / backend.c
index f6d1983a92d61275724a4815730b7c4246328987..b5501c63f76df6813f72a3c7bc6a93e90e505aea 100644 (file)
--- a/backend.c
+++ b/backend.c
@@ -67,6 +67,7 @@ unsigned int nr_thread = 0;
 int shm_id = 0;
 int temp_stall_ts;
 unsigned long done_secs = 0;
+volatile int disk_util_exit = 0;
 
 #define PAGE_ALIGN(buf)        \
        (char *) (((uintptr_t) (buf) + page_mask) & ~page_mask)
@@ -337,17 +338,17 @@ static int break_on_this_error(struct thread_data *td, enum fio_ddir ddir,
        int ret = *retptr;
 
        if (ret < 0 || td->error) {
-               int err;
+               int err = td->error;
+               enum error_type_bit eb;
 
                if (ret < 0)
                        err = -ret;
-               else
-                       err = td->error;
 
-               if (!(td->o.continue_on_error & td_error_type(ddir, err)))
+               eb = td_error_type(ddir, err);
+               if (!(td->o.continue_on_error & (1 << eb)))
                        return 1;
 
-               if (td_non_fatal_error(err)) {
+               if (td_non_fatal_error(td, eb, err)) {
                        /*
                         * Continue with the I/Os in case of
                         * a non fatal error.
@@ -717,8 +718,7 @@ sync_done:
 
                if (ret < 0)
                        break;
-               if (!(bytes_done[DDIR_READ] + bytes_done[DDIR_WRITE]
-                               + bytes_done[DDIR_TRIM]))
+               if (!ddir_rw_sum(bytes_done))
                        continue;
 
                if (!in_ramp_time(td) && should_check_rate(td, bytes_done)) {
@@ -733,8 +733,7 @@ sync_done:
                if (td->o.thinktime) {
                        unsigned long long b;
 
-                       b = td->io_blocks[DDIR_READ] + td->io_blocks[DDIR_WRITE] +
-                               td->io_blocks[DDIR_TRIM];
+                       b = ddir_rw_sum(td->io_blocks);
                        if (!(b % td->o.thinktime_blocks)) {
                                int left;
 
@@ -780,8 +779,7 @@ sync_done:
        /*
         * stop job if we failed doing any IO
         */
-       if ((td->this_io_bytes[DDIR_READ] + td->this_io_bytes[DDIR_WRITE] +
-                       td->this_io_bytes[DDIR_TRIM]) == 0)
+       if (!ddir_rw_sum(td->this_io_bytes))
                td->done = 1;
 }
 
@@ -805,6 +803,7 @@ static int init_io_u(struct thread_data *td)
        struct io_u *io_u;
        unsigned int max_bs, min_write;
        int cl_align, i, max_units;
+       int data_xfer = 1;
        char *p;
 
        max_units = td->o.iodepth;
@@ -814,6 +813,9 @@ static int init_io_u(struct thread_data *td)
        td->orig_buffer_size = (unsigned long long) max_bs
                                        * (unsigned long long) max_units;
 
+       if ((td->io_ops->flags & FIO_NOIO) || !(td_read(td) || td_write(td)))
+               data_xfer = 0;
+
        if (td->o.mem_type == MEM_SHMHUGE || td->o.mem_type == MEM_MMAPHUGE) {
                unsigned long bs;
 
@@ -826,7 +828,7 @@ static int init_io_u(struct thread_data *td)
                return 1;
        }
 
-       if (allocate_io_mem(td))
+       if (data_xfer && allocate_io_mem(td))
                return 1;
 
        if (td->o.odirect || td->o.mem_align ||
@@ -854,7 +856,7 @@ static int init_io_u(struct thread_data *td)
                INIT_FLIST_HEAD(&io_u->list);
                dprint(FD_MEM, "io_u alloc %p, index %u\n", io_u, i);
 
-               if (!(td->io_ops->flags & FIO_NOIO)) {
+               if (data_xfer) {
                        io_u->buf = p;
                        dprint(FD_MEM, "io_u %p, mem %p\n", io_u, io_u->buf);
 
@@ -936,8 +938,6 @@ static int switch_ioscheduler(struct thread_data *td)
 
 static int keep_running(struct thread_data *td)
 {
-       unsigned long long io_done;
-
        if (td->done)
                return 0;
        if (td->o.time_based)
@@ -947,9 +947,7 @@ static int keep_running(struct thread_data *td)
                return 1;
        }
 
-       io_done = td->io_bytes[DDIR_READ] + td->io_bytes[DDIR_WRITE] +
-                       td->io_bytes[DDIR_TRIM] + td->io_skip_bytes;
-       if (io_done < td->o.size)
+       if (ddir_rw_sum(td->io_bytes) < td->o.size)
                return 1;
 
        return 0;
@@ -1356,10 +1354,8 @@ static void reap_threads(unsigned int *nr_running, unsigned int *t_rate,
                continue;
 reaped:
                (*nr_running)--;
-               (*m_rate) -= (td->o.ratemin[DDIR_READ] + td->o.ratemin[DDIR_WRITE] +
-                       td->o.ratemin[DDIR_TRIM]);
-               (*t_rate) -= (td->o.rate[DDIR_READ] + td->o.rate[DDIR_WRITE] +
-                       td->o.rate[DDIR_TRIM]);
+               (*m_rate) -= ddir_rw_sum(td->o.ratemin);
+               (*t_rate) -= ddir_rw_sum(td->o.rate);
                if (!td->pid)
                        pending--;
 
@@ -1390,7 +1386,7 @@ static void run_threads(void)
 
        set_sig_handlers();
 
-       if (!terse_output) {
+       if (output_format == FIO_OUTPUT_NORMAL) {
                log_info("Starting ");
                if (nr_thread)
                        log_info("%d thread%s", nr_thread,
@@ -1581,10 +1577,8 @@ static void run_threads(void)
                                td_set_runstate(td, TD_RUNNING);
                        nr_running++;
                        nr_started--;
-                       m_rate += td->o.ratemin[DDIR_READ] +
-                               td->o.ratemin[DDIR_WRITE] + td->o.ratemin[DDIR_TRIM];
-                       t_rate += td->o.rate[DDIR_READ] +
-                               td->o.rate[DDIR_WRITE] + td->o.rate[DDIR_TRIM];
+                       m_rate += ddir_rw_sum(td->o.ratemin);
+                       t_rate += ddir_rw_sum(td->o.rate);
                        todo--;
                        fio_mutex_up(td->mutex);
                }
@@ -1617,6 +1611,13 @@ void wait_for_disk_thread_exit(void)
        fio_mutex_down(disk_thread_mutex);
 }
 
+static void free_disk_util(void)
+{
+       disk_util_start_exit();
+       wait_for_disk_thread_exit();
+       disk_util_prune_entries();
+}
+
 static void *disk_thread_main(void *data)
 {
        int ret = 0;