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