From b78ca651a7254f01f5931ff49ca2206dcb42a056 Mon Sep 17 00:00:00 2001 From: Jens Axboe Date: Tue, 25 Sep 2012 14:39:36 +0200 Subject: [PATCH] gfio: add and colorize graphs on main page, too The main UI tab had broken support for trim, fix that up. While doing that, also ensure that we color code the text fields like it was done for the per-job tabs. Signed-off-by: Jens Axboe --- gclient.c | 31 ++++++++++++++++++------------ gclient.h | 6 +++--- gfio.c | 55 ++++++++++++++---------------------------------------- ghelpers.c | 25 +++++++++++++++++++++++++ ghelpers.h | 2 ++ 5 files changed, 63 insertions(+), 56 deletions(-) diff --git a/gclient.c b/gclient.c index 60958638..b8c681a6 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 56136bec..40383652 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 e44a599e..95228326 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 d9380a2a..7acf588a 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 f5aabec4..39a994b9 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); -- 2.25.1