Merge branch 'master' of https://github.com/shailevi23/fio
[fio.git] / stat.c
diff --git a/stat.c b/stat.c
index d779a90f3209fccb413d80417ea75061a7955228..7cf6bee1945aabea351f13853f5b32ba386881a9 100644 (file)
--- a/stat.c
+++ b/stat.c
@@ -555,7 +555,7 @@ static void show_ddir_status(struct group_run_stats *rs, struct thread_stat *ts,
 
        iops = (1000 * (uint64_t)ts->total_io_u[ddir]) / runt;
        iops_p = num2str(iops, ts->sig_figs, 1, 0, N2S_NONE);
-       if (ddir == DDIR_WRITE)
+       if (ddir == DDIR_WRITE || ddir == DDIR_TRIM)
                post_st = zbd_write_status(ts);
        else if (ddir == DDIR_READ && ts->cachehit && ts->cachemiss) {
                uint64_t total;
@@ -597,10 +597,11 @@ static void show_ddir_status(struct group_run_stats *rs, struct thread_stat *ts,
                                continue;
 
                        snprintf(buf, sizeof(buf),
-                                "%s prio %u/%u",
+                                "%s prio %u/%u/%u",
                                 clat_type,
                                 ioprio_class(ts->clat_prio[ddir][i].ioprio),
-                                ioprio(ts->clat_prio[ddir][i].ioprio));
+                                ioprio(ts->clat_prio[ddir][i].ioprio),
+                                ioprio_hint(ts->clat_prio[ddir][i].ioprio));
                        display_lat(buf, min, max, mean, dev, out);
                }
        }
