perf annotate: Introduce the --stdio2 output mode
tip-bot for Arnaldo Carvalho de Melo
merge botCommit-ID: befd2a38a632b1f27ad652fea67c8cf97ce59409 Gitweb: https://git.kernel.org/tip/befd2a38a632b1f27ad652fea67c8cf97ce59409 Author: Arnaldo Carvalho de Melo <[email protected]> AuthorDate: Thu, 15 Mar 2018 23:44:34 -0300 Committer: Arnaldo Carvalho de Melo <[email protected]> CommitDate: Wed, 21 Mar 2018 12:53:26 -0300
perf annotate: Introduce the --stdio2 output mode
This uses the TUI augmented formatting routines, modulo interactivity.
# perf annotate --ignore-vmlinux --stdio2 _raw_spin_lock_irqsave _raw_spin_lock_irqsave() /proc/kcore Event: cycles:ppp
Percent
Disassembly of section load0:
ffffffff9a8734b0 <load0>:
nop
push %rbx
50.00 pushfq
pop %rax
nop
mov %rax,%rbx
cli
nop
xor %eax,%eax
mov $0x1,%edx 50.00 lock cmpxchg %edx,(%rdi)
test %eax,%eax
↓ jne 2b
mov %rbx,%rax
pop %rbx
← retq
2b: mov %eax,%esi
→ callq queued_spin_lock_slowpath
mov %rbx,%rax
pop %rbx
← retq
Tested-by Jin Yao <[email protected]>
Cc Adrian Hunter <[email protected]>
Cc Andi Kleen <[email protected]>
Cc David Ahern <[email protected]>
Cc Jiri Olsa <[email protected]>
Cc Namhyung Kim <[email protected]>
Cc Wang Nan <[email protected]>
Signed-off-by Arnaldo Carvalho de Melo <[email protected]>
--- tools/perf/Documentation/perf-annotate.txt | 2 + tools/perf/builtin-annotate.c | 23 +++++--- tools/perf/util/annotate.c | 92 ++++++++++++++++++++++++++++++ tools/perf/util/annotate.h | 5 ++ 4 files changed, 115 insertions(+), 7 deletions(-)
tools/perf/Documentation/perf-annotate.txt +2 -0
@@ -69,6 +69,8 @@ OPTIONS --stdio:: Use the stdio interface. +--stdio2:: Use the stdio2 interface, non-interactive, uses the TUI formatting. + --stdio-color=<mode>:: 'always', 'never' or 'auto', allowing configuring color output via the command line, in addition to via "color.ui" .perfconfig.
tools/perf/builtin-annotate.c +16 -7
@@ -40,7 +40,7 @@struct perf_annotate {struct perf_tool tool;struct perf_session *session; -bool use_tui, use_stdio, use_gtk; +bool use_tui, use_stdio, use_stdio2, use_gtk;bool full_paths;bool print_line;bool skip_missing;
@@ -202,6 +202,11 @@ static int process_branch_callback(struct perf_evsel *evsel,return ret; } +static bool has_annotation (struct perf_annotate *ann) +{ +return ui__has_annotation () || ann->use_stdio2; +} + static int perf_evsel__add_sample(struct perf_evsel *evsel, struct perf_sample *sample, struct addr_location *al,
@@ -212,7 +217,7 @@ static int perf_evsel__add_sample(struct perf_evsel *evsel,struct hist_entry *he;int ret; -if ((!ann->has_br_stack || !ui__has_annotation ()) && +if ((!ann->has_br_stack || !has_annotation (ann)) && ann->sym_hist_filter !=NULL && (al->sym ==NULL ||strcmp (ann->sym_hist_filter, al->sym->name) !=0 )) {
@@ -236,7 +241,7 @@ static int perf_evsel__add_sample(struct perf_evsel *evsel,*/ process_branch_stack (sample->branch_stack, al, sample); -if (ann->has_br_stack &&ui__has_annotation ()) +if (ann->has_br_stack &&has_annotation (ann))return process_branch_callback (evsel, sample, al, ann, machine); he =hists__add_entry (hists, al,NULL ,NULL ,NULL , sample, true);
@@ -282,8 +287,11 @@ static int hist_entry__tty_annotate(struct hist_entry *he, struct perf_evsel *evsel, struct perf_annotate *ann) { - return symbol__tty_annotate(he->ms.sym, he->ms.map, evsel, - ann->print_line, ann->full_paths, 0, 0); +if (!ann->use_stdio2) +return symbol__tty_annotate (he->ms.sym, he->ms.map, evsel, + ann->print_line, ann->full_paths,0 ,0 ); +return symbol__tty_annotate2 (he->ms.sym, he->ms.map, evsel, + ann->print_line, ann->full_paths); } static void hists__find_annotations(struct hists *hists,
@@ -487,6 +495,7 @@ int cmd_annotate(int argc, const char **argv)OPT_BOOLEAN (0 ,"gtk" , &annotate.use_gtk,"Use the GTK interface" ),OPT_BOOLEAN (0 ,"tui" , &annotate.use_tui,"Use the TUI interface" ),OPT_BOOLEAN (0 ,"stdio" , &annotate.use_stdio,"Use the stdio interface" ), +OPT_BOOLEAN (0 ,"stdio2" , &annotate.use_stdio2,"Use the stdio interface" ),OPT_STRING ('k' ,"vmlinux" , &symbol_conf.vmlinux_name,"file" ,"vmlinux pathname" ), OPT_BOOLEAN('m', "modules", &symbol_conf.use_modules,
@@ -569,7 +578,7 @@ int cmd_annotate(int argc, const char **argv)if (ret <0 ) goto out_delete; -if (annotate.use_stdio) +if (annotate.use_stdio || annotate.use_stdio2) use_browser =0 ;else if (annotate.use_tui) use_browser =1 ;
@@ -578,7 +587,7 @@ int cmd_annotate(int argc, const char **argv)setup_browser (true); -if (use_browser ==1 && annotate.has_br_stack) { +if ((use_browser ==1 || annotate.use_stdio2) && annotate.has_br_stack) { sort__mode =SORT_MODE__BRANCH ;if (setup_sorting (annotate.session->evlist) <0 )usage_with_options (annotate_usage, options);
tools/perf/util/annotate.c +92 -0
104 lines not on this page · raw message
tools/perf/util/annotate.h +5 -0
@@ -281,6 +281,7 @@ int symbol__strerror_disassemble(struct symbol *sym, struct map *map,int symbol__annotate_printf (struct symbol *sym,struct map *map,struct perf_evsel *evsel,bool full_paths,int min_pcnt,int max_lines,int context); +int symbol__annotate_fprintf2 (struct symbol *sym,FILE *fp);void symbol__annotate_zero_histogram (struct symbol *sym,int evidx);void symbol__annotate_decay_histogram (struct symbol *sym,int evidx);void annotated_source__purge (struct annotated_source *as);
@@ -291,6 +292,10 @@ int symbol__tty_annotate(struct symbol *sym, struct map *map, struct perf_evsel *evsel, bool print_lines, bool full_paths, int min_pcnt, int max_lines); +int symbol__tty_annotate2 (struct symbol *sym,struct map *map, +struct perf_evsel *evsel,bool print_lines, +bool full_paths); +#ifdef HAVE_SLANG_SUPPORT int symbol__tui_annotate(struct symbol *sym, struct map *map, struct perf_evsel *evsel,