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 6095863..b8c681a 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 56136be..4038365 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 e44a599..9522832 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 d9380a2..7acf588 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 f5aabec..39a994b 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);