X-Git-Url: https://git.kernel.dk/?p=fio.git;a=blobdiff_plain;f=gfio.c;h=c67e49242e0493e0e88f569a6c6ff80545c5a953;hp=58faaaf9e29321c5332f54346b20f573b0f5edab;hb=99d633af3611958ea6217f270677d0a657e4dddc;hpb=d3b70f32bd8aa8c1ed1fff25c9c08b20370e0847 diff --git a/gfio.c b/gfio.c index 58faaaf9..c67e4924 100644 --- a/gfio.c +++ b/gfio.c @@ -81,6 +81,7 @@ struct multitext_widget { struct eta_widget { GtkWidget *names; struct multitext_widget iotype; + struct multitext_widget bs; struct multitext_widget ioengine; struct multitext_widget iodepth; GtkWidget *jobs; @@ -189,7 +190,6 @@ struct gfio_client { struct gui_entry *ge; struct fio_client *client; GtkWidget *err_entry; - unsigned int job_added; struct thread_options o; struct end_results *results; @@ -301,6 +301,7 @@ static void clear_ge_ui_info(struct gui_entry *ge) gtk_entry_set_text(GTK_ENTRY(ge->eta.name), ""); #endif multitext_update_entry(&ge->eta.iotype, 0, ""); + multitext_update_entry(&ge->eta.bs, 0, ""); multitext_update_entry(&ge->eta.ioengine, 0, ""); multitext_update_entry(&ge->eta.iodepth, 0, ""); gtk_entry_set_text(GTK_ENTRY(ge->eta.jobs), ""); @@ -1290,25 +1291,51 @@ static void disk_util_destroy(GtkWidget *w, gpointer data) gtk_widget_destroy(w); } +static GtkWidget *get_scrolled_window(gint border_width) +{ + GtkWidget *scroll; + + scroll = gtk_scrolled_window_new(NULL, NULL); + gtk_container_set_border_width(GTK_CONTAINER(scroll), border_width); + gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scroll), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); + + return scroll; +} + +static GtkWidget *gfio_disk_util_get_vbox(struct gui_entry *ge) +{ + GtkWidget *vbox, *box, *scroll, *res_notebook; + + if (ge->disk_util_vbox) + return ge->disk_util_vbox; + + scroll = get_scrolled_window(5); + vbox = gtk_vbox_new(FALSE, 3); + box = gtk_hbox_new(FALSE, 0); + gtk_box_pack_start(GTK_BOX(vbox), box, TRUE, FALSE, 5); + + gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(scroll), vbox); + res_notebook = get_results_window(ge); + + gtk_notebook_append_page(GTK_NOTEBOOK(res_notebook), scroll, gtk_label_new("Disk utilization")); + ge->disk_util_vbox = box; + g_signal_connect(vbox, "destroy", G_CALLBACK(disk_util_destroy), ge); + + return ge->disk_util_vbox; +} + static int __gfio_disk_util_show(GtkWidget *res_notebook, struct gfio_client *gc, struct cmd_du_pdu *p) { - GtkWidget *box, *frame, *entry, *vbox; + GtkWidget *box, *frame, *entry, *vbox, *util_vbox; struct gui_entry *ge = gc->ge; double util; char tmp[16]; - res_notebook = get_results_window(ge); - - if (!ge->disk_util_vbox) { - vbox = gtk_vbox_new(FALSE, 3); - gtk_notebook_append_page(GTK_NOTEBOOK(res_notebook), vbox, gtk_label_new("Disk utilization")); - ge->disk_util_vbox = vbox; - g_signal_connect(vbox, "destroy", G_CALLBACK(disk_util_destroy), ge); - } + util_vbox = gfio_disk_util_get_vbox(ge); vbox = gtk_vbox_new(FALSE, 3); - gtk_container_add(GTK_CONTAINER(ge->disk_util_vbox), vbox); + gtk_container_add(GTK_CONTAINER(util_vbox), vbox); frame = gtk_frame_new((char *) p->dus.name); gtk_box_pack_start(GTK_BOX(vbox), frame, FALSE, FALSE, 2); @@ -1463,11 +1490,15 @@ static void gfio_display_ts(struct fio_client *client, struct thread_stat *ts, struct group_run_stats *rs) { struct gfio_client *gc = client->client_data; + struct gui_entry *ge = gc->ge; gfio_add_end_results(gc, ts, rs); gdk_threads_enter(); - gfio_display_end_results(gc); + if (ge->results_window) + __gfio_display_end_results(ge->results_notebook, gc, ts, rs); + else + gfio_display_end_results(gc); gdk_threads_leave(); } @@ -1503,6 +1534,7 @@ static void gfio_disk_util_op(struct fio_client *client, struct fio_net_cmd *cmd { struct cmd_du_pdu *p = (struct cmd_du_pdu *) cmd->payload; struct gfio_client *gc = client->client_data; + struct gui_entry *ge = gc->ge; unsigned int nr = gc->nr_du; gc->du = realloc(gc->du, (nr + 1) * sizeof(struct cmd_du_pdu)); @@ -1510,7 +1542,10 @@ static void gfio_disk_util_op(struct fio_client *client, struct fio_net_cmd *cmd gc->nr_du++; gdk_threads_enter(); - gfio_disk_util_show(gc); + if (ge->results_window) + __gfio_disk_util_show(ge->results_notebook, gc, p); + else + gfio_disk_util_show(gc); gdk_threads_leave(); } @@ -1860,7 +1895,8 @@ static void gfio_add_job_op(struct fio_client *client, struct fio_net_cmd *cmd) struct gfio_client *gc = client->client_data; struct thread_options *o = &gc->o; struct gui_entry *ge = gc->ge; - char tmp[8]; + char *c1, *c2, *c3, *c4; + char tmp[80]; p->thread_number = le32_to_cpu(p->thread_number); p->groupid = le32_to_cpu(p->groupid); @@ -1874,17 +1910,28 @@ static void gfio_add_job_op(struct fio_client *client, struct fio_net_cmd *cmd) gtk_combo_box_set_active(GTK_COMBO_BOX(ge->eta.names), 0); multitext_add_entry(&ge->eta.iotype, ddir_str(o->td_ddir)); + + c1 = fio_uint_to_kmg(o->min_bs[DDIR_READ]); + c2 = fio_uint_to_kmg(o->max_bs[DDIR_WRITE]); + c3 = fio_uint_to_kmg(o->min_bs[DDIR_READ]); + c4 = fio_uint_to_kmg(o->max_bs[DDIR_WRITE]); + sprintf(tmp, "%s-%s/%s-%s", c1, c2, c3, c4); + free(c1); + free(c2); + free(c3); + free(c4); + multitext_add_entry(&ge->eta.bs, tmp); + multitext_add_entry(&ge->eta.ioengine, (const char *) o->ioengine); sprintf(tmp, "%u", o->iodepth); multitext_add_entry(&ge->eta.iodepth, tmp); multitext_set_entry(&ge->eta.iotype, 0); + multitext_set_entry(&ge->eta.bs, 0); multitext_set_entry(&ge->eta.ioengine, 0); multitext_set_entry(&ge->eta.iodepth, 0); - gc->job_added++; - gfio_set_state(ge, GE_STATE_JOB_SENT); gdk_threads_leave(); @@ -2923,6 +2970,7 @@ static void combo_entry_changed(GtkComboBox *box, gpointer data) index = gtk_combo_box_get_active(box); multitext_set_entry(&ge->eta.iotype, index); + multitext_set_entry(&ge->eta.bs, index); multitext_set_entry(&ge->eta.ioengine, index); multitext_set_entry(&ge->eta.iodepth, index); } @@ -2932,6 +2980,7 @@ static void combo_entry_destroy(GtkWidget *widget, gpointer data) struct gui_entry *ge = (struct gui_entry *) data; multitext_free(&ge->eta.iotype); + multitext_free(&ge->eta.bs); multitext_free(&ge->eta.ioengine); multitext_free(&ge->eta.iodepth); } @@ -2967,6 +3016,7 @@ static GtkWidget *new_client_page(struct gui_entry *ge) g_signal_connect(ge->eta.names, "changed", G_CALLBACK(combo_entry_changed), ge); g_signal_connect(ge->eta.names, "destroy", G_CALLBACK(combo_entry_destroy), ge); ge->eta.iotype.entry = new_info_entry_in_frame(probe_box, "IO"); + ge->eta.bs.entry = new_info_entry_in_frame(probe_box, "Blocksize (Read/Write)"); ge->eta.ioengine.entry = new_info_entry_in_frame(probe_box, "IO Engine"); ge->eta.iodepth.entry = new_info_entry_in_frame(probe_box, "IO Depth"); ge->eta.jobs = new_info_entry_in_frame(probe_box, "Jobs");