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

Commit f9224c5c authored by Arnaldo Carvalho de Melo's avatar Arnaldo Carvalho de Melo Committed by Ingo Molnar
Browse files

perf report: Implement initial UI using newt



Newt has widespread availability and provides a rather simple
API as can be seen by the size of this patch.

The work needed to support it will benefit other frontends too.

In this initial patch it just checks if the output is a tty, if
not it falls back to the previous behaviour, also if
newt-devel/libnewt-dev is not installed the previous behaviour
is maintaned.

Pressing enter on a symbol will annotate it, ESC in the
annotation window will return to the report symbol list.

More work will be done to remove the special casing in
color_fprintf, stop using fmemopen/FILE in the printing of
hist_entries, etc.

Also the annotation doesn't need to be done via spawning "perf
annotate" and then browsing its output, we can do better by
calling directly the builtin-annotate.c functions, that would
then be moved to tools/perf/util/annotate.c and shared with perf
top, etc

But lets go by baby steps, this patch already improves perf
usability by allowing to quickly do annotations on symbols from
the report screen and provides a first experimentation with
libnewt/TUI integration of tools.

Tested on RHEL5 and Fedora12 X86_64 and on Debian PARISC64 to
browse a perf.data file collected on a Fedora12 x86_64 box.

Signed-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
Cc: Avi Kivity <avi@redhat.com>
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: <1268349164-5822-5-git-send-email-acme@infradead.org>
Signed-off-by: default avatarIngo Molnar <mingo@elte.hu>
parent dd2ee78d
Loading
Loading
Loading
Loading
+8 −0
Original line number Diff line number Diff line
@@ -513,6 +513,14 @@ else
	LIB_OBJS += util/probe-finder.o
endif

ifneq ($(shell sh -c "(echo '\#include <newt.h>'; echo 'int main(void) { newtInit(); newtCls(); return newtFinished(); }') | $(CC) -x c - $(ALL_CFLAGS) -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 -lnewt -o $(BITBUCKET) $(ALL_LDFLAGS) $(EXTLIBS) "$(QUIET_STDERR)" && echo y"), y)
	msg := $(warning newt not found, disables TUI support. Please install newt-devel or libnewt-dev);
	BASIC_CFLAGS += -DNO_NEWT_SUPPORT
else
	EXTLIBS += -lnewt
	LIB_OBJS += util/newt.o
endif

ifndef NO_LIBPERL
PERL_EMBED_LDOPTS = `perl -MExtUtils::Embed -e ldopts 2>/dev/null`
PERL_EMBED_CCOPTS = `perl -MExtUtils::Embed -e ccopts 2>/dev/null`
+28 −19
Original line number Diff line number Diff line
@@ -267,6 +267,7 @@ static int __cmd_report(void)
	int ret = -EINVAL;
	struct perf_session *session;
	struct rb_node *next;
	const char *help = "For a higher level overview, try: perf report --sort comm,dso";

	session = perf_session__new(input_name, O_RDONLY, force);
	if (session == NULL)
@@ -301,6 +302,11 @@ static int __cmd_report(void)
		stats = rb_entry(next, struct event_stat_id, rb_node);
		perf_session__collapse_resort(&stats->hists);
		perf_session__output_resort(&stats->hists, stats->stats.total);

		if (use_browser)
			perf_session__browse_hists(&stats->hists,
						   stats->stats.total, help);
		else {
			if (rb_first(&session->stats_by_id) ==
			    rb_last(&session->stats_by_id))
				fprintf(stdout, "# Samples: %Ld\n#\n",
@@ -313,19 +319,22 @@ static int __cmd_report(void)
			perf_session__fprintf_hists(&stats->hists, NULL, false, stdout,
					    stats->stats.total);
			fprintf(stdout, "\n\n");
		}

		next = rb_next(&stats->rb_node);
	}

	if (sort_order == default_sort_order &&
	    parent_pattern == default_parent_pattern)
		fprintf(stdout, "#\n# (For a higher level overview, try: perf report --sort comm,dso)\n#\n");
	if (!use_browser && sort_order == default_sort_order &&
	    parent_pattern == default_parent_pattern) {
		fprintf(stdout, "#\n# (%s)\n#\n", help);

		if (show_threads) {
		bool raw_printing_style = !strcmp(pretty_printing_style, "raw");
			bool style = !strcmp(pretty_printing_style, "raw");
			perf_read_values_display(stdout, &show_threads_values,
					 raw_printing_style);
						 style);
			perf_read_values_destroy(&show_threads_values);
		}
	}
out_delete:
	perf_session__delete(session);
	return ret;
@@ -447,7 +456,7 @@ int cmd_report(int argc, const char **argv, const char *prefix __used)
{
	argc = parse_options(argc, argv, options, report_usage, 0);

	setup_pager();
	setup_browser();

	if (symbol__init() < 0)
		return -1;
+2 −0
Original line number Diff line number Diff line
@@ -265,6 +265,8 @@ static int run_builtin(struct cmd_struct *p, int argc, const char **argv)
	if (status)
		return status & 0xff;

	exit_browser();

	/* Somebody closed stdout? */
	if (fstat(fileno(stdout), &st))
		return 0;
+14 −0
Original line number Diff line number Diff line
#ifndef __PERF_CACHE_H
#define __PERF_CACHE_H

#include <stdbool.h>
#include "util.h"
#include "strbuf.h"
#include "../perf.h"
@@ -69,6 +70,19 @@ extern const char *pager_program;
extern int pager_in_use(void);
extern int pager_use_color;

extern bool use_browser;

#ifdef NO_NEWT_SUPPORT
static inline void setup_browser(void)
{
	setup_pager();
}
static inline void exit_browser(void) {}
#else
void setup_browser(void);
void exit_browser(void);
#endif

extern const char *editor_program;
extern const char *excludes_file;

+4 −1
Original line number Diff line number Diff line
@@ -203,6 +203,9 @@ int color_fprintf(FILE *fp, const char *color, const char *fmt, ...)
	int r;

	va_start(args, fmt);
	if (use_browser)
		r = vfprintf(fp, fmt, args);
	else
		r = color_vfprintf(fp, color, fmt, args);
	va_end(args);
	return r;
Loading