The following changes since commit dbc542d442b81ddc58939be96a1c89e9953b9698: gfio: color code the iops/bw fields (2012-09-24 19:54:07 +0200) are available in the git repository at: git://git.kernel.dk/fio.git gfio Dmitry Monakhov (1): backend: fix data direction flow check Jens Axboe (5): gfio: kill debug printf() gfio: color parse stack removal gfio: add and colorize graphs on main page, too gfio: make 'light yellow' color a little lighter Merge branch 'master' into gfio backend.c | 2 +- gclient.c | 31 +++++++++++++++++++------------ gclient.h | 6 +++--- gfio.c | 58 +++++++++++++++------------------------------------------- ghelpers.c | 25 +++++++++++++++++++++++++ ghelpers.h | 2 ++ 6 files changed, 65 insertions(+), 59 deletions(-) --- Diff of recent changes: diff --git a/backend.c b/backend.c index 6f40038..586eac8 100644 --- a/backend.c +++ b/backend.c @@ -812,7 +812,7 @@ static int init_io_u(struct thread_data *td) td->orig_buffer_size = (unsigned long long) max_bs * (unsigned long long) max_units; - if ((td->io_ops->flags & FIO_NOIO) || !td_rw(td)) + if ((td->io_ops->flags & FIO_NOIO) || !(td_read(td) || td_write(td))) data_xfer = 0; if (td->o.mem_type == MEM_SHMHUGE || td->o.mem_type == MEM_MMAPHUGE) { diff --git a/gclient.c b/gclient.c index 6095863..b8c681a 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 56136be..4038365 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 89fc3bf..3138941 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,25 +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[32]; - - memset(c, 0, sizeof(*c)); - R = r * 255; - G = g * 255; - B = b * 255; - sprintf(tmp, "#%02x%02x%02x", R, G, B); - printf("%s\n", tmp); - 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); @@ -1400,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 @@ -1500,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 @@ -1706,7 +1678,7 @@ static void init_ui(int *argc, char **argv[], struct gui *ui) settings = gtk_settings_get_default(); gtk_settings_set_long_property(settings, "gtk_tooltip_timeout", 10, "gfio setting"); g_type_init(); - gdk_color_parse("#ffffee", &gfio_color_lightyellow); + gdk_color_parse("#fffff4", &gfio_color_lightyellow); gdk_color_parse("white", &gfio_color_white); ui->window = gtk_window_new(GTK_WINDOW_TOPLEVEL); diff --git a/ghelpers.c b/ghelpers.c index d9380a2..7acf588 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 f5aabec..39a994b 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); -- To unsubscribe from this list: send the line "unsubscribe fio" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html