@@ -640,10 +641,11 @@ static void show_ddir_status(struct group_run_stats *rs, struct thread_stat *ts,
                                        continue;
 
                                snprintf(prio_name, sizeof(prio_name),
-                                        "%s prio %u/%u (%.2f%% of IOs)",
+                                        "%s prio %u/%u/%u (%.2f%% of IOs)",
                                         clat_type,
                                         ioprio_class(ts->clat_prio[ddir][i].ioprio),
                                         ioprio(ts->clat_prio[ddir][i].ioprio),
+                                        ioprio_hint(ts->clat_prio[ddir][i].ioprio),
                                         100. * (double) prio_samples / (double) samples);
                                show_clat_percentiles(ts->clat_prio[ddir][i].io_u_plat,
                                                prio_samples, ts->percentile_list,
@@ -957,11 +959,13 @@ static void show_agg_stats(struct disk_util_agg *agg, int terse,
                return;
 
        if (!terse) {
-               log_buf(out, ", aggrios=%llu/%llu, aggrmerge=%llu/%llu, "
-                        "aggrticks=%llu/%llu, aggrin_queue=%llu, "
-                        "aggrutil=%3.2f%%",
+               log_buf(out, ", aggrios=%llu/%llu, aggsectors=%llu/%llu, "
+                        "aggrmerge=%llu/%llu, aggrticks=%llu/%llu, "
+                        "aggrin_queue=%llu, aggrutil=%3.2f%%",
                        (unsigned long long) agg->ios[0] / agg->slavecount,
                        (unsigned long long) agg->ios[1] / agg->slavecount,
+                       (unsigned long long) agg->sectors[0] / agg->slavecount,
+                       (unsigned long long) agg->sectors[1] / agg->slavecount,
                        (unsigned long long) agg->merges[0] / agg->slavecount,
                        (unsigned long long) agg->merges[1] / agg->slavecount,
                        (unsigned long long) agg->ticks[0] / agg->slavecount,
@@ -1030,11 +1034,14 @@ void print_disk_util(struct disk_util_stat *dus, struct disk_util_agg *agg,
                if (agg->slavecount)
                        log_buf(out, "  ");
 
-               log_buf(out, "  %s: ios=%llu/%llu, merge=%llu/%llu, "
-                        "ticks=%llu/%llu, in_queue=%llu, util=%3.2f%%",
+               log_buf(out, "  %s: ios=%llu/%llu, sectors=%llu/%llu, "
+                       "merge=%llu/%llu, ticks=%llu/%llu, in_queue=%llu, "
+                       "util=%3.2f%%",
                                dus->name,
                                (unsigned long long) dus->s.ios[0],
                                (unsigned long long) dus->s.ios[1],
+                               (unsigned long long) dus->s.sectors[0],
+                               (unsigned long long) dus->s.sectors[1],
                                (unsigned long long) dus->s.merges[0],
                                (unsigned long long) dus->s.merges[1],
                                (unsigned long long) dus->s.ticks[0],
@@ -1081,6 +1088,8 @@ void json_array_add_disk_util(struct disk_util_stat *dus,
        json_object_add_value_string(obj, "name", (const char *)dus->name);
        json_object_add_value_int(obj, "read_ios", dus->s.ios[0]);
        json_object_add_value_int(obj, "write_ios", dus->s.ios[1]);
+       json_object_add_value_int(obj, "read_sectors", dus->s.sectors[0]);
+       json_object_add_value_int(obj, "write_sectors", dus->s.sectors[1]);
        json_object_add_value_int(obj, "read_merges", dus->s.merges[0]);
        json_object_add_value_int(obj, "write_merges", dus->s.merges[1]);
        json_object_add_value_int(obj, "read_ticks", dus->s.ticks[0]);
@@ -1098,6 +1107,10 @@ void json_array_add_disk_util(struct disk_util_stat *dus,
                                agg->ios[0] / agg->slavecount);
        json_object_add_value_int(obj, "aggr_write_ios",
                                agg->ios[1] / agg->slavecount);
+       json_object_add_value_int(obj, "aggr_read_sectors",
+                               agg->sectors[0] / agg->slavecount);
+       json_object_add_value_int(obj, "aggr_write_sectors",
+                               agg->sectors[1] / agg->slavecount);
        json_object_add_value_int(obj, "aggr_read_merges",
                                agg->merges[0] / agg->slavecount);
        json_object_add_value_int(obj, "aggr_write_merge",
@@ -1522,6 +1535,8 @@ static void add_ddir_status_json(struct thread_stat *ts,
                                ioprio_class(ts->clat_prio[ddir][i].ioprio));
                        json_object_add_value_int(obj, "prio",
                                ioprio(ts->clat_prio[ddir][i].ioprio));
+                       json_object_add_value_int(obj, "priohint",
+                               ioprio_hint(ts->clat_prio[ddir][i].ioprio));
 
                        tmp_object = add_ddir_lat_json(ts,
                                        ts->clat_percentiles | ts->lat_percentiles,
@@ -1697,6 +1712,7 @@ static struct json_object *show_thread_status_json(struct thread_stat *ts,
        root = json_create_object();
        json_object_add_value_string(root, "jobname", ts->name);
        json_object_add_value_int(root, "groupid", ts->groupid);
+       json_object_add_value_int(root, "job_start", ts->job_start);
        json_object_add_value_int(root, "error", ts->error);
 
        /* ETA Info */
@@ -2511,6 +2527,7 @@ void __show_run_stats(void)
                         */
                        ts->thread_number = td->thread_number;
                        ts->groupid = td->groupid;
+                       ts->job_start = td->job_start;
 
                        /*
                         * first pid in group, not very useful...
@@ -3033,7 +3050,9 @@ static void __add_log_sample(struct io_log *iolog, union io_sample_data data,
                s = get_sample(iolog, cur_log, cur_log->nr_samples);
 
                s->data = data;
-               s->time = t + (iolog->td ? iolog->td->alternate_epoch : 0);
+               s->time = t;
+               if (iolog->td && iolog->td->o.log_alternate_epoch)
+                       s->time += iolog->td->alternate_epoch;
                io_sample_set_ddir(iolog, s, ddir);
                s->bs = bs;
                s->priority = priority;