linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Arnaldo Carvalho de Melo <acme@kernel.org>
To: Ingo Molnar <mingo@kernel.org>
Cc: Clark Williams <williams@redhat.com>,
	linux-kernel@vger.kernel.org, linux-perf-users@vger.kernel.org,
	Jiri Olsa <jolsa@kernel.org>,
	Alexander Shishkin <alexander.shishkin@linux.intel.com>,
	David Ahern <dsahern@gmail.com>,
	Namhyung Kim <namhyung@kernel.org>,
	Peter Zijlstra <peterz@infradead.org>,
	Stephane Eranian <eranian@google.com>,
	Arnaldo Carvalho de Melo <acme@redhat.com>
Subject: [PATCH 28/44] perf annotate: Add support to toggle percent type
Date: Thu,  9 Aug 2018 11:58:06 -0300	[thread overview]
Message-ID: <20180809145822.21391-29-acme@kernel.org> (raw)
In-Reply-To: <20180809145822.21391-1-acme@kernel.org>

From: Jiri Olsa <jolsa@kernel.org>

Add new key bindings to toggle percent type/base in annotation UI browser:

 'p' to switch between local and global percent type
 'b' to switch between hits and perdio percent base

Add the following help messages to the UI browser '?' window:

  ...
  p             Toggle percent type [local/global]
  b             Toggle percent base [period/hits]
  ...

Signed-off-by: Jiri Olsa <jolsa@kernel.org>
Tested-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
Cc: David Ahern <dsahern@gmail.com>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Stephane Eranian <eranian@google.com>
Link: http://lkml.kernel.org/r/20180804130521.11408-17-jolsa@kernel.org
[ Moved percent_type to be the last arg to sym_title(), its an arg to what is being formmated (buf, size) ]
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
---
 tools/perf/ui/browsers/annotate.c | 52 ++++++++++++++++++++++++++++++++++++---
 tools/perf/util/annotate.h        | 16 ++++++++++++
 2 files changed, 64 insertions(+), 4 deletions(-)

diff --git a/tools/perf/ui/browsers/annotate.c b/tools/perf/ui/browsers/annotate.c
index 2a3a34d450d5..1d00e5ec7906 100644
--- a/tools/perf/ui/browsers/annotate.c
+++ b/tools/perf/ui/browsers/annotate.c
@@ -15,6 +15,7 @@
 #include <linux/kernel.h>
 #include <linux/string.h>
 #include <sys/ttydefaults.h>
