Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 6e7ab4c6 authored by Arnaldo Carvalho de Melo's avatar Arnaldo Carvalho de Melo
Browse files

perf TUI: Show filters on the title and add help line about how to zoom out



Suggested-by: default avatarIngo Molnar <molnar@elte.hu>
Cc: Frédéric Weisbecker <fweisbec@gmail.com>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Paul Mackerras <paulus@samba.org>
LKML-Reference: <new-submission>
Signed-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
parent ca7e0c61
Loading
Loading
Loading
Loading
+68 −28
Original line number Diff line number Diff line
@@ -411,7 +411,7 @@ static void hist_browser__delete(struct hist_browser *self)
}

static int hist_browser__populate(struct hist_browser *self, struct rb_root *hists,
				  u64 nr_hists, u64 session_total)
				  u64 nr_hists, u64 session_total, const char *title)
{
	int max_len = 0, idx, cols, rows;
	struct ui_progress *progress;
@@ -476,7 +476,7 @@ static int hist_browser__populate(struct hist_browser *self, struct rb_root *his
		newtListboxSetWidth(self->tree, max_len);

	newtCenteredWindow(max_len + (symbol_conf.use_callchain ? 5 : 0),
			   rows - 5, "Report");
			   rows - 5, title);
	self->form = newt_form__new();
	if (self->form == NULL)
		return -1;
@@ -495,7 +495,7 @@ enum hist_filter {
	HIST_FILTER__THREAD,
};

static u64 hists__filter_by_dso(struct rb_root *hists, struct dso *dso,
static u64 hists__filter_by_dso(struct rb_root *hists, const struct dso *dso,
				u64 *session_total)
{
	struct rb_node *nd;
@@ -560,25 +560,47 @@ static struct thread *hist_browser__selected_thread(struct hist_browser *self)
	return *(struct thread **)(self->selection + 1);
}

static int hist_browser__title(char *bf, size_t size, const char *input_name,
			       const struct dso *dso, const struct thread *thread)
{
	int printed = 0;

	if (thread)
		printed += snprintf(bf + printed, size - printed,
				    "Thread: %s(%d)",
				    (thread->comm_set ?  thread->comm : ""),
				    thread->pid);
	if (dso)
		printed += snprintf(bf + printed, size - printed,
				    "%sDSO: %s", thread ? " " : "",
				    dso->short_name);
	return printed ?: snprintf(bf, size, "Report: %s", input_name);
}

int perf_session__browse_hists(struct rb_root *hists, u64 nr_hists,
			       u64 session_total, const char *helpline,
			       const char *input_name)
{
	struct hist_browser *browser = hist_browser__new();
	const struct thread *thread_filter = NULL;
	const struct dso *dso_filter = NULL;
	struct newtExitStruct es;
	bool dso_filtered = false, thread_filtered = false;
	char msg[160];
	int err = -1;
	struct hist_browser *browser = hist_browser__new();

	if (browser == NULL)
		return -1;

	newtPushHelpLine(helpline);

	if (hist_browser__populate(browser, hists, nr_hists, session_total) < 0)
	hist_browser__title(msg, sizeof(msg), input_name,
			    dso_filter, thread_filter);
	if (hist_browser__populate(browser, hists, nr_hists, session_total, msg) < 0)
		goto out;

	while (1) {
		const struct thread *thread;
		const struct dso *dso;
		char *options[16];
		int nr_options = 0, choice = 0, i,
		    annotate = -2, zoom_dso = -2, zoom_thread = -2;
@@ -602,20 +624,21 @@ int perf_session__browse_hists(struct rb_root *hists, u64 nr_hists,
			     browser->selection->sym->name) > 0)
			annotate = nr_options++;

		if (browser->selection->map != NULL &&
		    asprintf(&options[nr_options], "Zoom %s %s DSO",
			     dso_filtered ? "out of" : "into",
			     (browser->selection->map->dso->kernel ? "the Kernel" :
			      browser->selection->map->dso->short_name)) > 0)
			zoom_dso = nr_options++;

		thread = hist_browser__selected_thread(browser);
		if (thread != NULL &&
		    asprintf(&options[nr_options], "Zoom %s %s(%d) thread",
			     (thread_filtered ? "out of" : "into"),
			     (thread->comm_set ?  thread->comm : ""), thread->pid) > 0)
			     (thread_filter ? "out of" : "into"),
			     (thread->comm_set ? thread->comm : ""),
			     thread->pid) > 0)
			zoom_thread = nr_options++;

		dso = browser->selection->map ? browser->selection->map->dso : NULL;
		if (dso != NULL &&
		    asprintf(&options[nr_options], "Zoom %s %s DSO",
			     (dso_filter ? "out of" : "into"),
			     (dso->kernel ? "the Kernel" : dso->short_name)) > 0)
			zoom_dso = nr_options++;

		options[nr_options++] = (char *)"Exit";

		choice = popup_menu(nr_options, options);
@@ -637,22 +660,39 @@ int perf_session__browse_hists(struct rb_root *hists, u64 nr_hists,
						 "kallsyms file");
				continue;
			}
			map_symbol__annotate_browser(browser->selection,
						     input_name);
			map_symbol__annotate_browser(browser->selection, input_name);
		} else if (choice == zoom_dso) {
			nr_hists = hists__filter_by_dso(hists,
							(dso_filtered ? NULL :
							 browser->selection->map->dso),
							&session_total);
			dso_filtered = !dso_filtered;
			if (hist_browser__populate(browser, hists, nr_hists, session_total) < 0)
			if (dso_filter) {
				newtPopHelpLine();
				dso_filter = NULL;
			} else {
				snprintf(msg, sizeof(msg),
					 "To zoom out press -> + \"Zoom out of %s DSO\"",
					 dso->kernel ? "the Kernel" : dso->short_name);
				newtPushHelpLine(msg);
				dso_filter = dso;
			}
			nr_hists = hists__filter_by_dso(hists, dso_filter, &session_total);
			hist_browser__title(msg, sizeof(msg), input_name,
					    dso_filter, thread_filter);
			if (hist_browser__populate(browser, hists, nr_hists, session_total, msg) < 0)
				goto out;
		} else if (choice == zoom_thread) {
			nr_hists = hists__filter_by_thread(hists,
							   (thread_filtered ? NULL : thread),
							   &session_total);
			thread_filtered = !thread_filtered;
			if (hist_browser__populate(browser, hists, nr_hists, session_total) < 0)
			if (thread_filter) {
				newtPopHelpLine();
				thread_filter = NULL;
			} else {
				snprintf(msg, sizeof(msg),
					 "To zoom out press -> + \"Zoom out of %s(%d) thread\"",
					 (thread->comm_set ? thread->comm : ""),
					 thread->pid);
				newtPushHelpLine(msg);
				thread_filter = thread;
			}
			nr_hists = hists__filter_by_thread(hists, thread_filter, &session_total);
			hist_browser__title(msg, sizeof(msg), input_name,
					    dso_filter, thread_filter);
			if (hist_browser__populate(browser, hists, nr_hists, session_total, msg) < 0)
				goto out;
		}
	}