#define GFIO_CLAT 1
#define GFIO_SLAT 2
#define GFIO_LAT 4
+#define GFIO_HILAT 8
+#define GFIO_LOLAT 16
static void gfio_show_ddir_status(struct gfio_client *gc, GtkWidget *mbox,
struct group_run_stats *rs,
struct thread_stat *ts, int ddir)
{
const char *ddir_label[3] = { "Read", "Write", "Trim" };
+ const char *hilat, *lolat;
GtkWidget *frame, *label, *box, *vbox, *main_vbox;
- unsigned long long min[3], max[3];
+ unsigned long long min[5], max[5];
unsigned long runt;
unsigned long long bw, iops;
unsigned int flags = 0;
- double mean[3], dev[3];
+ double mean[5], dev[5];
char *io_p, *io_palt, *bw_p, *bw_palt, *iops_p;
char tmp[128];
int i2p;
flags |= GFIO_CLAT;
if (calc_lat(&ts->lat_stat[ddir], &min[2], &max[2], &mean[2], &dev[2]))
flags |= GFIO_LAT;
+ if (calc_lat(&ts->clat_high_prio_stat[ddir], &min[3], &max[3], &mean[3], &dev[3])) {
+ flags |= GFIO_HILAT;
+ if (calc_lat(&ts->clat_low_prio_stat[ddir], &min[4], &max[4], &mean[4], &dev[4]))
+ flags |= GFIO_LOLAT;
+ /* we only want to print low priority statistics if other IOs were
+ * submitted with the priority bit set
+ */
+ }
if (flags) {
frame = gtk_frame_new("Latency");
vbox = gtk_vbox_new(FALSE, 3);
gtk_container_add(GTK_CONTAINER(frame), vbox);
+ if (ts->lat_percentiles) {
+ hilat = "High priority total latency";
+ lolat = "Low priority total latency";
+ } else {
+ hilat = "High priority completion latency";
+ lolat = "Low priority completion latency";
+ }
+
if (flags & GFIO_SLAT)
gfio_show_lat(vbox, "Submission latency", min[0], max[0], mean[0], dev[0]);
if (flags & GFIO_CLAT)
gfio_show_lat(vbox, "Completion latency", min[1], max[1], mean[1], dev[1]);
if (flags & GFIO_LAT)
gfio_show_lat(vbox, "Total latency", min[2], max[2], mean[2], dev[2]);
+ if (flags & GFIO_HILAT)
+ gfio_show_lat(vbox, hilat, min[3], max[3], mean[3], dev[3]);
+ if (flags & GFIO_LOLAT)
+ gfio_show_lat(vbox, lolat, min[4], max[4], mean[4], dev[4]);
}
if (ts->slat_percentiles && flags & GFIO_SLAT)
ts->io_u_plat[FIO_SLAT][ddir],
ts->slat_stat[ddir].samples,
"Submission");
- if (ts->clat_percentiles && flags & GFIO_CLAT)
+ if (ts->clat_percentiles && flags & GFIO_CLAT) {
gfio_show_clat_percentiles(gc, main_vbox, ts, ddir,
ts->io_u_plat[FIO_CLAT][ddir],
ts->clat_stat[ddir].samples,
"Completion");
- if (ts->lat_percentiles && flags & GFIO_LAT)
+ if (!ts->lat_percentiles) {
+ if (flags & GFIO_HILAT)
+ gfio_show_clat_percentiles(gc, main_vbox, ts, ddir,
+ ts->io_u_plat_high_prio[ddir],
+ ts->clat_high_prio_stat[ddir].samples,
+ "High priority completion");
+ if (flags & GFIO_LOLAT)
+ gfio_show_clat_percentiles(gc, main_vbox, ts, ddir,
+ ts->io_u_plat_low_prio[ddir],
+ ts->clat_low_prio_stat[ddir].samples,
+ "Low priority completion");
+ }
+ }
+ if (ts->lat_percentiles && flags & GFIO_LAT) {
gfio_show_clat_percentiles(gc, main_vbox, ts, ddir,
ts->io_u_plat[FIO_LAT][ddir],
ts->lat_stat[ddir].samples,
"Total");
+ if (flags & GFIO_HILAT)
+ gfio_show_clat_percentiles(gc, main_vbox, ts, ddir,
+ ts->io_u_plat_high_prio[ddir],
+ ts->clat_high_prio_stat[ddir].samples,
+ "High priority total");
+ if (flags & GFIO_LOLAT)
+ gfio_show_clat_percentiles(gc, main_vbox, ts, ddir,
+ ts->io_u_plat_low_prio[ddir],
+ ts->clat_low_prio_stat[ddir].samples,
+ "Low priority total");
+ }
free(io_p);
free(bw_p);