testing: add test scripts for sg ioengine
[fio.git] / stat.c
diff --git a/stat.c b/stat.c
index 1effbfe9c5b452c625574a3cce02bd87ccdb074a..428590e795a7f8a9db2fa76ce06ff8b69e134165 100644 (file)
--- a/stat.c
+++ b/stat.c
@@ -1288,19 +1288,15 @@ static struct json_object *show_thread_status_json(struct thread_stat *ts,
                usr_cpu = 0;
                sys_cpu = 0;
        }
+       json_object_add_value_int(root, "job_runtime", ts->total_run_time);
        json_object_add_value_float(root, "usr_cpu", usr_cpu);
        json_object_add_value_float(root, "sys_cpu", sys_cpu);
        json_object_add_value_int(root, "ctx", ts->ctx);
        json_object_add_value_int(root, "majf", ts->majf);
        json_object_add_value_int(root, "minf", ts->minf);
 
-
-       /* Calc % distribution of IO depths, usecond, msecond latency */
+       /* Calc % distribution of IO depths */
        stat_calc_dist(ts->io_u_map, ddir_rw_sum(ts->total_io_u), io_u_dist);
-       stat_calc_lat_n(ts, io_u_lat_n);
-       stat_calc_lat_u(ts, io_u_lat_u);
-       stat_calc_lat_m(ts, io_u_lat_m);
-
        tmp = json_create_object();
        json_object_add_value_object(root, "iodepth_level", tmp);
        /* Only show fixed 7 I/O depth levels*/
@@ -1313,6 +1309,44 @@ static struct json_object *show_thread_status_json(struct thread_stat *ts,
                json_object_add_value_float(tmp, (const char *)name, io_u_dist[i]);
        }
 
+       /* Calc % distribution of submit IO depths */
+       stat_calc_dist(ts->io_u_submit, ts->total_submit, io_u_dist);
+       tmp = json_create_object();
+       json_object_add_value_object(root, "iodepth_submit", tmp);
+       /* Only show fixed 7 I/O depth levels*/
+       for (i = 0; i < 7; i++) {
+               char name[20];
+               if (i == 0)
+                       snprintf(name, 20, "0");
+               else if (i < 6)
+                       snprintf(name, 20, "%d", 1 << (i+1));
+               else
+                       snprintf(name, 20, ">=%d", 1 << i);
+               json_object_add_value_float(tmp, (const char *)name, io_u_dist[i]);
+       }
+
+       /* Calc % distribution of completion IO depths */
+       stat_calc_dist(ts->io_u_complete, ts->total_complete, io_u_dist);
+       tmp = json_create_object();
+       json_object_add_value_object(root, "iodepth_complete", tmp);
+       /* Only show fixed 7 I/O depth levels*/
+       for (i = 0; i < 7; i++) {
+               char name[20];
+               if (i == 0)
+                       snprintf(name, 20, "0");
+               else if (i < 6)
+                       snprintf(name, 20, "%d", 1 << (i+1));
+               else
+                       snprintf(name, 20, ">=%d", 1 << i);
+               json_object_add_value_float(tmp, (const char *)name, io_u_dist[i]);
+       }
+
+       /* Calc % distribution of nsecond, usecond, msecond latency */
+       stat_calc_dist(ts->io_u_map, ddir_rw_sum(ts->total_io_u), io_u_dist);
+       stat_calc_lat_n(ts, io_u_lat_n);
+       stat_calc_lat_u(ts, io_u_lat_u);
+       stat_calc_lat_m(ts, io_u_lat_m);
+
        /* Nanosecond latency */
        tmp = json_create_object();
        json_object_add_value_object(root, "latency_ns", tmp);
@@ -1398,7 +1432,7 @@ static struct json_object *show_thread_status_json(struct thread_stat *ts,
        if (ts->ss_dur) {
                struct json_object *data;
                struct json_array *iops, *bw;
-               int i, j, k;
+               int j, k, l;
                char ss_buf[64];
 
                snprintf(ss_buf, sizeof(ss_buf), "%s%s:%f%s",
@@ -1434,8 +1468,8 @@ static struct json_object *show_thread_status_json(struct thread_stat *ts,
                        j = ts->ss_head;
                else
                        j = ts->ss_head == 0 ? ts->ss_dur - 1 : ts->ss_head - 1;
-               for (i = 0; i < ts->ss_dur; i++) {
-                       k = (j + i) % ts->ss_dur;
+               for (l = 0; l < ts->ss_dur; l++) {
+                       k = (j + l) % ts->ss_dur;
                        json_array_add_value_int(bw, ts->ss_bw_data[k]);
                        json_array_add_value_int(iops, ts->ss_iops_data[k]);
                }
@@ -1934,6 +1968,8 @@ void __show_run_stats(void)
                buf_output_free(out);
        }
 
+       fio_idle_prof_cleanup();
+
        log_info_flush();
        free(runstats);
        free(threadstats);
@@ -2205,12 +2241,14 @@ static struct io_logs *get_cur_log(struct io_log *iolog)
         * submissions, flag 'td' as needing a log regrow and we'll take
         * care of it on the submission side.
         */
-       if (iolog->td->o.io_submit_mode == IO_MODE_OFFLOAD ||
+       if ((iolog->td && iolog->td->o.io_submit_mode == IO_MODE_OFFLOAD) ||
            !per_unit_log(iolog))
                return regrow_log(iolog);
 
-       iolog->td->flags |= TD_F_REGROW_LOGS;
-       assert(iolog->pending->nr_samples < iolog->pending->max_samples);
+       if (iolog->td)
+               iolog->td->flags |= TD_F_REGROW_LOGS;
+       if (iolog->pending)
+               assert(iolog->pending->nr_samples < iolog->pending->max_samples);
        return iolog->pending;
 }