11252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe#include <malloc.h> 21252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe#include <string.h> 31252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 41252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe#include <glib.h> 51252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe#include <cairo.h> 61252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe#include <gtk/gtk.h> 71252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 81252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe#include "fio.h" 91252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe#include "gfio.h" 101252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe#include "ghelpers.h" 111252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe#include "goptions.h" 121252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe#include "gerror.h" 131252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe#include "graph.h" 141252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe#include "gclient.h" 15bf3f7027b4529fceabad46a3138cd37c9771f080Stephen M. Cameron#include "printing.h" 161252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 171252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboestatic void gfio_display_ts(struct fio_client *client, struct thread_stat *ts, 181252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe struct group_run_stats *rs); 191252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 201252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboestatic gboolean results_window_delete(GtkWidget *w, gpointer data) 211252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe{ 221252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe struct gui_entry *ge = (struct gui_entry *) data; 231252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 241252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe gtk_widget_destroy(w); 251252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe ge->results_window = NULL; 261252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe ge->results_notebook = NULL; 271252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe return TRUE; 281252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe} 291252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 301252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboestatic void results_close(GtkWidget *w, gpointer *data) 311252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe{ 321252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe struct gui_entry *ge = (struct gui_entry *) data; 331252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 341252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe gtk_widget_destroy(ge->results_window); 351252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe} 361252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 37bf3f7027b4529fceabad46a3138cd37c9771f080Stephen M. Cameronstatic void results_print(GtkWidget *w, gpointer *data) 38bf3f7027b4529fceabad46a3138cd37c9771f080Stephen M. Cameron{ 39bf3f7027b4529fceabad46a3138cd37c9771f080Stephen M. Cameron struct gui_entry *ge = (struct gui_entry *) data; 40bf3f7027b4529fceabad46a3138cd37c9771f080Stephen M. Cameron 41bf3f7027b4529fceabad46a3138cd37c9771f080Stephen M. Cameron gfio_print_results(ge); 42bf3f7027b4529fceabad46a3138cd37c9771f080Stephen M. Cameron} 43bf3f7027b4529fceabad46a3138cd37c9771f080Stephen M. Cameron 441252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboestatic GtkActionEntry results_menu_items[] = { 451252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe { "FileMenuAction", GTK_STOCK_FILE, "File", NULL, NULL, NULL}, 461252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe { "GraphMenuAction", GTK_STOCK_FILE, "Graph", NULL, NULL, NULL}, 47bf3f7027b4529fceabad46a3138cd37c9771f080Stephen M. Cameron { "PrintFile", GTK_STOCK_PRINT, "Print", "<Control>P", NULL, G_CALLBACK(results_print) }, 481252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe { "CloseFile", GTK_STOCK_CLOSE, "Close", "<Control>W", NULL, G_CALLBACK(results_close) }, 491252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe}; 501252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboestatic gint results_nmenu_items = sizeof(results_menu_items) / sizeof(results_menu_items[0]); 511252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 521252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboestatic const gchar *results_ui_string = " \ 531252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe <ui> \ 541252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe <menubar name=\"MainMenu\"> \ 551252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe <menu name=\"FileMenu\" action=\"FileMenuAction\"> \ 56bf3f7027b4529fceabad46a3138cd37c9771f080Stephen M. Cameron <menuitem name=\"Print\" action=\"PrintFile\" /> \ 571252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe <menuitem name=\"Close\" action=\"CloseFile\" /> \ 581252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe </menu> \ 591252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe <menu name=\"GraphMenu\" action=\"GraphMenuAction\"> \ 601252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe </menu>\ 611252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe </menubar> \ 621252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe </ui> \ 631252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe"; 641252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 651252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboestatic GtkWidget *get_results_menubar(GtkWidget *window, struct gui_entry *ge) 661252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe{ 671252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe GtkActionGroup *action_group; 681252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe GtkWidget *widget; 691252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe GError *error = 0; 701252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 711252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe ge->results_uimanager = gtk_ui_manager_new(); 721252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 731252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe action_group = gtk_action_group_new("ResultsMenu"); 741252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe gtk_action_group_add_actions(action_group, results_menu_items, results_nmenu_items, ge); 751252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 761252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe gtk_ui_manager_insert_action_group(ge->results_uimanager, action_group, 0); 771252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe gtk_ui_manager_add_ui_from_string(GTK_UI_MANAGER(ge->results_uimanager), results_ui_string, -1, &error); 781252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 791252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe gtk_window_add_accel_group(GTK_WINDOW(window), gtk_ui_manager_get_accel_group(ge->results_uimanager)); 801252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 811252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe widget = gtk_ui_manager_get_widget(ge->results_uimanager, "/MainMenu"); 821252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe return widget; 831252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe} 841252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 851252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboestatic GtkWidget *get_results_window(struct gui_entry *ge) 861252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe{ 871252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe GtkWidget *win, *notebook, *vbox; 881252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 891252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe if (ge->results_window) 901252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe return ge->results_notebook; 911252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 921252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe win = gtk_window_new(GTK_WINDOW_TOPLEVEL); 931252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe gtk_window_set_title(GTK_WINDOW(win), "Results"); 941252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe gtk_window_set_default_size(GTK_WINDOW(win), 1024, 768); 951252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe g_signal_connect(win, "delete-event", G_CALLBACK(results_window_delete), ge); 961252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe g_signal_connect(win, "destroy", G_CALLBACK(results_window_delete), ge); 971252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 981252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe vbox = gtk_vbox_new(FALSE, 0); 991252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe gtk_container_add(GTK_CONTAINER(win), vbox); 1001252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 1011252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe ge->results_menu = get_results_menubar(win, ge); 1021252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe gtk_box_pack_start(GTK_BOX(vbox), ge->results_menu, FALSE, FALSE, 0); 1031252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 1041252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe notebook = gtk_notebook_new(); 1051252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe gtk_notebook_set_scrollable(GTK_NOTEBOOK(notebook), 1); 1061252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe gtk_notebook_popup_enable(GTK_NOTEBOOK(notebook)); 1071252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe gtk_container_add(GTK_CONTAINER(vbox), notebook); 1081252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 1091252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe ge->results_window = win; 1101252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe ge->results_notebook = notebook; 1111252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe return ge->results_notebook; 1121252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe} 1131252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 1141252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboestatic void gfio_text_op(struct fio_client *client, struct fio_net_cmd *cmd) 1151252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe{ 1161252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe struct cmd_text_pdu *p = (struct cmd_text_pdu *) cmd->payload; 1171252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe struct gfio_client *gc = client->client_data; 1181252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe struct gui_entry *ge = gc->ge; 1191252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe struct gui *ui = ge->ui; 1201252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe GtkTreeIter iter; 1211252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe struct tm *tm; 1221252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe time_t sec; 1231252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe char tmp[64], timebuf[80]; 1241252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 1251252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe sec = p->log_sec; 1261252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe tm = localtime(&sec); 1271252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe strftime(tmp, sizeof(tmp), "%Y-%m-%d %H:%M:%S", tm); 1281fae4855d30ae19ef6b681a33821b36c298ab7e1Jens Axboe sprintf(timebuf, "%s.%03ld", tmp, (long) p->log_usec / 1000); 1291252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 1301252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe gdk_threads_enter(); 1311252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 1321252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe gtk_list_store_append(ui->log_model, &iter); 1331252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe gtk_list_store_set(ui->log_model, &iter, 0, timebuf, -1); 1341252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe gtk_list_store_set(ui->log_model, &iter, 1, client->hostname, -1); 1353ad04399c576bb7935b9a7b8c07d5acf373a7bc4Jens Axboe gtk_list_store_set(ui->log_model, &iter, 2, log_get_level(p->level), -1); 1361252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe gtk_list_store_set(ui->log_model, &iter, 3, p->buf, -1); 1371252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 1381252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe if (p->level == FIO_LOG_ERR) 1391252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe gfio_view_log(ui); 1401252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 1411252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe gdk_threads_leave(); 1421252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe} 1431252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 1441252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboestatic void disk_util_destroy(GtkWidget *w, gpointer data) 1451252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe{ 1461252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe struct gui_entry *ge = (struct gui_entry *) data; 1471252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 1481252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe ge->disk_util_vbox = NULL; 1491252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe gtk_widget_destroy(w); 1501252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe} 1511252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 1521252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboestatic GtkWidget *gfio_disk_util_get_vbox(struct gui_entry *ge) 1531252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe{ 1541252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe GtkWidget *vbox, *box, *scroll, *res_notebook; 1551252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 1561252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe if (ge->disk_util_vbox) 1571252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe return ge->disk_util_vbox; 1581252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 1591252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe scroll = get_scrolled_window(5); 1601252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe vbox = gtk_vbox_new(FALSE, 3); 1611252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe box = gtk_hbox_new(FALSE, 0); 1621252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe gtk_box_pack_start(GTK_BOX(vbox), box, FALSE, FALSE, 5); 1631252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 1641252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(scroll), vbox); 1651252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe res_notebook = get_results_window(ge); 1661252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 1671252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe gtk_notebook_append_page(GTK_NOTEBOOK(res_notebook), scroll, gtk_label_new("Disk utilization")); 1681252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe ge->disk_util_vbox = box; 1691252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe g_signal_connect(vbox, "destroy", G_CALLBACK(disk_util_destroy), ge); 1701252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 1711252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe return ge->disk_util_vbox; 1721252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe} 1731252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 1741252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboestatic int __gfio_disk_util_show(GtkWidget *res_notebook, 1751252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe struct gfio_client *gc, struct cmd_du_pdu *p) 1761252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe{ 1771252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe GtkWidget *box, *frame, *entry, *vbox, *util_vbox; 1781252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe struct gui_entry *ge = gc->ge; 1791252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe double util; 1801252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe char tmp[16]; 1811252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 1821252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe util_vbox = gfio_disk_util_get_vbox(ge); 1831252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 1841252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe vbox = gtk_vbox_new(FALSE, 3); 1851252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe gtk_container_add(GTK_CONTAINER(util_vbox), vbox); 1861252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 1871252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe frame = gtk_frame_new((char *) p->dus.name); 1881252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe gtk_box_pack_start(GTK_BOX(vbox), frame, FALSE, FALSE, 2); 1891252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 1901252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe box = gtk_vbox_new(FALSE, 3); 1911252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe gtk_container_add(GTK_CONTAINER(frame), box); 1921252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 1931252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe frame = gtk_frame_new("Read"); 1941252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe gtk_box_pack_start(GTK_BOX(box), frame, FALSE, FALSE, 2); 1951252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe vbox = gtk_hbox_new(TRUE, 3); 1961252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe gtk_container_add(GTK_CONTAINER(frame), vbox); 1971252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe entry = new_info_entry_in_frame(vbox, "IOs"); 19857e2bbcbc3c2b534931d27d41086f5bab0c9c63aDaniel Gollub entry_set_int_value(entry, p->dus.s.ios[0]); 1991252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe entry = new_info_entry_in_frame(vbox, "Merges"); 20057e2bbcbc3c2b534931d27d41086f5bab0c9c63aDaniel Gollub entry_set_int_value(entry, p->dus.s.merges[0]); 2011252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe entry = new_info_entry_in_frame(vbox, "Sectors"); 20257e2bbcbc3c2b534931d27d41086f5bab0c9c63aDaniel Gollub entry_set_int_value(entry, p->dus.s.sectors[0]); 2031252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe entry = new_info_entry_in_frame(vbox, "Ticks"); 20457e2bbcbc3c2b534931d27d41086f5bab0c9c63aDaniel Gollub entry_set_int_value(entry, p->dus.s.ticks[0]); 2051252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 2061252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe frame = gtk_frame_new("Write"); 2071252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe gtk_box_pack_start(GTK_BOX(box), frame, FALSE, FALSE, 2); 2081252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe vbox = gtk_hbox_new(TRUE, 3); 2091252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe gtk_container_add(GTK_CONTAINER(frame), vbox); 2101252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe entry = new_info_entry_in_frame(vbox, "IOs"); 21157e2bbcbc3c2b534931d27d41086f5bab0c9c63aDaniel Gollub entry_set_int_value(entry, p->dus.s.ios[1]); 2121252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe entry = new_info_entry_in_frame(vbox, "Merges"); 21357e2bbcbc3c2b534931d27d41086f5bab0c9c63aDaniel Gollub entry_set_int_value(entry, p->dus.s.merges[1]); 2141252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe entry = new_info_entry_in_frame(vbox, "Sectors"); 21557e2bbcbc3c2b534931d27d41086f5bab0c9c63aDaniel Gollub entry_set_int_value(entry, p->dus.s.sectors[1]); 2161252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe entry = new_info_entry_in_frame(vbox, "Ticks"); 21757e2bbcbc3c2b534931d27d41086f5bab0c9c63aDaniel Gollub entry_set_int_value(entry, p->dus.s.ticks[1]); 2181252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 2191252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe frame = gtk_frame_new("Shared"); 2201252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe gtk_box_pack_start(GTK_BOX(box), frame, FALSE, FALSE, 2); 2211252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe vbox = gtk_hbox_new(TRUE, 3); 2221252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe gtk_container_add(GTK_CONTAINER(frame), vbox); 2231252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe entry = new_info_entry_in_frame(vbox, "IO ticks"); 22457e2bbcbc3c2b534931d27d41086f5bab0c9c63aDaniel Gollub entry_set_int_value(entry, p->dus.s.io_ticks); 2251252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe entry = new_info_entry_in_frame(vbox, "Time in queue"); 22657e2bbcbc3c2b534931d27d41086f5bab0c9c63aDaniel Gollub entry_set_int_value(entry, p->dus.s.time_in_queue); 2271252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 2281252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe util = 0.0; 22957e2bbcbc3c2b534931d27d41086f5bab0c9c63aDaniel Gollub if (p->dus.s.msec) 23057e2bbcbc3c2b534931d27d41086f5bab0c9c63aDaniel Gollub util = (double) 100 * p->dus.s.io_ticks / (double) p->dus.s.msec; 2311252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe if (util > 100.0) 2321252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe util = 100.0; 2331252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 2341252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe sprintf(tmp, "%3.2f%%", util); 2351252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe entry = new_info_entry_in_frame(vbox, "Disk utilization"); 2361252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe gtk_entry_set_text(GTK_ENTRY(entry), tmp); 2371252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 2381252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe gtk_widget_show_all(ge->results_window); 2391252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe return 0; 2401252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe} 2411252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 2421252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboestatic int gfio_disk_util_show(struct gfio_client *gc) 2431252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe{ 2441252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe struct gui_entry *ge = gc->ge; 2451252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe GtkWidget *res_notebook; 2461252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe int i; 2471252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 2481252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe if (!gc->nr_du) 2491252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe return 1; 2501252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 2511252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe res_notebook = get_results_window(ge); 2521252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 2531252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe for (i = 0; i < gc->nr_du; i++) { 2541252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe struct cmd_du_pdu *p = &gc->du[i]; 2551252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 2561252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe __gfio_disk_util_show(res_notebook, gc, p); 2571252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe } 2581252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 2591252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe gtk_widget_show_all(ge->results_window); 2601252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe return 0; 2611252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe} 2621252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 2631252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboestatic void gfio_disk_util_op(struct fio_client *client, struct fio_net_cmd *cmd) 2641252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe{ 2651252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe struct cmd_du_pdu *p = (struct cmd_du_pdu *) cmd->payload; 2661252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe struct gfio_client *gc = client->client_data; 2671252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe struct gui_entry *ge = gc->ge; 2681252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe unsigned int nr = gc->nr_du; 2691252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 2701252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe gc->du = realloc(gc->du, (nr + 1) * sizeof(struct cmd_du_pdu)); 2711252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe memcpy(&gc->du[nr], p, sizeof(*p)); 2721252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe gc->nr_du++; 2731252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 2741252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe gdk_threads_enter(); 2751252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe if (ge->results_window) 2761252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe __gfio_disk_util_show(ge->results_notebook, gc, p); 2771252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe else 2781252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe gfio_disk_util_show(gc); 2791252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe gdk_threads_leave(); 2801252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe} 2811252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 2821252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboeextern int sum_stat_clients; 2831252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboeextern struct thread_stat client_ts; 2841252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboeextern struct group_run_stats client_gs; 2851252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 2861252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboestatic int sum_stat_nr; 2871252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 2881252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboestatic void gfio_thread_status_op(struct fio_client *client, 2891252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe struct fio_net_cmd *cmd) 2901252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe{ 2911252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe struct cmd_ts_pdu *p = (struct cmd_ts_pdu *) cmd->payload; 2921252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 2931252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe gfio_display_ts(client, &p->ts, &p->rs); 2941252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 2951252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe if (sum_stat_clients == 1) 2961252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe return; 2971252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 2981252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe sum_thread_stats(&client_ts, &p->ts, sum_stat_nr); 2991252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe sum_group_stats(&client_gs, &p->rs); 3001252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 3011252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe client_ts.members++; 3021252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe client_ts.thread_number = p->ts.thread_number; 3031252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe client_ts.groupid = p->ts.groupid; 3041252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 3051252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe if (++sum_stat_nr == sum_stat_clients) { 3061252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe strcpy(client_ts.name, "All clients"); 3071252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe gfio_display_ts(client, &client_ts, &client_gs); 3081252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe } 3091252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe} 3101252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 3111252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboestatic void gfio_group_stats_op(struct fio_client *client, 3121252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe struct fio_net_cmd *cmd) 3131252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe{ 3141252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe /* We're ignoring group stats for now */ 3151252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe} 3161252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 3171252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboestatic void gfio_update_thread_status(struct gui_entry *ge, 3181252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe char *status_message, double perc) 3191252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe{ 3201252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe static char message[100]; 3211252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe const char *m = message; 3221252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 3231252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe strncpy(message, status_message, sizeof(message) - 1); 3241252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe gtk_progress_bar_set_text(GTK_PROGRESS_BAR(ge->thread_status_pb), m); 3251252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(ge->thread_status_pb), perc / 100.0); 3261252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe gtk_widget_queue_draw(ge->ui->window); 3271252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe} 3281252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 3291252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboestatic void gfio_update_thread_status_all(struct gui *ui, char *status_message, 3301252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe double perc) 3311252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe{ 3321252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe static char message[100]; 3331252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe const char *m = message; 3341252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 3351252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe strncpy(message, status_message, sizeof(message) - 1); 3361252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe gtk_progress_bar_set_text(GTK_PROGRESS_BAR(ui->thread_status_pb), m); 3371252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(ui->thread_status_pb), perc / 100.0); 3381252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe gtk_widget_queue_draw(ui->window); 3391252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe} 3401252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 3411252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe/* 3421252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe * Client specific ETA 3431252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe */ 3441252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboestatic void gfio_update_client_eta(struct fio_client *client, struct jobs_eta *je) 3451252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe{ 3461252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe struct gfio_client *gc = client->client_data; 3471252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe struct gui_entry *ge = gc->ge; 3481252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe static int eta_good; 3491252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe char eta_str[128]; 3501252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe char output[256]; 3511252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe char tmp[32]; 3521252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe double perc = 0.0; 3531252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe int i2p = 0; 3541252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 3551252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe gdk_threads_enter(); 3561252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 3571252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe eta_str[0] = '\0'; 3581252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe output[0] = '\0'; 3591252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 3601252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe if (je->eta_sec != INT_MAX && je->elapsed_sec) { 3611252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe perc = (double) je->elapsed_sec / (double) (je->elapsed_sec + je->eta_sec); 3621252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe eta_to_str(eta_str, je->eta_sec); 3631252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe } 3641252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 3651252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe sprintf(tmp, "%u", je->nr_running); 3661252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe gtk_entry_set_text(GTK_ENTRY(ge->eta.jobs), tmp); 3671252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe sprintf(tmp, "%u", je->files_open); 3681252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe gtk_entry_set_text(GTK_ENTRY(ge->eta.files), tmp); 3691252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 3701252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe#if 0 3711252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe if (je->m_rate[0] || je->m_rate[1] || je->t_rate[0] || je->t_rate[1]) { 3721252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe if (je->m_rate || je->t_rate) { 3731252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe char *tr, *mr; 3741252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 3751252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe mr = num2str(je->m_rate, 4, 0, i2p); 3761252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe tr = num2str(je->t_rate, 4, 0, i2p); 3771252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe gtk_entry_set_text(GTK_ENTRY(ge->eta); 3781252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe p += sprintf(p, ", CR=%s/%s KB/s", tr, mr); 3791252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe free(tr); 3801252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe free(mr); 3811252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe } else if (je->m_iops || je->t_iops) 3821252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe p += sprintf(p, ", CR=%d/%d IOPS", je->t_iops, je->m_iops); 3831252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 3841252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe gtk_entry_set_text(GTK_ENTRY(ge->eta.cr_bw), "---"); 3851252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe gtk_entry_set_text(GTK_ENTRY(ge->eta.cr_iops), "---"); 3861252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe gtk_entry_set_text(GTK_ENTRY(ge->eta.cw_bw), "---"); 3871252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe gtk_entry_set_text(GTK_ENTRY(ge->eta.cw_iops), "---"); 3881252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe#endif 3891252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 3901252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe if (je->eta_sec != INT_MAX && je->nr_running) { 3915442cfb01f805ba26d3b8917b85c8e5f7bc50456Jens Axboe char *iops_str[DDIR_RWDIR_CNT]; 3925442cfb01f805ba26d3b8917b85c8e5f7bc50456Jens Axboe char *rate_str[DDIR_RWDIR_CNT]; 3935442cfb01f805ba26d3b8917b85c8e5f7bc50456Jens Axboe int i; 3941252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 3951252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe if ((!je->eta_sec && !eta_good) || je->nr_ramp == je->nr_running) 3961252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe strcpy(output, "-.-% done"); 3971252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe else { 3981252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe eta_good = 1; 3991252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe perc *= 100.0; 4001252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe sprintf(output, "%3.1f%% done", perc); 4011252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe } 4021252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 403cf3a0518329fc341427fb9d81de5d7cb7cdd372cJens Axboe rate_str[0] = num2str(je->rate[0], 5, 10, i2p, 0); 404cf3a0518329fc341427fb9d81de5d7cb7cdd372cJens Axboe rate_str[1] = num2str(je->rate[1], 5, 10, i2p, 0); 405cf3a0518329fc341427fb9d81de5d7cb7cdd372cJens Axboe rate_str[2] = num2str(je->rate[2], 5, 10, i2p, 0); 4061252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 407cf3a0518329fc341427fb9d81de5d7cb7cdd372cJens Axboe iops_str[0] = num2str(je->iops[0], 4, 1, 0, 0); 408cf3a0518329fc341427fb9d81de5d7cb7cdd372cJens Axboe iops_str[1] = num2str(je->iops[1], 4, 1, 0, 0); 409cf3a0518329fc341427fb9d81de5d7cb7cdd372cJens Axboe iops_str[2] = num2str(je->iops[2], 4, 1, 0, 0); 4101252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 4111252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe gtk_entry_set_text(GTK_ENTRY(ge->eta.read_bw), rate_str[0]); 4121252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe gtk_entry_set_text(GTK_ENTRY(ge->eta.read_iops), iops_str[0]); 4131252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe gtk_entry_set_text(GTK_ENTRY(ge->eta.write_bw), rate_str[1]); 4141252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe gtk_entry_set_text(GTK_ENTRY(ge->eta.write_iops), iops_str[1]); 4155442cfb01f805ba26d3b8917b85c8e5f7bc50456Jens Axboe gtk_entry_set_text(GTK_ENTRY(ge->eta.trim_bw), rate_str[2]); 4165442cfb01f805ba26d3b8917b85c8e5f7bc50456Jens Axboe gtk_entry_set_text(GTK_ENTRY(ge->eta.trim_iops), iops_str[2]); 4171252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 4188dfd6071e1a4fd3966c0a77dbb7d719c52433b54Jens Axboe graph_add_xy_data(ge->graphs.iops_graph, ge->graphs.read_iops, je->elapsed_sec, je->iops[0], iops_str[0]); 4198dfd6071e1a4fd3966c0a77dbb7d719c52433b54Jens Axboe graph_add_xy_data(ge->graphs.iops_graph, ge->graphs.write_iops, je->elapsed_sec, je->iops[1], iops_str[1]); 4205442cfb01f805ba26d3b8917b85c8e5f7bc50456Jens Axboe graph_add_xy_data(ge->graphs.iops_graph, ge->graphs.trim_iops, je->elapsed_sec, je->iops[2], iops_str[2]); 4218dfd6071e1a4fd3966c0a77dbb7d719c52433b54Jens Axboe graph_add_xy_data(ge->graphs.bandwidth_graph, ge->graphs.read_bw, je->elapsed_sec, je->rate[0], rate_str[0]); 4228dfd6071e1a4fd3966c0a77dbb7d719c52433b54Jens Axboe graph_add_xy_data(ge->graphs.bandwidth_graph, ge->graphs.write_bw, je->elapsed_sec, je->rate[1], rate_str[1]); 4235442cfb01f805ba26d3b8917b85c8e5f7bc50456Jens Axboe graph_add_xy_data(ge->graphs.bandwidth_graph, ge->graphs.trim_bw, je->elapsed_sec, je->rate[2], rate_str[2]); 4241252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 4255442cfb01f805ba26d3b8917b85c8e5f7bc50456Jens Axboe for (i = 0; i < DDIR_RWDIR_CNT; i++) { 4265442cfb01f805ba26d3b8917b85c8e5f7bc50456Jens Axboe free(rate_str[i]); 4275442cfb01f805ba26d3b8917b85c8e5f7bc50456Jens Axboe free(iops_str[i]); 4285442cfb01f805ba26d3b8917b85c8e5f7bc50456Jens Axboe } 4291252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe } 4301252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 4311252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe if (eta_str[0]) { 4321252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe char *dst = output + strlen(output); 4331252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 4341252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe sprintf(dst, " - %s", eta_str); 4351252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe } 4363c3ed070502bbfec387ded2c43d5e4559ca24a63Jens Axboe 4371252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe gfio_update_thread_status(ge, output, perc); 4381252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe gdk_threads_leave(); 4391252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe} 4401252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 4411252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe/* 4421252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe * Update ETA in main window for all clients 4431252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe */ 4441252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboestatic void gfio_update_all_eta(struct jobs_eta *je) 4451252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe{ 4461252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe struct gui *ui = &main_ui; 4471252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe static int eta_good; 4481252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe char eta_str[128]; 4491252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe char output[256]; 4501252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe double perc = 0.0; 451b78ca651a7254f01f5931ff49ca2206dcb42a056Jens Axboe int i, i2p = 0; 4521252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 4531252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe gdk_threads_enter(); 4541252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 4551252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe eta_str[0] = '\0'; 4561252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe output[0] = '\0'; 4571252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 4581252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe if (je->eta_sec != INT_MAX && je->elapsed_sec) { 4591252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe perc = (double) je->elapsed_sec / (double) (je->elapsed_sec + je->eta_sec); 4601252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe eta_to_str(eta_str, je->eta_sec); 4611252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe } 4621252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 4631252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe#if 0 4641252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe if (je->m_rate[0] || je->m_rate[1] || je->t_rate[0] || je->t_rate[1]) { 4651252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe if (je->m_rate || je->t_rate) { 4661252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe char *tr, *mr; 4671252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 4681252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe mr = num2str(je->m_rate, 4, 0, i2p); 4691252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe tr = num2str(je->t_rate, 4, 0, i2p); 4701252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe gtk_entry_set_text(GTK_ENTRY(ui->eta); 4711252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe p += sprintf(p, ", CR=%s/%s KB/s", tr, mr); 4721252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe free(tr); 4731252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe free(mr); 4741252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe } else if (je->m_iops || je->t_iops) 4751252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe p += sprintf(p, ", CR=%d/%d IOPS", je->t_iops, je->m_iops); 4761252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 4771252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe gtk_entry_set_text(GTK_ENTRY(ui->eta.cr_bw), "---"); 4781252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe gtk_entry_set_text(GTK_ENTRY(ui->eta.cr_iops), "---"); 4791252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe gtk_entry_set_text(GTK_ENTRY(ui->eta.cw_bw), "---"); 4801252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe gtk_entry_set_text(GTK_ENTRY(ui->eta.cw_iops), "---"); 4811252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe#endif 4821252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 4831252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe entry_set_int_value(ui->eta.jobs, je->nr_running); 4841252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 4851252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe if (je->eta_sec != INT_MAX && je->nr_running) { 486b78ca651a7254f01f5931ff49ca2206dcb42a056Jens Axboe char *iops_str[3]; 487b78ca651a7254f01f5931ff49ca2206dcb42a056Jens Axboe char *rate_str[3]; 4881252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 4891252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe if ((!je->eta_sec && !eta_good) || je->nr_ramp == je->nr_running) 4901252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe strcpy(output, "-.-% done"); 4911252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe else { 4921252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe eta_good = 1; 4931252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe perc *= 100.0; 4941252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe sprintf(output, "%3.1f%% done", perc); 4951252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe } 4961252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 497cf3a0518329fc341427fb9d81de5d7cb7cdd372cJens Axboe rate_str[0] = num2str(je->rate[0], 5, 10, i2p, 0); 498cf3a0518329fc341427fb9d81de5d7cb7cdd372cJens Axboe rate_str[1] = num2str(je->rate[1], 5, 10, i2p, 0); 499cf3a0518329fc341427fb9d81de5d7cb7cdd372cJens Axboe rate_str[2] = num2str(je->rate[2], 5, 10, i2p, 0); 5001252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 501cf3a0518329fc341427fb9d81de5d7cb7cdd372cJens Axboe iops_str[0] = num2str(je->iops[0], 4, 1, 0, 0); 502cf3a0518329fc341427fb9d81de5d7cb7cdd372cJens Axboe iops_str[1] = num2str(je->iops[1], 4, 1, 0, 0); 503cf3a0518329fc341427fb9d81de5d7cb7cdd372cJens Axboe iops_str[2] = num2str(je->iops[2], 4, 1, 0, 0); 5041252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 5051252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe gtk_entry_set_text(GTK_ENTRY(ui->eta.read_bw), rate_str[0]); 5061252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe gtk_entry_set_text(GTK_ENTRY(ui->eta.read_iops), iops_str[0]); 5071252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe gtk_entry_set_text(GTK_ENTRY(ui->eta.write_bw), rate_str[1]); 5081252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe gtk_entry_set_text(GTK_ENTRY(ui->eta.write_iops), iops_str[1]); 509b78ca651a7254f01f5931ff49ca2206dcb42a056Jens Axboe gtk_entry_set_text(GTK_ENTRY(ui->eta.trim_bw), rate_str[2]); 510b78ca651a7254f01f5931ff49ca2206dcb42a056Jens Axboe gtk_entry_set_text(GTK_ENTRY(ui->eta.trim_iops), iops_str[2]); 5111252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 5128dfd6071e1a4fd3966c0a77dbb7d719c52433b54Jens Axboe graph_add_xy_data(ui->graphs.iops_graph, ui->graphs.read_iops, je->elapsed_sec, je->iops[0], iops_str[0]); 5138dfd6071e1a4fd3966c0a77dbb7d719c52433b54Jens Axboe graph_add_xy_data(ui->graphs.iops_graph, ui->graphs.write_iops, je->elapsed_sec, je->iops[1], iops_str[1]); 514b78ca651a7254f01f5931ff49ca2206dcb42a056Jens Axboe graph_add_xy_data(ui->graphs.iops_graph, ui->graphs.trim_iops, je->elapsed_sec, je->iops[2], iops_str[2]); 5158dfd6071e1a4fd3966c0a77dbb7d719c52433b54Jens Axboe graph_add_xy_data(ui->graphs.bandwidth_graph, ui->graphs.read_bw, je->elapsed_sec, je->rate[0], rate_str[0]); 5168dfd6071e1a4fd3966c0a77dbb7d719c52433b54Jens Axboe graph_add_xy_data(ui->graphs.bandwidth_graph, ui->graphs.write_bw, je->elapsed_sec, je->rate[1], rate_str[1]); 517b78ca651a7254f01f5931ff49ca2206dcb42a056Jens Axboe graph_add_xy_data(ui->graphs.bandwidth_graph, ui->graphs.trim_bw, je->elapsed_sec, je->rate[2], rate_str[2]); 5181252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 519b78ca651a7254f01f5931ff49ca2206dcb42a056Jens Axboe for (i = 0; i < DDIR_RWDIR_CNT; i++) { 520b78ca651a7254f01f5931ff49ca2206dcb42a056Jens Axboe free(rate_str[i]); 521b78ca651a7254f01f5931ff49ca2206dcb42a056Jens Axboe free(iops_str[i]); 522b78ca651a7254f01f5931ff49ca2206dcb42a056Jens Axboe } 5231252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe } 5241252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 5251252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe if (eta_str[0]) { 5261252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe char *dst = output + strlen(output); 5271252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 5281252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe sprintf(dst, " - %s", eta_str); 5291252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe } 5303c3ed070502bbfec387ded2c43d5e4559ca24a63Jens Axboe 5311252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe gfio_update_thread_status_all(ui, output, perc); 5321252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe gdk_threads_leave(); 5331252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe} 5341252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 5351252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboestatic void gfio_probe_op(struct fio_client *client, struct fio_net_cmd *cmd) 5361252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe{ 537aa79e6aa308868fef1437fd6783cdd354a6e9bdbJens Axboe struct cmd_probe_reply_pdu *probe = (struct cmd_probe_reply_pdu *) cmd->payload; 5381252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe struct gfio_client *gc = client->client_data; 5391252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe struct gui_entry *ge = gc->ge; 5401252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe const char *os, *arch; 5411252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 5421252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe os = fio_get_os_string(probe->os); 5431252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe if (!os) 5441252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe os = "unknown"; 5451252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 5461252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe arch = fio_get_arch_string(probe->arch); 5471252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe if (!arch) 5481252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe os = "unknown"; 5491252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 5501252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe if (!client->name) 5511252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe client->name = strdup((char *) probe->hostname); 5521252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 553d31e26d0a575f91db96bda4d76b36fe38996d5f8Jens Axboe gc->client_cpus = le32_to_cpu(probe->cpus); 554d31e26d0a575f91db96bda4d76b36fe38996d5f8Jens Axboe gc->client_flags = le64_to_cpu(probe->flags); 555d31e26d0a575f91db96bda4d76b36fe38996d5f8Jens Axboe 5561252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe gdk_threads_enter(); 5571252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 5581252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe gtk_label_set_text(GTK_LABEL(ge->probe.hostname), (char *) probe->hostname); 5591252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe gtk_label_set_text(GTK_LABEL(ge->probe.os), os); 5601252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe gtk_label_set_text(GTK_LABEL(ge->probe.arch), arch); 5618029542b67e81c8ea83a0d71929426ec8439f9afJens Axboe gtk_label_set_text(GTK_LABEL(ge->probe.fio_ver), (char *) probe->fio_version); 5621252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 5631252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe gfio_set_state(ge, GE_STATE_CONNECTED); 5641252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 5651252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe gdk_threads_leave(); 5661252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe} 5671252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 5681252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboestatic void gfio_quit_op(struct fio_client *client, struct fio_net_cmd *cmd) 5691252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe{ 5701252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe struct gfio_client *gc = client->client_data; 5711252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 5721252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe gdk_threads_enter(); 5731252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe gfio_set_state(gc->ge, GE_STATE_NEW); 5741252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe gdk_threads_leave(); 5751252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe} 5761252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 577cf3d824147fe285bba1c93f341f6e44c34aaccd9Jens Axboestatic struct thread_options *gfio_client_add_job(struct gfio_client *gc, 578cf3d824147fe285bba1c93f341f6e44c34aaccd9Jens Axboe struct thread_options_pack *top) 579cf3d824147fe285bba1c93f341f6e44c34aaccd9Jens Axboe{ 580cf3d824147fe285bba1c93f341f6e44c34aaccd9Jens Axboe struct gfio_client_options *gco; 581cf3d824147fe285bba1c93f341f6e44c34aaccd9Jens Axboe 582cf3d824147fe285bba1c93f341f6e44c34aaccd9Jens Axboe gco = calloc(1, sizeof(*gco)); 583cf3d824147fe285bba1c93f341f6e44c34aaccd9Jens Axboe convert_thread_options_to_cpu(&gco->o, top); 584753e9e642f1cf7aa6e46a31aeebc65da26c8bf2eJens Axboe INIT_FLIST_HEAD(&gco->list); 585cf3d824147fe285bba1c93f341f6e44c34aaccd9Jens Axboe flist_add_tail(&gco->list, &gc->o_list); 586753e9e642f1cf7aa6e46a31aeebc65da26c8bf2eJens Axboe gc->o_list_nr = 1; 587cf3d824147fe285bba1c93f341f6e44c34aaccd9Jens Axboe return &gco->o; 588cf3d824147fe285bba1c93f341f6e44c34aaccd9Jens Axboe} 589cf3d824147fe285bba1c93f341f6e44c34aaccd9Jens Axboe 5901252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboestatic void gfio_add_job_op(struct fio_client *client, struct fio_net_cmd *cmd) 5911252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe{ 5921252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe struct cmd_add_job_pdu *p = (struct cmd_add_job_pdu *) cmd->payload; 5931252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe struct gfio_client *gc = client->client_data; 5941252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe struct gui_entry *ge = gc->ge; 595cf3d824147fe285bba1c93f341f6e44c34aaccd9Jens Axboe struct thread_options *o; 5961252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe char *c1, *c2, *c3, *c4; 5971252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe char tmp[80]; 5981252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 5991252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe p->thread_number = le32_to_cpu(p->thread_number); 6001252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe p->groupid = le32_to_cpu(p->groupid); 601cf3d824147fe285bba1c93f341f6e44c34aaccd9Jens Axboe o = gfio_client_add_job(gc, &p->top); 6021252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 6031252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe gdk_threads_enter(); 6041252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 605f762cef937f69d6a23127baf47f22e8ffaea4c11Jens Axboe gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(ge->eta.names), (gchar *) o->name); 6061252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe gtk_combo_box_set_active(GTK_COMBO_BOX(ge->eta.names), 0); 6071252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 6081252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe sprintf(tmp, "%s %s", o->odirect ? "direct" : "buffered", ddir_str(o->td_ddir)); 6091252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe multitext_add_entry(&ge->eta.iotype, tmp); 6101252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 6111252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe c1 = fio_uint_to_kmg(o->min_bs[DDIR_READ]); 6121252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe c2 = fio_uint_to_kmg(o->max_bs[DDIR_WRITE]); 6131252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe c3 = fio_uint_to_kmg(o->min_bs[DDIR_READ]); 6141252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe c4 = fio_uint_to_kmg(o->max_bs[DDIR_WRITE]); 6151252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe sprintf(tmp, "%s-%s/%s-%s", c1, c2, c3, c4); 6161252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe free(c1); 6171252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe free(c2); 6181252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe free(c3); 6191252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe free(c4); 6201252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe multitext_add_entry(&ge->eta.bs, tmp); 6211252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 6221252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe multitext_add_entry(&ge->eta.ioengine, (const char *) o->ioengine); 6231252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 6241252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe sprintf(tmp, "%u", o->iodepth); 6251252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe multitext_add_entry(&ge->eta.iodepth, tmp); 6261252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 6271252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe multitext_set_entry(&ge->eta.iotype, 0); 6281252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe multitext_set_entry(&ge->eta.bs, 0); 6291252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe multitext_set_entry(&ge->eta.ioengine, 0); 6301252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe multitext_set_entry(&ge->eta.iodepth, 0); 6311252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 6321252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe gfio_set_state(ge, GE_STATE_JOB_SENT); 6331252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 6341252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe gdk_threads_leave(); 6351252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe} 6361252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 63740c605169e60d32fc321a2f9f465e76cba745489Jens Axboestatic void gfio_update_job_op(struct fio_client *client, 63840c605169e60d32fc321a2f9f465e76cba745489Jens Axboe struct fio_net_cmd *cmd) 63940c605169e60d32fc321a2f9f465e76cba745489Jens Axboe{ 64040c605169e60d32fc321a2f9f465e76cba745489Jens Axboe uint32_t *pdu_error = (uint32_t *) cmd->payload; 64140c605169e60d32fc321a2f9f465e76cba745489Jens Axboe struct gfio_client *gc = client->client_data; 64240c605169e60d32fc321a2f9f465e76cba745489Jens Axboe 64328db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe gc->update_job_status = le32_to_cpu(*pdu_error); 64428db256b569af54e1bb162fc0b5d5b5d9526be98Jens Axboe gc->update_job_done = 1; 64540c605169e60d32fc321a2f9f465e76cba745489Jens Axboe} 64640c605169e60d32fc321a2f9f465e76cba745489Jens Axboe 6471252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboestatic void gfio_client_timed_out(struct fio_client *client) 6481252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe{ 6491252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe struct gfio_client *gc = client->client_data; 6501252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe char buf[256]; 6511252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 6521252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe gdk_threads_enter(); 6531252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 6541252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe gfio_set_state(gc->ge, GE_STATE_NEW); 6551252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe clear_ge_ui_info(gc->ge); 6561252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 6571252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe sprintf(buf, "Client %s: timeout talking to server.\n", client->hostname); 6581252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe gfio_report_info(gc->ge->ui, "Network timeout", buf); 6591252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 6601252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe gdk_threads_leave(); 6611252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe} 6621252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 6631252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboestatic void gfio_client_stop(struct fio_client *client, struct fio_net_cmd *cmd) 6641252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe{ 6651252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe struct gfio_client *gc = client->client_data; 6661252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 6671252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe gdk_threads_enter(); 6681252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 6691252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe gfio_set_state(gc->ge, GE_STATE_JOB_DONE); 6701252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 6711252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe if (gc->err_entry) 6721252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe entry_set_int_value(gc->err_entry, client->error); 6731252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 6741252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe gdk_threads_leave(); 6751252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe} 6761252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 6771252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboestatic void gfio_client_start(struct fio_client *client, struct fio_net_cmd *cmd) 6781252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe{ 6791252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe struct gfio_client *gc = client->client_data; 6801252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 6811252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe gdk_threads_enter(); 6821252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe gfio_set_state(gc->ge, GE_STATE_JOB_STARTED); 6831252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe gdk_threads_leave(); 6841252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe} 6851252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 6861252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboestatic void gfio_client_job_start(struct fio_client *client, struct fio_net_cmd *cmd) 6871252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe{ 6881252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe struct gfio_client *gc = client->client_data; 6891252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 6901252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe gdk_threads_enter(); 6911252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe gfio_set_state(gc->ge, GE_STATE_JOB_RUNNING); 6921252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe gdk_threads_leave(); 6931252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe} 6941252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 6951252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboestatic void gfio_client_iolog(struct fio_client *client, struct cmd_iolog_pdu *pdu) 6961252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe{ 6971252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe printf("got iolog: name=%s, type=%u, entries=%u\n", pdu->name, pdu->log_type, pdu->nr_samples); 6981252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe free(pdu); 6991252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe} 7001252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 7011252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboestatic void gfio_add_total_depths_tree(GtkListStore *model, 7021252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe struct thread_stat *ts, unsigned int len) 7031252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe{ 7041252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe double io_u_dist[FIO_IO_U_MAP_NR]; 7051252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe GtkTreeIter iter; 7061252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe /* Bits 1-6, and 8 */ 7071252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe const int add_mask = 0x17e; 7081252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe int i, j; 7091252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 710d79db1222039e906dd49ae290daa59701f4e2385Jens Axboe stat_calc_dist(ts->io_u_map, ddir_rw_sum(ts->total_io_u), io_u_dist); 7111252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 7121252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe gtk_list_store_append(model, &iter); 7131252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 7141252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe gtk_list_store_set(model, &iter, 0, "Total", -1); 7151252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 7161252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe for (i = 1, j = 0; i < len; i++) { 7171252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe char fbuf[32]; 7181252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 7191252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe if (!(add_mask & (1UL << (i - 1)))) 7201252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe sprintf(fbuf, "0.0%%"); 7211252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe else { 7221252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe sprintf(fbuf, "%3.1f%%", io_u_dist[j]); 7231252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe j++; 7241252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe } 7251252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 7261252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe gtk_list_store_set(model, &iter, i, fbuf, -1); 7271252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe } 7281252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 7291252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe} 7301252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 7311252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboestatic void gfio_add_end_results(struct gfio_client *gc, struct thread_stat *ts, 7321252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe struct group_run_stats *rs) 7331252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe{ 7341252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe unsigned int nr = gc->nr_results; 7351252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 7361252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe gc->results = realloc(gc->results, (nr + 1) * sizeof(struct end_results)); 7371252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe memcpy(&gc->results[nr].ts, ts, sizeof(*ts)); 7381252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe memcpy(&gc->results[nr].gs, rs, sizeof(*rs)); 7391252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe gc->nr_results++; 7401252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe} 7411252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 7421252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboestatic void gfio_add_sc_depths_tree(GtkListStore *model, 7431252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe struct thread_stat *ts, unsigned int len, 7441252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe int submit) 7451252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe{ 7461252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe double io_u_dist[FIO_IO_U_MAP_NR]; 7471252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe GtkTreeIter iter; 7481252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe /* Bits 0, and 3-8 */ 7491252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe const int add_mask = 0x1f9; 7501252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe int i, j; 7511252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 7521252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe if (submit) 7531252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe stat_calc_dist(ts->io_u_submit, ts->total_submit, io_u_dist); 7541252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe else 7551252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe stat_calc_dist(ts->io_u_complete, ts->total_complete, io_u_dist); 7561252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 7571252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe gtk_list_store_append(model, &iter); 7581252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 7591252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe gtk_list_store_set(model, &iter, 0, submit ? "Submit" : "Complete", -1); 7601252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 7611252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe for (i = 1, j = 0; i < len; i++) { 7621252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe char fbuf[32]; 7631252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 7641252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe if (!(add_mask & (1UL << (i - 1)))) 7651252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe sprintf(fbuf, "0.0%%"); 7661252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe else { 7671252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe sprintf(fbuf, "%3.1f%%", io_u_dist[j]); 7681252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe j++; 7691252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe } 7701252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 7711252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe gtk_list_store_set(model, &iter, i, fbuf, -1); 7721252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe } 7731252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 7741252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe} 7751252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 7761252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboestatic void gfio_show_io_depths(GtkWidget *vbox, struct thread_stat *ts) 7771252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe{ 7781252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe GtkWidget *frame, *box, *tree_view = NULL; 7791252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe GtkTreeSelection *selection; 7801252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe GtkListStore *model; 7811252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe int i; 7821252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe const char *labels[] = { "Depth", "0", "1", "2", "4", "8", "16", "32", "64", ">= 64" }; 783057754389863aa18cbf36b1f2a556a422ea2f4b5Jens Axboe const int nr_labels = ARRAY_SIZE(labels); 7841fae4855d30ae19ef6b681a33821b36c298ab7e1Jens Axboe GType types[nr_labels]; 7851252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 7861252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe frame = gtk_frame_new("IO depths"); 7871252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe gtk_box_pack_start(GTK_BOX(vbox), frame, FALSE, FALSE, 5); 7881252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 7891252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe box = gtk_hbox_new(FALSE, 3); 7901252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe gtk_container_add(GTK_CONTAINER(frame), box); 7911252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 7921252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe for (i = 0; i < nr_labels; i++) 7931252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe types[i] = G_TYPE_STRING; 7941252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 7951252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe model = gtk_list_store_newv(nr_labels, types); 7961252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 7971252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe tree_view = gtk_tree_view_new_with_model(GTK_TREE_MODEL(model)); 7981252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe gtk_widget_set_can_focus(tree_view, FALSE); 7991252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 8001252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe g_object_set(G_OBJECT(tree_view), "headers-visible", TRUE, 8011252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe "enable-grid-lines", GTK_TREE_VIEW_GRID_LINES_BOTH, NULL); 8021252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 8031252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(tree_view)); 8041252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe gtk_tree_selection_set_mode(GTK_TREE_SELECTION(selection), GTK_SELECTION_BROWSE); 8051252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 8061252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe for (i = 0; i < nr_labels; i++) 8071252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe tree_view_column(tree_view, i, labels[i], ALIGN_RIGHT | UNSORTABLE); 8081252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 8091252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe gfio_add_total_depths_tree(model, ts, nr_labels); 8101252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe gfio_add_sc_depths_tree(model, ts, nr_labels, 1); 8111252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe gfio_add_sc_depths_tree(model, ts, nr_labels, 0); 8121252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 813f5e653e6e776561f60aa13f3c5eef55f63a75c21Stephen M. Cameron gtk_box_pack_start(GTK_BOX(box), tree_view, TRUE, TRUE, 3); 8141252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe} 8151252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 8161252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboestatic void gfio_show_cpu_usage(GtkWidget *vbox, struct thread_stat *ts) 8171252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe{ 8181252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe GtkWidget *box, *frame, *entry; 8191252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe double usr_cpu, sys_cpu; 8201252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe unsigned long runtime; 8211252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe char tmp[32]; 8221252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 8231252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe runtime = ts->total_run_time; 8241252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe if (runtime) { 8251252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe double runt = (double) runtime; 8261252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 8271252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe usr_cpu = (double) ts->usr_time * 100 / runt; 8281252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe sys_cpu = (double) ts->sys_time * 100 / runt; 8291252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe } else { 8301252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe usr_cpu = 0; 8311252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe sys_cpu = 0; 8321252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe } 8331252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 8341252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe frame = gtk_frame_new("OS resources"); 8351252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe gtk_box_pack_start(GTK_BOX(vbox), frame, FALSE, FALSE, 5); 8361252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 8371252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe box = gtk_hbox_new(FALSE, 3); 8381252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe gtk_container_add(GTK_CONTAINER(frame), box); 8391252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 8401252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe entry = new_info_entry_in_frame(box, "User CPU"); 8411252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe sprintf(tmp, "%3.2f%%", usr_cpu); 8421252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe gtk_entry_set_text(GTK_ENTRY(entry), tmp); 8431252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe entry = new_info_entry_in_frame(box, "System CPU"); 8441252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe sprintf(tmp, "%3.2f%%", sys_cpu); 8451252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe gtk_entry_set_text(GTK_ENTRY(entry), tmp); 8461252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe entry = new_info_entry_in_frame(box, "Context switches"); 8471252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe entry_set_int_value(entry, ts->ctx); 8481252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe entry = new_info_entry_in_frame(box, "Major faults"); 8491252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe entry_set_int_value(entry, ts->majf); 8501252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe entry = new_info_entry_in_frame(box, "Minor faults"); 8511252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe entry_set_int_value(entry, ts->minf); 8521252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe} 8531252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 8541252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboestatic GtkWidget *gfio_output_lat_buckets(double *lat, const char **labels, 8551252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe int num) 8561252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe{ 8571252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe GtkWidget *tree_view; 8581252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe GtkTreeSelection *selection; 8591252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe GtkListStore *model; 8601252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe GtkTreeIter iter; 8611252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe GType *types; 8621252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe int i; 8631252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 8641252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe types = malloc(num * sizeof(GType)); 8651252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 8661252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe for (i = 0; i < num; i++) 8671252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe types[i] = G_TYPE_STRING; 8681252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 8691252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe model = gtk_list_store_newv(num, types); 8701252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe free(types); 8711252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe types = NULL; 8721252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 8731252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe tree_view = gtk_tree_view_new_with_model(GTK_TREE_MODEL(model)); 8741252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe gtk_widget_set_can_focus(tree_view, FALSE); 8751252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 8761252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe g_object_set(G_OBJECT(tree_view), "headers-visible", TRUE, 8771252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe "enable-grid-lines", GTK_TREE_VIEW_GRID_LINES_BOTH, NULL); 8781252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 8791252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(tree_view)); 8801252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe gtk_tree_selection_set_mode(GTK_TREE_SELECTION(selection), GTK_SELECTION_BROWSE); 8811252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 8821252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe for (i = 0; i < num; i++) 8831252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe tree_view_column(tree_view, i, labels[i], ALIGN_RIGHT | UNSORTABLE); 8841252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 8851252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe gtk_list_store_append(model, &iter); 8861252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 8871252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe for (i = 0; i < num; i++) { 8881252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe char fbuf[32]; 8891252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 8901252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe if (lat[i] <= 0.0) 8911252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe sprintf(fbuf, "0.00"); 8921252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe else 8931252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe sprintf(fbuf, "%3.2f%%", lat[i]); 8941252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 8951252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe gtk_list_store_set(model, &iter, i, fbuf, -1); 8961252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe } 8971252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 8981252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe return tree_view; 8991252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe} 9001252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 9011252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboestatic struct graph *setup_lat_bucket_graph(const char *title, double *lat, 9021252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe const char **labels, 9031252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe unsigned int len, 9041252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe double xdim, double ydim) 9051252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe{ 9061252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe struct graph *g; 9071252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe int i; 9081252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 9091252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe g = graph_new(xdim, ydim, gfio_graph_font); 9101252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe graph_title(g, title); 9111252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe graph_x_title(g, "Buckets"); 9121252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe graph_y_title(g, "Percent"); 9131252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 9141252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe for (i = 0; i < len; i++) { 9158dfd6071e1a4fd3966c0a77dbb7d719c52433b54Jens Axboe graph_label_t l; 9168dfd6071e1a4fd3966c0a77dbb7d719c52433b54Jens Axboe 9178dfd6071e1a4fd3966c0a77dbb7d719c52433b54Jens Axboe l = graph_add_label(g, labels[i]); 9188dfd6071e1a4fd3966c0a77dbb7d719c52433b54Jens Axboe graph_add_data(g, l, lat[i]); 9191252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe } 9201252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 9211252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe return g; 9221252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe} 9231252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 9241252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboestatic int on_expose_lat_drawing_area(GtkWidget *w, GdkEvent *event, gpointer p) 9251252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe{ 9261252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe struct graph *g = p; 9271252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe cairo_t *cr; 9281252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 929cd0d2db8d4a8863bb48eca8bb197bd73d2f6c9a4Jens Axboe cr = gdk_cairo_create(gtk_widget_get_window(w)); 9301252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe#if 0 9311252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe if (graph_has_tooltips(g)) { 9321252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe g_object_set(w, "has-tooltip", TRUE, NULL); 9331252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe g_signal_connect(w, "query-tooltip", G_CALLBACK(clat_graph_tooltip), g); 9341252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe } 9351252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe#endif 9361252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe cairo_set_source_rgb(cr, 0, 0, 0); 9371252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe bar_graph_draw(g, cr); 9381252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe cairo_destroy(cr); 9391252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 9401252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe return FALSE; 9411252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe} 9421252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 9431252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboestatic gint on_config_lat_drawing_area(GtkWidget *w, GdkEventConfigure *event, 9441252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe gpointer data) 9451252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe{ 946cd0d2db8d4a8863bb48eca8bb197bd73d2f6c9a4Jens Axboe guint width = gtk_widget_get_allocated_width(w); 947cd0d2db8d4a8863bb48eca8bb197bd73d2f6c9a4Jens Axboe guint height = gtk_widget_get_allocated_height(w); 9481252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe struct graph *g = data; 9491252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 950cd0d2db8d4a8863bb48eca8bb197bd73d2f6c9a4Jens Axboe graph_set_size(g, width, height); 951cd0d2db8d4a8863bb48eca8bb197bd73d2f6c9a4Jens Axboe graph_set_size(g, width, height); 9521252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe graph_set_position(g, 0, 0); 9531252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe return TRUE; 9541252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe} 9551252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 9561252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboestatic void gfio_show_latency_buckets(struct gfio_client *gc, GtkWidget *vbox, 9571252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe struct thread_stat *ts) 9581252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe{ 9591252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe double io_u_lat[FIO_IO_U_LAT_U_NR + FIO_IO_U_LAT_M_NR]; 9601252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe const char *ranges[] = { "2u", "4u", "10u", "20u", "50u", "100u", 9611252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe "250u", "500u", "750u", "1m", "2m", 9621252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe "4m", "10m", "20m", "50m", "100m", 9631252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe "250m", "500m", "750m", "1s", "2s", ">= 2s" }; 9641252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe int start, end, i; 9651252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe const int total = FIO_IO_U_LAT_U_NR + FIO_IO_U_LAT_M_NR; 9661252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe GtkWidget *frame, *tree_view, *hbox, *completion_vbox, *drawing_area; 9671252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe struct gui_entry *ge = gc->ge; 9681252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 9691252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe stat_calc_lat_u(ts, io_u_lat); 9701252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe stat_calc_lat_m(ts, &io_u_lat[FIO_IO_U_LAT_U_NR]); 9711252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 9721252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe /* 9731252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe * Found out which first bucket has entries, and which last bucket 9741252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe */ 9751252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe start = end = -1U; 9761252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe for (i = 0; i < total; i++) { 9771252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe if (io_u_lat[i] == 0.00) 9781252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe continue; 9791252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 9801252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe if (start == -1U) 9811252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe start = i; 9821252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe end = i; 9831252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe } 9841252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 9851252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe /* 9861252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe * No entries... 9871252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe */ 9881252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe if (start == -1U) 9891252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe return; 9903c3ed070502bbfec387ded2c43d5e4559ca24a63Jens Axboe 9911252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe tree_view = gfio_output_lat_buckets(&io_u_lat[start], &ranges[start], end - start + 1); 9921252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe ge->lat_bucket_graph = setup_lat_bucket_graph("Latency Buckets", &io_u_lat[start], &ranges[start], end - start + 1, 700.0, 300.0); 9931252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 9941252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe frame = gtk_frame_new("Latency buckets"); 9951252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe gtk_box_pack_start(GTK_BOX(vbox), frame, FALSE, FALSE, 5); 9961252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 9971252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe completion_vbox = gtk_vbox_new(FALSE, 3); 9981252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe gtk_container_add(GTK_CONTAINER(frame), completion_vbox); 9991252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe hbox = gtk_hbox_new(FALSE, 3); 10001252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe gtk_container_add(GTK_CONTAINER(completion_vbox), hbox); 10011252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 10021252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe drawing_area = gtk_drawing_area_new(); 10031252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe gtk_widget_set_size_request(GTK_WIDGET(drawing_area), 700, 300); 10041252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe gtk_widget_modify_bg(drawing_area, GTK_STATE_NORMAL, &gfio_color_white); 10051252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe gtk_container_add(GTK_CONTAINER(completion_vbox), drawing_area); 1006b6ab6a31f82cf498da9da08ce83f7b12160203feJens Axboe g_signal_connect(G_OBJECT(drawing_area), GFIO_DRAW_EVENT, G_CALLBACK(on_expose_lat_drawing_area), ge->lat_bucket_graph); 10073c3ed070502bbfec387ded2c43d5e4559ca24a63Jens Axboe g_signal_connect(G_OBJECT(drawing_area), "configure_event", G_CALLBACK(on_config_lat_drawing_area), ge->lat_bucket_graph); 10081252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 1009b4d669e6465f535919edc0830e7ace08e7886f2eStephen M. Cameron gtk_box_pack_start(GTK_BOX(hbox), tree_view, TRUE, TRUE, 3); 10101252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe} 10111252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 10121252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboestatic void gfio_show_lat(GtkWidget *vbox, const char *name, unsigned long min, 10131252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe unsigned long max, double mean, double dev) 10141252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe{ 10151252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe const char *base = "(usec)"; 10161252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe GtkWidget *hbox, *label, *frame; 10171252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe char *minp, *maxp; 10181252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe char tmp[64]; 10191252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 10201252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe if (!usec_to_msec(&min, &max, &mean, &dev)) 10211252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe base = "(msec)"; 10221252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 1023cf3a0518329fc341427fb9d81de5d7cb7cdd372cJens Axboe minp = num2str(min, 6, 1, 0, 0); 1024cf3a0518329fc341427fb9d81de5d7cb7cdd372cJens Axboe maxp = num2str(max, 6, 1, 0, 0); 10251252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 10261252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe sprintf(tmp, "%s %s", name, base); 10271252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe frame = gtk_frame_new(tmp); 10281252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe gtk_box_pack_start(GTK_BOX(vbox), frame, FALSE, FALSE, 5); 10291252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 10301252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe hbox = gtk_hbox_new(FALSE, 3); 10311252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe gtk_container_add(GTK_CONTAINER(frame), hbox); 10321252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 10331252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe label = new_info_label_in_frame(hbox, "Minimum"); 10341252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe gtk_label_set_text(GTK_LABEL(label), minp); 10351252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe label = new_info_label_in_frame(hbox, "Maximum"); 10361252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe gtk_label_set_text(GTK_LABEL(label), maxp); 10371252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe label = new_info_label_in_frame(hbox, "Average"); 10381252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe sprintf(tmp, "%5.02f", mean); 10391252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe gtk_label_set_text(GTK_LABEL(label), tmp); 10401252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe label = new_info_label_in_frame(hbox, "Standard deviation"); 10411252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe sprintf(tmp, "%5.02f", dev); 10421252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe gtk_label_set_text(GTK_LABEL(label), tmp); 10431252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 10441252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe free(minp); 10451252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe free(maxp); 10461252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe} 10471252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 10481252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboestatic GtkWidget *gfio_output_clat_percentiles(unsigned int *ovals, 10491252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe fio_fp64_t *plist, 10501252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe unsigned int len, 10511252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe const char *base, 10521252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe unsigned int scale) 10531252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe{ 10541252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe GType types[FIO_IO_U_LIST_MAX_LEN]; 10551252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe GtkWidget *tree_view; 10561252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe GtkTreeSelection *selection; 10571252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe GtkListStore *model; 10581252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe GtkTreeIter iter; 10591252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe int i; 10601252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 10611252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe for (i = 0; i < len; i++) 10621252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe types[i] = G_TYPE_INT; 10631252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 10641252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe model = gtk_list_store_newv(len, types); 10651252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 10661252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe tree_view = gtk_tree_view_new_with_model(GTK_TREE_MODEL(model)); 10671252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe gtk_widget_set_can_focus(tree_view, FALSE); 10681252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 10691252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe g_object_set(G_OBJECT(tree_view), "headers-visible", TRUE, 10701252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe "enable-grid-lines", GTK_TREE_VIEW_GRID_LINES_BOTH, NULL); 10711252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 10721252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(tree_view)); 10731252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe gtk_tree_selection_set_mode(GTK_TREE_SELECTION(selection), GTK_SELECTION_BROWSE); 10741252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 10751252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe for (i = 0; i < len; i++) { 10761252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe char fbuf[8]; 10771252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 10781252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe sprintf(fbuf, "%2.2f%%", plist[i].u.f); 10791252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe tree_view_column(tree_view, i, fbuf, ALIGN_RIGHT | UNSORTABLE); 10801252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe } 10811252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 10821252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe gtk_list_store_append(model, &iter); 10831252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 10841252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe for (i = 0; i < len; i++) { 10851252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe if (scale) 10861252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe ovals[i] = (ovals[i] + 999) / 1000; 10871252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe gtk_list_store_set(model, &iter, i, ovals[i], -1); 10881252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe } 10891252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 10901252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe return tree_view; 10911252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe} 10921252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 10931252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboestatic struct graph *setup_clat_graph(char *title, unsigned int *ovals, 10941252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe fio_fp64_t *plist, 10951252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe unsigned int len, 10961252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe double xdim, double ydim) 10971252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe{ 10981252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe struct graph *g; 10991252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe int i; 11001252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 11011252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe g = graph_new(xdim, ydim, gfio_graph_font); 11021252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe graph_title(g, title); 11031252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe graph_x_title(g, "Percentile"); 11041252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe graph_y_title(g, "Time"); 11051252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 11061252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe for (i = 0; i < len; i++) { 11078dfd6071e1a4fd3966c0a77dbb7d719c52433b54Jens Axboe graph_label_t l; 11081252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe char fbuf[8]; 11091252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 11101252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe sprintf(fbuf, "%2.2f%%", plist[i].u.f); 11118dfd6071e1a4fd3966c0a77dbb7d719c52433b54Jens Axboe l = graph_add_label(g, fbuf); 11128dfd6071e1a4fd3966c0a77dbb7d719c52433b54Jens Axboe graph_add_data(g, l, (double) ovals[i]); 11131252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe } 11141252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 11151252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe return g; 11161252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe} 11171252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 11181252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboestatic void gfio_show_clat_percentiles(struct gfio_client *gc, 11191252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe GtkWidget *vbox, struct thread_stat *ts, 11201252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe int ddir) 11211252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe{ 11221252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe unsigned int *io_u_plat = ts->io_u_plat[ddir]; 11231252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe unsigned long nr = ts->clat_stat[ddir].samples; 11241252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe fio_fp64_t *plist = ts->percentile_list; 11251252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe unsigned int *ovals, len, minv, maxv, scale_down; 11261252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe const char *base; 11271252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe GtkWidget *tree_view, *frame, *hbox, *drawing_area, *completion_vbox; 11281252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe struct gui_entry *ge = gc->ge; 11291252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe char tmp[64]; 11301252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 11311252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe len = calc_clat_percentiles(io_u_plat, nr, plist, &ovals, &maxv, &minv); 11321252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe if (!len) 11331252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe goto out; 11341252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 11351252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe /* 11361252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe * We default to usecs, but if the value range is such that we 11371252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe * should scale down to msecs, do that. 11381252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe */ 11391252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe if (minv > 2000 && maxv > 99999) { 11401252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe scale_down = 1; 11411252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe base = "msec"; 11421252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe } else { 11431252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe scale_down = 0; 11441252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe base = "usec"; 11451252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe } 11461252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 11471252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe sprintf(tmp, "Completion percentiles (%s)", base); 11481252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe tree_view = gfio_output_clat_percentiles(ovals, plist, len, base, scale_down); 11491252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe ge->clat_graph = setup_clat_graph(tmp, ovals, plist, len, 700.0, 300.0); 11501252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 11511252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe frame = gtk_frame_new(tmp); 11521252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe gtk_box_pack_start(GTK_BOX(vbox), frame, FALSE, FALSE, 5); 11531252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 11541252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe completion_vbox = gtk_vbox_new(FALSE, 3); 11551252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe gtk_container_add(GTK_CONTAINER(frame), completion_vbox); 11561252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe hbox = gtk_hbox_new(FALSE, 3); 11571252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe gtk_container_add(GTK_CONTAINER(completion_vbox), hbox); 11581252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe drawing_area = gtk_drawing_area_new(); 11591252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe gtk_widget_set_size_request(GTK_WIDGET(drawing_area), 700, 300); 11601252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe gtk_widget_modify_bg(drawing_area, GTK_STATE_NORMAL, &gfio_color_white); 11611252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe gtk_container_add(GTK_CONTAINER(completion_vbox), drawing_area); 1162b6ab6a31f82cf498da9da08ce83f7b12160203feJens Axboe g_signal_connect(G_OBJECT(drawing_area), GFIO_DRAW_EVENT, G_CALLBACK(on_expose_lat_drawing_area), ge->clat_graph); 11631252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe g_signal_connect(G_OBJECT(drawing_area), "configure_event", G_CALLBACK(on_config_lat_drawing_area), ge->clat_graph); 11641252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 1165bf0f6cc7a98bbbb5247db6a7866d3de323d1f693Stephen M. Cameron gtk_box_pack_start(GTK_BOX(hbox), tree_view, TRUE, TRUE, 3); 11661252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboeout: 11671252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe if (ovals) 11681252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe free(ovals); 11691252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe} 11701252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 11711252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe#define GFIO_CLAT 1 11721252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe#define GFIO_SLAT 2 11731252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe#define GFIO_LAT 4 11741252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 11751252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboestatic void gfio_show_ddir_status(struct gfio_client *gc, GtkWidget *mbox, 11761252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe struct group_run_stats *rs, 11771252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe struct thread_stat *ts, int ddir) 11781252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe{ 1179b78ca651a7254f01f5931ff49ca2206dcb42a056Jens Axboe const char *ddir_label[3] = { "Read", "Write", "Trim" }; 11801252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe GtkWidget *frame, *label, *box, *vbox, *main_vbox; 11811252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe unsigned long min[3], max[3], runt; 11821252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe unsigned long long bw, iops; 11831252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe unsigned int flags = 0; 11841252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe double mean[3], dev[3]; 11851252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe char *io_p, *bw_p, *iops_p; 11861252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe int i2p; 11871252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 11881252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe if (!ts->runtime[ddir]) 11891252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe return; 11901252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 11911252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe i2p = is_power_of_2(rs->kb_base); 11921252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe runt = ts->runtime[ddir]; 11931252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 11941252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe bw = (1000 * ts->io_bytes[ddir]) / runt; 1195cf3a0518329fc341427fb9d81de5d7cb7cdd372cJens Axboe io_p = num2str(ts->io_bytes[ddir], 6, 1, i2p, 8); 1196cf3a0518329fc341427fb9d81de5d7cb7cdd372cJens Axboe bw_p = num2str(bw, 6, 1, i2p, ts->unit_base); 11971252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 11981252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe iops = (1000 * (uint64_t)ts->total_io_u[ddir]) / runt; 1199cf3a0518329fc341427fb9d81de5d7cb7cdd372cJens Axboe iops_p = num2str(iops, 6, 1, 0, 0); 12001252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 12011252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe box = gtk_hbox_new(FALSE, 3); 12021252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe gtk_box_pack_start(GTK_BOX(mbox), box, TRUE, FALSE, 3); 12031252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 12041252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe frame = gtk_frame_new(ddir_label[ddir]); 1205f614437eba8905ca700e6267997c1d5270dbb83eStephen M. Cameron gtk_box_pack_start(GTK_BOX(box), frame, TRUE, TRUE, 5); 12061252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 12071252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe main_vbox = gtk_vbox_new(FALSE, 3); 12081252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe gtk_container_add(GTK_CONTAINER(frame), main_vbox); 12091252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 12101252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe box = gtk_hbox_new(FALSE, 3); 12111252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe gtk_box_pack_start(GTK_BOX(main_vbox), box, TRUE, FALSE, 3); 12121252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 12131252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe label = new_info_label_in_frame(box, "IO"); 12141252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe gtk_label_set_text(GTK_LABEL(label), io_p); 12151252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe label = new_info_label_in_frame(box, "Bandwidth"); 12161252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe gtk_label_set_text(GTK_LABEL(label), bw_p); 12171252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe label = new_info_label_in_frame(box, "IOPS"); 12181252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe gtk_label_set_text(GTK_LABEL(label), iops_p); 12191252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe label = new_info_label_in_frame(box, "Runtime (msec)"); 12201252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe label_set_int_value(label, ts->runtime[ddir]); 12211252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 12221252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe if (calc_lat(&ts->bw_stat[ddir], &min[0], &max[0], &mean[0], &dev[0])) { 12231252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe double p_of_agg = 100.0; 12241252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe const char *bw_str = "KB"; 12251252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe char tmp[32]; 12261252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 12271252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe if (rs->agg[ddir]) { 12281252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe p_of_agg = mean[0] * 100 / (double) rs->agg[ddir]; 12291252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe if (p_of_agg > 100.0) 12301252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe p_of_agg = 100.0; 12311252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe } 12321252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 12331252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe if (mean[0] > 999999.9) { 12341252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe min[0] /= 1000.0; 12351252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe max[0] /= 1000.0; 12361252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe mean[0] /= 1000.0; 12371252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe dev[0] /= 1000.0; 12381252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe bw_str = "MB"; 12391252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe } 12401252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 12411252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe sprintf(tmp, "Bandwidth (%s)", bw_str); 12421252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe frame = gtk_frame_new(tmp); 12431252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe gtk_box_pack_start(GTK_BOX(main_vbox), frame, FALSE, FALSE, 5); 12441252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 12451252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe box = gtk_hbox_new(FALSE, 3); 12461252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe gtk_container_add(GTK_CONTAINER(frame), box); 12471252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 12481252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe label = new_info_label_in_frame(box, "Minimum"); 12491252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe label_set_int_value(label, min[0]); 12501252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe label = new_info_label_in_frame(box, "Maximum"); 12511252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe label_set_int_value(label, max[0]); 12521252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe label = new_info_label_in_frame(box, "Percentage of jobs"); 12531252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe sprintf(tmp, "%3.2f%%", p_of_agg); 12541252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe gtk_label_set_text(GTK_LABEL(label), tmp); 12551252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe label = new_info_label_in_frame(box, "Average"); 12561252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe sprintf(tmp, "%5.02f", mean[0]); 12571252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe gtk_label_set_text(GTK_LABEL(label), tmp); 12581252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe label = new_info_label_in_frame(box, "Standard deviation"); 12591252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe sprintf(tmp, "%5.02f", dev[0]); 12601252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe gtk_label_set_text(GTK_LABEL(label), tmp); 12611252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe } 12621252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 12631252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe if (calc_lat(&ts->slat_stat[ddir], &min[0], &max[0], &mean[0], &dev[0])) 12641252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe flags |= GFIO_SLAT; 12651252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe if (calc_lat(&ts->clat_stat[ddir], &min[1], &max[1], &mean[1], &dev[1])) 12661252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe flags |= GFIO_CLAT; 12671252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe if (calc_lat(&ts->lat_stat[ddir], &min[2], &max[2], &mean[2], &dev[2])) 12681252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe flags |= GFIO_LAT; 12691252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 12701252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe if (flags) { 12711252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe frame = gtk_frame_new("Latency"); 12721252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe gtk_box_pack_start(GTK_BOX(main_vbox), frame, FALSE, FALSE, 5); 12731252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 12741252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe vbox = gtk_vbox_new(FALSE, 3); 12751252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe gtk_container_add(GTK_CONTAINER(frame), vbox); 12761252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 12771252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe if (flags & GFIO_SLAT) 12781252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe gfio_show_lat(vbox, "Submission latency", min[0], max[0], mean[0], dev[0]); 12791252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe if (flags & GFIO_CLAT) 12801252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe gfio_show_lat(vbox, "Completion latency", min[1], max[1], mean[1], dev[1]); 12811252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe if (flags & GFIO_LAT) 12821252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe gfio_show_lat(vbox, "Total latency", min[2], max[2], mean[2], dev[2]); 12831252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe } 12841252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 12851252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe if (ts->clat_percentiles) 12861252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe gfio_show_clat_percentiles(gc, main_vbox, ts, ddir); 12871252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 12881252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe free(io_p); 12891252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe free(bw_p); 12901252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe free(iops_p); 12911252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe} 12921252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 12931252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboestatic void __gfio_display_end_results(GtkWidget *win, struct gfio_client *gc, 12941252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe struct thread_stat *ts, 12951252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe struct group_run_stats *rs) 12961252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe{ 12971252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe GtkWidget *box, *vbox, *entry, *scroll; 1298b78ca651a7254f01f5931ff49ca2206dcb42a056Jens Axboe int i; 12991252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 13001252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe scroll = gtk_scrolled_window_new(NULL, NULL); 13011252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe gtk_container_set_border_width(GTK_CONTAINER(scroll), 5); 13021252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scroll), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); 13031252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 13041252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe vbox = gtk_vbox_new(FALSE, 3); 13051252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 13061252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe box = gtk_hbox_new(FALSE, 0); 13071252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe gtk_box_pack_start(GTK_BOX(vbox), box, TRUE, FALSE, 5); 13081252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 13091252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(scroll), vbox); 13101252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 13111252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe gtk_notebook_append_page(GTK_NOTEBOOK(win), scroll, gtk_label_new(ts->name)); 13121252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 13131252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe entry = new_info_entry_in_frame(box, "Name"); 13141252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe gtk_entry_set_text(GTK_ENTRY(entry), ts->name); 13151252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe if (strlen(ts->description)) { 13161252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe entry = new_info_entry_in_frame(box, "Description"); 13171252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe gtk_entry_set_text(GTK_ENTRY(entry), ts->description); 13181252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe } 13191252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe entry = new_info_entry_in_frame(box, "Group ID"); 13201252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe entry_set_int_value(entry, ts->groupid); 13211252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe entry = new_info_entry_in_frame(box, "Jobs"); 13221252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe entry_set_int_value(entry, ts->members); 13231252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe gc->err_entry = entry = new_info_entry_in_frame(box, "Error"); 13241252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe entry_set_int_value(entry, ts->error); 13251252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe entry = new_info_entry_in_frame(box, "PID"); 13261252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe entry_set_int_value(entry, ts->pid); 13271252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 1328b78ca651a7254f01f5931ff49ca2206dcb42a056Jens Axboe for (i = 0; i < DDIR_RWDIR_CNT; i++) { 1329b78ca651a7254f01f5931ff49ca2206dcb42a056Jens Axboe if (ts->io_bytes[i]) 1330b78ca651a7254f01f5931ff49ca2206dcb42a056Jens Axboe gfio_show_ddir_status(gc, vbox, rs, ts, i); 1331b78ca651a7254f01f5931ff49ca2206dcb42a056Jens Axboe } 13321252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 13331252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe gfio_show_latency_buckets(gc, vbox, ts); 13341252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe gfio_show_cpu_usage(vbox, ts); 13351252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe gfio_show_io_depths(vbox, ts); 13361252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe} 13371252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 13381252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboevoid gfio_display_end_results(struct gfio_client *gc) 13391252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe{ 13401252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe struct gui_entry *ge = gc->ge; 13411252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe GtkWidget *res_notebook; 13421252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe int i; 13431252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 13441252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe res_notebook = get_results_window(ge); 13451252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 13461252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe for (i = 0; i < gc->nr_results; i++) { 13471252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe struct end_results *e = &gc->results[i]; 13481252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 13491252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe __gfio_display_end_results(res_notebook, gc, &e->ts, &e->gs); 13501252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe } 13511252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 13521252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe if (gfio_disk_util_show(gc)) 13531252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe gtk_widget_show_all(ge->results_window); 13541252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe} 13551252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 13561252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboestatic void gfio_display_ts(struct fio_client *client, struct thread_stat *ts, 13571252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe struct group_run_stats *rs) 13581252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe{ 13591252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe struct gfio_client *gc = client->client_data; 13601252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe struct gui_entry *ge = gc->ge; 13611252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 13621252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe gfio_add_end_results(gc, ts, rs); 13631252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 13641252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe gdk_threads_enter(); 13651252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe if (ge->results_window) 13661252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe __gfio_display_end_results(ge->results_notebook, gc, ts, rs); 13671252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe else 13681252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe gfio_display_end_results(gc); 13691252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe gdk_threads_leave(); 13701252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe} 13711252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 13721252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboestatic void gfio_client_removed(struct fio_client *client) 13731252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe{ 13741252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe struct gfio_client *gc = client->client_data; 13751252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 13761252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe assert(gc->client == client); 13771252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe fio_put_client(gc->client); 13781252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe gc->client = NULL; 13791252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe} 13801252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe 13811252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboestruct client_ops gfio_client_ops = { 13821252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe .text = gfio_text_op, 13831252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe .disk_util = gfio_disk_util_op, 13841252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe .thread_status = gfio_thread_status_op, 13851252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe .group_stats = gfio_group_stats_op, 13861252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe .jobs_eta = gfio_update_client_eta, 13871252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe .eta = gfio_update_all_eta, 13881252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe .probe = gfio_probe_op, 13891252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe .quit = gfio_quit_op, 13901252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe .add_job = gfio_add_job_op, 139140c605169e60d32fc321a2f9f465e76cba745489Jens Axboe .update_job = gfio_update_job_op, 13921252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe .timed_out = gfio_client_timed_out, 13931252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe .stop = gfio_client_stop, 13941252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe .start = gfio_client_start, 13951252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe .job_start = gfio_client_job_start, 13961252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe .iolog = gfio_client_iolog, 13971252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe .removed = gfio_client_removed, 13981252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe .eta_msec = FIO_CLIENT_DEF_ETA_MSEC, 13991252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe .stay_connected = 1, 14001252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe .client_type = FIO_CLIENT_TYPE_GUI, 14011252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe}; 1402