+#include <asm/bug.h>
 
 struct disasm_line_samples {
 	double		      percent;
@@ -383,9 +384,10 @@ static void ui_browser__init_asm_mode(struct ui_browser *browser)
 #define SYM_TITLE_MAX_SIZE (PATH_MAX + 64)
 
 static int sym_title(struct symbol *sym, struct map *map, char *title,
-		     size_t sz)
+		     size_t sz, int percent_type)
 {
-	return snprintf(title, sz, "%s  %s", sym->name, map->dso->long_name);
+	return snprintf(title, sz, "%s  %s [Percent: %s]", sym->name, map->dso->long_name,
+			percent_type_str(percent_type));
 }
 
 /*
@@ -423,7 +425,7 @@ static bool annotate_browser__callq(struct annotate_browser *browser,
 
 	pthread_mutex_unlock(&notes->lock);
 	symbol__tui_annotate(dl->ops.target.sym, ms->map, evsel, hbt, browser->opts);
-	sym_title(ms->sym, ms->map, title, sizeof(title));
+	sym_title(ms->sym, ms->map, title, sizeof(title), browser->opts->percent_type);
 	ui_browser__show_title(&browser->b, title);
 	return true;
 }
@@ -598,6 +600,7 @@ bool annotate_browser__continue_search_reverse(struct annotate_browser *browser,
 
 static int annotate_browser__show(struct ui_browser *browser, char *title, const char *help)
 {
+	struct annotate_browser *ab = container_of(browser, struct annotate_browser, b);
 	struct map_symbol *ms = browser->priv;
 	struct symbol *sym = ms->sym;
 	char symbol_dso[SYM_TITLE_MAX_SIZE];
@@ -605,7 +608,7 @@ static int annotate_browser__show(struct ui_browser *browser, char *title, const
 	if (ui_browser__show(browser, title, help) < 0)
 		return -1;
 
-	sym_title(sym, ms->map, symbol_dso, sizeof(symbol_dso));
+	sym_title(sym, ms->map, symbol_dso, sizeof(symbol_dso), ab->opts->percent_type);
 
 	ui_browser__gotorc_title(browser, 0, 0);
 	ui_browser__set_color(browser, HE_COLORSET_ROOT);
@@ -613,6 +616,39 @@ static int annotate_browser__show(struct ui_browser *browser, char *title, const
 	return 0;
 }
 
+static void
+switch_percent_type(struct annotation_options *opts, bool base)
+{
+	switch (opts->percent_type) {
+	case PERCENT_HITS_LOCAL:
+		if (base)
+			opts->percent_type = PERCENT_PERIOD_LOCAL;
+		else
+			opts->percent_type = PERCENT_HITS_GLOBAL;
+		break;
+	case PERCENT_HITS_GLOBAL:
+		if (base)
+			opts->percent_type = PERCENT_PERIOD_GLOBAL;
+		else
+			opts->percent_type = PERCENT_HITS_LOCAL;
+		break;
+	case PERCENT_PERIOD_LOCAL:
+		if (base)
+			opts->percent_type = PERCENT_HITS_LOCAL;
+		else
+			opts->percent_type = PERCENT_PERIOD_GLOBAL;
+		break;
+	case PERCENT_PERIOD_GLOBAL:
+		if (base)
+			opts->percent_type = PERCENT_HITS_GLOBAL;
+		else
+			opts->percent_type = PERCENT_PERIOD_LOCAL;
+		break;
+	default:
+		WARN_ON(1);
+	}
+}
+
 static int annotate_browser__run(struct annotate_browser *browser,
 				 struct perf_evsel *evsel,
 				 struct hist_browser_timer *hbt)
@@ -703,6 +739,8 @@ static int annotate_browser__run(struct annotate_browser *browser,
 		"k             Toggle line numbers\n"
 		"P             Print to [symbol_name].annotation file.\n"
 		"r             Run available scripts\n"
+		"p             Toggle percent type [local/global]\n"
+		"b             Toggle percent base [period/hits]\n"
 		"?             Search string backwards\n");
 			continue;
 		case 'r':
@@ -802,6 +840,12 @@ static int annotate_browser__run(struct annotate_browser *browser,
 				notes->options->show_minmax_cycle = true;
 			annotation__update_column_widths(notes);
 			continue;
+		case 'p':
+		case 'b':
+			switch_percent_type(browser->opts, key == 'b');
+			hists__scnprintf_title(hists, title, sizeof(title));
+			annotate_browser__show(&browser->b, title, help);
+			continue;
 		case K_LEFT:
 		case K_ESC:
 		case 'q':
diff --git a/tools/perf/util/annotate.h b/tools/perf/util/annotate.h
index 3d4579e68d28..760a6678edff 100644
--- a/tools/perf/util/annotate.h
+++ b/tools/perf/util/annotate.h
@@ -11,6 +11,7 @@
 #include <linux/list.h>
 #include <linux/rbtree.h>
 #include <pthread.h>
+#include <asm/bug.h>
 
 struct ins_ops;
 
@@ -149,6 +150,21 @@ static inline double annotation_data__percent(struct annotation_data *data,
 	return which < PERCENT_MAX ? data->percent[which] : -1;
 }
 
+static inline const char *percent_type_str(unsigned int type)
+{
+	static const char *str[PERCENT_MAX] = {
+		"local hits",
+		"global hits",
+		"local period",
+		"global period",
+	};
+
+	if (WARN_ON(type >= PERCENT_MAX))
+		return "N/A";
+
+	return str[type];
+}
+
 static inline struct disasm_line *disasm_line(struct annotation_line *al)
 {
 	return al ? container_of(al, struct disasm_line, al) : NULL;
-- 
2.14.4


  parent reply	other threads:[~2018-08-09 15:00 UTC|newest]

Thread overview: 46+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-08-09 14:57 [GIT PULL 00/44] perf/core improvements and fixes Arnaldo Carvalho de Melo
2018-08-09 14:57 ` [PATCH 01/44] perf trace: Associate vfs_getname()'ed pathname with fd returned from 'openat' Arnaldo Carvalho de Melo
2018-08-09 14:57 ` [PATCH 02/44] perf trace: Use beautifiers on syscalls:sys_enter_ handlers Arnaldo Carvalho de Melo
2018-08-09 14:57 ` [PATCH 03/44] perf trace: Rename some syscall_tp methods to raw_syscall Arnaldo Carvalho de Melo
2018-08-09 14:57 ` [PATCH 04/44] perf trace: Allow setting up a syscall_tp struct without a format_field Arnaldo Carvalho de Melo
2018-08-09 14:57 ` [PATCH 05/44] perf trace: Setup struct syscall_tp for syscalls:sys_{enter,exit}_NAME events Arnaldo Carvalho de Melo
2018-08-09 14:57 ` [PATCH 06/44] perf trace: Use perf_evsel__sc_tp_{uint,ptr} for "id"/"args" handling syscalls:* events Arnaldo Carvalho de Melo
2018-08-09 14:57 ` [PATCH 07/44] perf auxtrace: Support for perf report -D for s390 Arnaldo Carvalho de Melo
2018-08-09 14:57 ` [PATCH 08/44] perf report: Add raw report support for s390 auxiliary trace Arnaldo Carvalho de Melo
2018-08-09 14:57 ` [PATCH 09/44] perf report: Add GUI " Arnaldo Carvalho de Melo
2018-08-09 14:57 ` [PATCH 10/44] perf vendor events arm64: Enable JSON events for eMAG Arnaldo Carvalho de Melo
2018-08-09 14:57 ` [PATCH 11/44] perf tools: Drop unneeded bitmap_zero() calls Arnaldo Carvalho de Melo
2018-08-09 14:57 ` [PATCH 12/44] perf bpf: Add 'syscall_enter' probe helper for syscall enter tracepoints Arnaldo Carvalho de Melo
2018-08-09 14:57 ` [PATCH 13/44] perf annotate: Make symbol__annotate_fprintf2() local Arnaldo Carvalho de Melo
2018-08-09 14:57 ` [PATCH 14/44] perf annotate: Make annotation_line__max_percent static Arnaldo Carvalho de Melo
2018-08-09 14:57 ` [PATCH 15/44] perf annotate: Get rid of annotation__scnprintf_samples_period() Arnaldo Carvalho de Melo
2018-08-09 14:57 ` [PATCH 16/44] perf annotate: Rename struct annotation_line::samples* to data* Arnaldo Carvalho de Melo
2018-08-09 14:57 ` [PATCH 17/44] perf annotate: Rename local sample variables to data Arnaldo Carvalho de Melo
2018-08-09 14:57 ` [PATCH 18/44] perf annotate: Rename hist to sym_hist in annotation__calc_percent Arnaldo Carvalho de Melo
2018-08-09 14:57 ` [PATCH 19/44] perf annotate: Loop group events directly in annotation__calc_percent() Arnaldo Carvalho de Melo
2018-08-09 14:57 ` [PATCH 20/44] perf annotate: Switch struct annotation_data::percent to array Arnaldo Carvalho de Melo
2018-08-09 14:57 ` [PATCH 21/44] perf annotate: Add PERCENT_HITS_GLOBAL percent value Arnaldo Carvalho de Melo
2018-08-09 14:58 ` [PATCH 22/44] perf annotate: Add PERCENT_PERIOD_LOCAL " Arnaldo Carvalho de Melo
2018-08-09 14:58 ` [PATCH 23/44] perf annotate: Add PERCENT_PERIOD_GLOBAL " Arnaldo Carvalho de Melo
2018-08-09 14:58 ` [PATCH 24/44] perf annotate: Add percent_type to struct annotation_options Arnaldo Carvalho de Melo
2018-08-09 14:58 ` [PATCH 25/44] perf annotate: Pass struct annotation_options to symbol__calc_lines() Arnaldo Carvalho de Melo
2018-08-09 14:58 ` [PATCH 26/44] perf annotate: Pass 'struct annotation_options' to map_symbol__annotation_dump() Arnaldo Carvalho de Melo
2018-08-09 14:58 ` [PATCH 27/44] perf annotate: Pass browser percent_type in annotate_browser__calc_percent() Arnaldo Carvalho de Melo
2018-08-09 14:58 ` Arnaldo Carvalho de Melo [this message]
2018-08-09 14:58 ` [PATCH 29/44] perf annotate: Make local period the default percent type Arnaldo Carvalho de Melo
2018-08-09 14:58 ` [PATCH 30/44] perf annotate: Display percent type in stdio output Arnaldo Carvalho de Melo
2018-08-09 14:58 ` [PATCH 31/44] perf annotate: Add --percent-type option Arnaldo Carvalho de Melo
2018-08-09 14:58 ` [PATCH 32/44] perf report: " Arnaldo Carvalho de Melo
2018-08-09 14:58 ` [PATCH 33/44] perf bpf: Add struct bpf_map struct Arnaldo Carvalho de Melo
2018-08-09 14:58 ` [PATCH 34/44] perf bpf: Add bpf/stdio.h wrapper to bpf_perf_event_output function Arnaldo Carvalho de Melo
2018-08-09 14:58 ` [PATCH 35/44] perf bpf: Make bpf__for_each_stdout_map() generic Arnaldo Carvalho de Melo
2018-08-09 14:58 ` [PATCH 36/44] perf bpf: Generalize bpf__setup_stdout() Arnaldo Carvalho de Melo
2018-08-09 14:58 ` [PATCH 37/44] perf bpf: Add bpf__setup_output_event() strerror() counterpart Arnaldo Carvalho de Melo
2018-08-09 14:58 ` [PATCH 38/44] perf bpf: Add wrappers to BPF_FUNC_probe_read(_str) functions Arnaldo Carvalho de Melo
2018-08-09 14:58 ` [PATCH 39/44] perf trace: Handle "bpf-output" events associated with "__augmented_syscalls__" BPF map Arnaldo Carvalho de Melo
2018-08-09 14:58 ` [PATCH 40/44] perf bpf: Make bpf__setup_output_event() return the bpf-output event Arnaldo Carvalho de Melo
2018-08-09 14:58 ` [PATCH 41/44] perf trace: Setup the augmented syscalls bpf-output event fields Arnaldo Carvalho de Melo
2018-08-09 14:58 ` [PATCH 42/44] perf trace: Wire up the augmented syscalls with the syscalls:sys_enter_FOO beautifier Arnaldo Carvalho de Melo
2018-08-09 14:58 ` [PATCH 43/44] perf map: Synthesize maps only for thread group leader Arnaldo Carvalho de Melo
2018-08-09 14:58 ` [PATCH 44/44] perf map: Optimize maps__fixup_overlappings() Arnaldo Carvalho de Melo
2018-08-09 15:27 ` [GIT PULL 00/44] perf/core improvements and fixes Kim Phillips

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20180809145822.21391-29-acme@kernel.org \
    --to=acme@kernel.org \
    --cc=acme@redhat.com \
    --cc=alexander.shishkin@linux.intel.com \
    --cc=dsahern@gmail.com \
    --cc=eranian@google.com \
    --cc=jolsa@kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-perf-users@vger.kernel.org \
    --cc=mingo@kernel.org \
    --cc=namhyung@kernel.org \
    --cc=peterz@infradead.org \
    --cc=williams@redhat.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).