t/io_uring: avoid null-ptr dereference in case setup_ring fails
[fio.git] / stat.c
diff --git a/stat.c b/stat.c
index e0a2dcc60f4da1b44d1838d7b980957bfbdb9034..015b8e280ff27fec6174ae0d7f9c436867d64559 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;
@@ -590,17 +590,18 @@ static void show_ddir_status(struct group_run_stats *rs, struct thread_stat *ts,
        /* Only print per prio stats if there are >= 2 prios with samples */
        if (get_nr_prios_with_samples(ts, ddir) >= 2) {
                for (i = 0; i < ts->nr_clat_prio[ddir]; i++) {
-                       if (calc_lat(&ts->clat_prio[ddir][i].clat_stat, &min,
-                                    &max, &mean, &dev)) {
-                               char buf[64];
+                       char buf[64];
 
-                               snprintf(buf, sizeof(buf),
-                                        "%s prio %u/%u",
-                                        clat_type,
-                                        ts->clat_prio[ddir][i].ioprio >> 13,
-                                        ts->clat_prio[ddir][i].ioprio & 7);
-                               display_lat(buf, min, max, mean, dev, out);
-                       }
+                       if (!calc_lat(&ts->clat_prio[ddir][i].clat_stat, &min,
+                                     &max, &mean, &dev))
+                               continue;
+
+                       snprintf(buf, sizeof(buf),
+                                "%s prio %u/%u",
+                                clat_type,
+                                ioprio_class(ts->clat_prio[ddir][i].ioprio),
+                                ioprio(ts->clat_prio[ddir][i].ioprio));
+                       display_lat(buf, min, max, mean, dev, out);
                }
        }
 
@@ -632,20 +633,22 @@ static void show_ddir_status(struct group_run_stats *rs, struct thread_stat *ts,
                /* Only print per prio stats if there are >= 2 prios with samples */
                if (get_nr_prios_with_samples(ts, ddir) >= 2) {
                        for (i = 0; i < ts->nr_clat_prio[ddir]; i++) {
-                               uint64_t prio_samples = ts->clat_prio[ddir][i].clat_stat.samples;
-
-                               if (prio_samples > 0) {
-                                       snprintf(prio_name, sizeof(prio_name),
-                                                "%s prio %u/%u (%.2f%% of IOs)",
-                                                clat_type,
-                                                ts->clat_prio[ddir][i].ioprio >> 13,
-                                                ts->clat_prio[ddir][i].ioprio & 7,
-                                                100. * (double) prio_samples / (double) samples);
-                                       show_clat_percentiles(ts->clat_prio[ddir][i].io_u_plat,
-                                                             prio_samples, ts->percentile_list,
-                                                             ts->percentile_precision,
-                                                             prio_name, out);
-                               }
+                               uint64_t prio_samples =
+                                       ts->clat_prio[ddir][i].clat_stat.samples;
+
+                               if (!prio_samples)
+                                       continue;
+
+                               snprintf(prio_name, sizeof(prio_name),
+                                        "%s prio %u/%u (%.2f%% of IOs)",
+                                        clat_type,
+                                        ioprio_class(ts->clat_prio[ddir][i].ioprio),
+                                        ioprio(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,
+                                               ts->percentile_precision,
+                                               prio_name, out);
                        }
                }
        }
@@ -1508,22 +1511,24 @@ static void add_ddir_status_json(struct thread_stat *ts,
                json_object_add_value_array(dir_object, "prios", array);
 
                for (i = 0; i < ts->nr_clat_prio[ddir]; i++) {
-                       if (ts->clat_prio[ddir][i].clat_stat.samples > 0) {
-                               struct json_object *obj = json_create_object();
-                               unsigned long long class, level;
-
-                               class = ts->clat_prio[ddir][i].ioprio >> 13;
-                               json_object_add_value_int(obj, "prioclass", class);
-                               level = ts->clat_prio[ddir][i].ioprio & 7;
-                               json_object_add_value_int(obj, "prio", level);
-
-                               tmp_object = add_ddir_lat_json(ts,
-                                                              ts->clat_percentiles | ts->lat_percentiles,
-                                                              &ts->clat_prio[ddir][i].clat_stat,
-                                                              ts->clat_prio[ddir][i].io_u_plat);
-                               json_object_add_value_object(obj, obj_name, tmp_object);
-                               json_array_add_value_object(array, obj);
-                       }
+                       struct json_object *obj;
+
+                       if (!ts->clat_prio[ddir][i].clat_stat.samples)
+                               continue;
+
+                       obj = json_create_object();
+
+                       json_object_add_value_int(obj, "prioclass",
+                               ioprio_class(ts->clat_prio[ddir][i].ioprio));
+                       json_object_add_value_int(obj, "prio",
+                               ioprio(ts->clat_prio[ddir][i].ioprio));
+
+                       tmp_object = add_ddir_lat_json(ts,
+                                       ts->clat_percentiles | ts->lat_percentiles,
+                                       &ts->clat_prio[ddir][i].clat_stat,
+                                       ts->clat_prio[ddir][i].io_u_plat);
+                       json_object_add_value_object(obj, obj_name, tmp_object);
+                       json_array_add_value_object(array, obj);
                }
        }
 
@@ -1869,6 +1874,7 @@ static struct json_object *show_thread_status_json(struct thread_stat *ts,
                struct json_array *iops, *bw;
                int j, k, l;
                char ss_buf[64];
+               int intervals = ts->ss_dur / (ss_check_interval / 1000L);
 
                snprintf(ss_buf, sizeof(ss_buf), "%s%s:%f%s",
                        ts->ss_state & FIO_SS_IOPS ? "iops" : "bw",
@@ -1902,9 +1908,9 @@ static struct json_object *show_thread_status_json(struct thread_stat *ts,
                if ((ts->ss_state & FIO_SS_ATTAINED) || !(ts->ss_state & FIO_SS_BUFFER_FULL))
                        j = ts->ss_head;
                else
-                       j = ts->ss_head == 0 ? ts->ss_dur - 1 : ts->ss_head - 1;
-               for (l = 0; l < ts->ss_dur; l++) {
-                       k = (j + l) % ts->ss_dur;
+                       j = ts->ss_head == 0 ? intervals - 1 : ts->ss_head - 1;
+               for (l = 0; l < intervals; l++) {
+                       k = (j + l) % intervals;
                        json_array_add_value_int(bw, ts->ss_bw_data[k]);
                        json_array_add_value_int(iops, ts->ss_iops_data[k]);
                }