gfio: add and colorize graphs on main page, too
authorJens Axboe <axboe@kernel.dk>
Tue, 25 Sep 2012 12:39:36 +0000 (14:39 +0200)
committerJens Axboe <axboe@kernel.dk>
Tue, 25 Sep 2012 12:39:36 +0000 (14:39 +0200)
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 <axboe@kernel.dk>
gclient.c
gclient.h
gfio.c
ghelpers.c
ghelpers.h

index 609586380da5e613a8d3745615847eeb8557a838..b8c681a65d9dc4703f4b409dc9e2bc53502b45df 100644 (file)
--- 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);
index 56136bec5e96204708904fcaabe5c90c0fe58ddc..40383652c4ee82b5e4c004414b23069e7d3dd6a4 100644 (file)
--- 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 e44a599e416e844ff8abdb12d97f08341a2b311d..95228326d8cb3d4c584a96302aac05c93f910792 100644 (file)
--- 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
index d9380a2a0c2a4323c144a5e4c5089c4f0347254f..7acf588ab311ef9bb02a73746b40e74594e0ec81 100644 (file)
@@ -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;
index f5aabec49ec798093750c13186a357d9714f9a20..39a994b9ff1233e4c04a64d127d7189cb58620b9 100644 (file)
@@ -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);