diff --git a/gclient.c b/gclient.c index 609586380d..b8c681a65d 100644 --- a/gclient.c +++ b/gclient.c @@ -448,7 +448,7 @@ static void gfio_update_all_eta(struct jobs_eta *je) char eta_str[128]; char output[256]; double perc = 0.0; - int i2p = 0; + int i, i2p = 0; gdk_threads_enter(); @@ -483,8 +483,8 @@ static void gfio_update_all_eta(struct jobs_eta *je) entry_set_int_value(ui->eta.jobs, je->nr_running); if (je->eta_sec != INT_MAX && je->nr_running) { - char *iops_str[2]; - char *rate_str[2]; + char *iops_str[3]; + char *rate_str[3]; if ((!je->eta_sec && !eta_good) || je->nr_ramp == je->nr_running) strcpy(output, "-.-% done"); @@ -496,24 +496,30 @@ static void gfio_update_all_eta(struct jobs_eta *je) rate_str[0] = num2str(je->rate[0], 5, 10, i2p); rate_str[1] = num2str(je->rate[1], 5, 10, i2p); + rate_str[2] = num2str(je->rate[2], 5, 10, i2p); iops_str[0] = num2str(je->iops[0], 4, 1, 0); iops_str[1] = num2str(je->iops[1], 4, 1, 0); + iops_str[2] = num2str(je->iops[2], 4, 1, 0); gtk_entry_set_text(GTK_ENTRY(ui->eta.read_bw), rate_str[0]); gtk_entry_set_text(GTK_ENTRY(ui->eta.read_iops), iops_str[0]); gtk_entry_set_text(GTK_ENTRY(ui->eta.write_bw), rate_str[1]); gtk_entry_set_text(GTK_ENTRY(ui->eta.write_iops), iops_str[1]); + gtk_entry_set_text(GTK_ENTRY(ui->eta.trim_bw), rate_str[2]); + gtk_entry_set_text(GTK_ENTRY(ui->eta.trim_iops), iops_str[2]); graph_add_xy_data(ui->graphs.iops_graph, ui->graphs.read_iops, je->elapsed_sec, je->iops[0], iops_str[0]); graph_add_xy_data(ui->graphs.iops_graph, ui->graphs.write_iops, je->elapsed_sec, je->iops[1], iops_str[1]); + graph_add_xy_data(ui->graphs.iops_graph, ui->graphs.trim_iops, je->elapsed_sec, je->iops[2], iops_str[2]); graph_add_xy_data(ui->graphs.bandwidth_graph, ui->graphs.read_bw, je->elapsed_sec, je->rate[0], rate_str[0]); graph_add_xy_data(ui->graphs.bandwidth_graph, ui->graphs.write_bw, je->elapsed_sec, je->rate[1], rate_str[1]); + graph_add_xy_data(ui->graphs.bandwidth_graph, ui->graphs.trim_bw, je->elapsed_sec, je->rate[2], rate_str[2]); - free(rate_str[0]); - free(rate_str[1]); - free(iops_str[0]); - free(iops_str[1]); + for (i = 0; i < DDIR_RWDIR_CNT; i++) { + free(rate_str[i]); + free(iops_str[i]); + } } if (eta_str[0]) { @@ -1170,7 +1176,7 @@ 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[2] = { "Read", "Write" }; + const char *ddir_label[3] = { "Read", "Write", "Trim" }; GtkWidget *frame, *label, *box, *vbox, *main_vbox; unsigned long min[3], max[3], runt; unsigned long long bw, iops; @@ -1289,6 +1295,7 @@ static void __gfio_display_end_results(GtkWidget *win, struct gfio_client *gc, struct group_run_stats *rs) { GtkWidget *box, *vbox, *entry, *scroll; + int i; scroll = gtk_scrolled_window_new(NULL, NULL); gtk_container_set_border_width(GTK_CONTAINER(scroll), 5); @@ -1318,10 +1325,10 @@ static void __gfio_display_end_results(GtkWidget *win, struct gfio_client *gc, entry = new_info_entry_in_frame(box, "PID"); entry_set_int_value(entry, ts->pid); - if (ts->io_bytes[DDIR_READ]) - gfio_show_ddir_status(gc, vbox, rs, ts, DDIR_READ); - if (ts->io_bytes[DDIR_WRITE]) - gfio_show_ddir_status(gc, vbox, rs, ts, DDIR_WRITE); + for (i = 0; i < DDIR_RWDIR_CNT; i++) { + if (ts->io_bytes[i]) + gfio_show_ddir_status(gc, vbox, rs, ts, i); + } gfio_show_latency_buckets(gc, vbox, ts); gfio_show_cpu_usage(vbox, ts); diff --git a/gclient.h b/gclient.h index 56136bec5e..40383652c4 100644 --- a/gclient.h +++ b/gclient.h @@ -11,8 +11,8 @@ extern void gfio_display_end_results(struct gfio_client *); #define GFIO_WRITE_R 1.00 #define GFIO_WRITE_G 0.00 #define GFIO_WRITE_B 0.00 -#define GFIO_IOPS_R 0.24 -#define GFIO_IOPS_G 0.18 -#define GFIO_IOPS_B 0.52 +#define GFIO_TRIM_R 0.24 +#define GFIO_TRIM_G 0.18 +#define GFIO_TRIM_B 0.52 #endif diff --git a/gfio.c b/gfio.c index e44a599e41..95228326d8 100644 --- a/gfio.c +++ b/gfio.c @@ -88,7 +88,7 @@ static void setup_iops_graph(struct gfio_graphs *gg) gg->trim_iops = graph_add_label(g, "Trim IOPS"); graph_set_color(g, gg->read_iops, GFIO_READ_R, GFIO_READ_G, GFIO_READ_B); graph_set_color(g, gg->write_iops, GFIO_WRITE_R, GFIO_WRITE_G, GFIO_WRITE_B); - graph_set_color(g, gg->trim_iops, GFIO_IOPS_R, GFIO_IOPS_G, GFIO_IOPS_B); + graph_set_color(g, gg->trim_iops, GFIO_TRIM_R, GFIO_TRIM_G, GFIO_TRIM_B); line_graph_set_data_count_limit(g, gfio_graph_limit); graph_add_extra_space(g, 0.0, 0.0, 0.0, 0.0); graph_set_graph_all_zeroes(g, 0); @@ -107,7 +107,7 @@ static void setup_bandwidth_graph(struct gfio_graphs *gg) gg->trim_bw = graph_add_label(g, "Trim Bandwidth"); graph_set_color(g, gg->read_bw, GFIO_READ_R, GFIO_READ_G, GFIO_READ_B); graph_set_color(g, gg->write_bw, GFIO_WRITE_R, GFIO_WRITE_G, GFIO_WRITE_B); - graph_set_color(g, gg->trim_bw, GFIO_IOPS_R, GFIO_IOPS_G, GFIO_IOPS_B); + graph_set_color(g, gg->trim_bw, GFIO_TRIM_R, GFIO_TRIM_G, GFIO_TRIM_B); graph_set_base_offset(g, 1); line_graph_set_data_count_limit(g, 100); graph_add_extra_space(g, 0.0, 0.0, 0.0, 0.0); @@ -1346,24 +1346,10 @@ static void combo_entry_destroy(GtkWidget *widget, gpointer data) multitext_free(&ge->eta.iodepth); } -static void fill_color_from_rgb(GdkColor *c, gfloat r, gfloat g, gfloat b) -{ - gint R, G, B; - gchar tmp[8]; - - memset(c, 0, sizeof(*c)); - R = r * 255; - G = g * 255; - B = b * 255; - snprintf(tmp, sizeof(tmp), "#%02x%02x%02x", R, G, B); - gdk_color_parse(tmp, c); -} - static GtkWidget *new_client_page(struct gui_entry *ge) { GtkWidget *main_vbox, *probe, *probe_frame, *probe_box; GtkWidget *scrolled_window, *bottom_align, *top_align, *top_vbox; - GdkColor color; main_vbox = gtk_vbox_new(FALSE, 3); @@ -1399,24 +1385,12 @@ static GtkWidget *new_client_page(struct gui_entry *ge) probe_box = gtk_hbox_new(FALSE, 3); gtk_box_pack_start(GTK_BOX(probe_frame), probe_box, FALSE, FALSE, 3); - ge->eta.read_bw = new_info_entry_in_frame(probe_box, "Read BW"); - ge->eta.read_iops = new_info_entry_in_frame(probe_box, "IOPS"); - ge->eta.write_bw = new_info_entry_in_frame(probe_box, "Write BW"); - ge->eta.write_iops = new_info_entry_in_frame(probe_box, "IOPS"); - ge->eta.trim_bw = new_info_entry_in_frame(probe_box, "Trim BW"); - ge->eta.trim_iops = new_info_entry_in_frame(probe_box, "IOPS"); - - fill_color_from_rgb(&color, GFIO_READ_R, GFIO_READ_G, GFIO_READ_B); - gtk_widget_modify_text(ge->eta.read_bw, GTK_STATE_NORMAL, &color); - gtk_widget_modify_text(ge->eta.read_iops, GTK_STATE_NORMAL, &color); - - fill_color_from_rgb(&color, GFIO_WRITE_R, GFIO_WRITE_G, GFIO_WRITE_B); - gtk_widget_modify_text(ge->eta.write_bw, GTK_STATE_NORMAL, &color); - gtk_widget_modify_text(ge->eta.write_iops, GTK_STATE_NORMAL, &color); - - fill_color_from_rgb(&color, GFIO_IOPS_R, GFIO_IOPS_G, GFIO_IOPS_B); - gtk_widget_modify_text(ge->eta.trim_bw, GTK_STATE_NORMAL, &color); - gtk_widget_modify_text(ge->eta.trim_iops, GTK_STATE_NORMAL, &color); + ge->eta.read_bw = new_info_entry_in_frame_rgb(probe_box, "Read BW", GFIO_READ_R, GFIO_READ_G, GFIO_READ_B); + ge->eta.read_iops = new_info_entry_in_frame_rgb(probe_box, "IOPS", GFIO_READ_R, GFIO_READ_G, GFIO_READ_B); + ge->eta.write_bw = new_info_entry_in_frame_rgb(probe_box, "Write BW", GFIO_WRITE_R, GFIO_WRITE_G, GFIO_WRITE_B); + ge->eta.write_iops = new_info_entry_in_frame_rgb(probe_box, "IOPS", GFIO_WRITE_R, GFIO_WRITE_G, GFIO_WRITE_B); + ge->eta.trim_bw = new_info_entry_in_frame_rgb(probe_box, "Trim BW", GFIO_TRIM_R, GFIO_TRIM_G, GFIO_TRIM_B); + ge->eta.trim_iops = new_info_entry_in_frame_rgb(probe_box, "IOPS", GFIO_TRIM_R, GFIO_TRIM_G, GFIO_TRIM_B); /* * Only add this if we have a commit rate @@ -1499,13 +1473,12 @@ static GtkWidget *new_main_page(struct gui *ui) probe_box = gtk_hbox_new(FALSE, 3); gtk_box_pack_start(GTK_BOX(probe_frame), probe_box, FALSE, FALSE, 3); ui->eta.jobs = new_info_entry_in_frame(probe_box, "Running"); - ui->eta.read_bw = new_info_entry_in_frame(probe_box, "Read BW"); - ui->eta.read_iops = new_info_entry_in_frame(probe_box, "IOPS"); - ui->eta.write_bw = new_info_entry_in_frame(probe_box, "Write BW"); - ui->eta.write_iops = new_info_entry_in_frame(probe_box, "IOPS"); - ui->eta.trim_bw = new_info_entry_in_frame(probe_box, "Trim BW"); - ui->eta.trim_iops = new_info_entry_in_frame(probe_box, "IOPS"); - + ui->eta.read_bw = new_info_entry_in_frame_rgb(probe_box, "Read BW", GFIO_READ_R, GFIO_READ_G, GFIO_READ_B); + ui->eta.read_iops = new_info_entry_in_frame_rgb(probe_box, "IOPS", GFIO_READ_R, GFIO_READ_G, GFIO_READ_B); + ui->eta.write_bw = new_info_entry_in_frame_rgb(probe_box, "Write BW", GFIO_WRITE_R, GFIO_WRITE_G, GFIO_WRITE_B); + ui->eta.write_iops = new_info_entry_in_frame_rgb(probe_box, "IOPS", GFIO_WRITE_R, GFIO_WRITE_G, GFIO_WRITE_B); + ui->eta.trim_bw = new_info_entry_in_frame_rgb(probe_box, "Trim BW", GFIO_TRIM_R, GFIO_TRIM_G, GFIO_TRIM_B); + ui->eta.trim_iops = new_info_entry_in_frame_rgb(probe_box, "IOPS", GFIO_TRIM_R, GFIO_TRIM_G, GFIO_TRIM_B); /* * Only add this if we have a commit rate diff --git a/ghelpers.c b/ghelpers.c index d9380a2a0c..7acf588ab3 100644 --- a/ghelpers.c +++ b/ghelpers.c @@ -30,6 +30,31 @@ GtkWidget *new_info_entry_in_frame(GtkWidget *box, const char *label) return entry; } +static void fill_color_from_rgb(GdkColor *c, gfloat r, gfloat g, gfloat b) +{ + gint R, G, B; + gchar tmp[8]; + + memset(c, 0, sizeof(*c)); + R = r * 255; + G = g * 255; + B = b * 255; + snprintf(tmp, sizeof(tmp), "#%02x%02x%02x", R, G, B); + gdk_color_parse(tmp, c); +} + +GtkWidget *new_info_entry_in_frame_rgb(GtkWidget *box, const char *label, + gfloat r, gfloat g, gfloat b) +{ + GtkWidget *entry; + GdkColor c; + + entry = new_info_entry_in_frame(box, label); + fill_color_from_rgb(&c, r, g, b); + gtk_widget_modify_text(entry, GTK_STATE_NORMAL, &c); + return entry; +} + GtkWidget *new_info_label_in_frame(GtkWidget *box, const char *label) { GtkWidget *label_widget; diff --git a/ghelpers.h b/ghelpers.h index f5aabec49e..39a994b9ff 100644 --- a/ghelpers.h +++ b/ghelpers.h @@ -4,6 +4,8 @@ GtkWidget *new_combo_entry_in_frame(GtkWidget *box, const char *label); GtkWidget *new_info_entry_in_frame(GtkWidget *box, const char *label); GtkWidget *new_info_label_in_frame(GtkWidget *box, const char *label); +GtkWidget *new_info_entry_in_frame_rgb(GtkWidget *box, const char *label, + gfloat r, gfloat g, gfloat b); GtkWidget *create_spinbutton(GtkWidget *hbox, double min, double max, double defval); void label_set_int_value(GtkWidget *entry, unsigned int val); void entry_set_int_value(GtkWidget *entry, unsigned int val);