perf/urgent fixes and improvements
Arnaldo Carvalho de Melo
maintainerHi Ingo,
Please consider pulling,
- Arnaldo
The following changes since commit ac931f87a647ca156f65a4c00e7297165e4fa2d8:
perf: Fix building warning on ARM 32 (2014-12-19 13:09:43 +0100)
are available in the git repository at:
git://git.kernel.org/pub/scm/linux/kernel/git/acme/linux.git tags/perf-urgent-for-mingo
for you to fetch changes up to 82aa019e0098a1e0801df94345c0297448323126:
perf callchain: Append callchains only when requested (2014-12-23 12:06:39 -0300)
----------------------------------------------------------------
perf/urgent fixes and improvements:
User visible:
- Show progress bar in more places while doing histogram processing in the hists browser (Namhyung Kim)
- Print backtrace symbols when segfault occurs in 'report' (Namhyung Kim)
Infrastructure:
- Append callchains only when requested (Namhyung Kim)
----------------------------------------------------------------
Namhyung Kim (3):
perf report: Show progress bar for output resorting perf ui/tui: Print backtrace symbols when segfault occurs perf callchain: Append callchains only when requested
tools/perf/builtin-annotate.c | 2 +- tools/perf/builtin-diff.c | 2 +- tools/perf/builtin-report.c | 24 ++++++++++++++++++++++-- tools/perf/builtin-top.c | 4 ++-- tools/perf/tests/hists_cumulate.c | 2 +- tools/perf/tests/hists_filter.c | 2 +- tools/perf/tests/hists_output.c | 10 +++++----- tools/perf/ui/tui/setup.c | 26 ++++++++++++++++++++++++-- tools/perf/util/hist.c | 17 +++++++++++++---- tools/perf/util/hist.h | 2 +- 10 files changed, 71 insertions(+), 20 deletions(-)
Arnaldo Carvalho de Melo
maintainerPATCH 1/3 perf report: Show progress bar for output resorting
From: Namhyung Kim <[email protected]>
Sometimes it takes a long time to resort hist entries for output in case of a large data file. Show a progress bar window and inform user.
--- tools/perf/builtin-annotate.c | 2 +- tools/perf/builtin-diff.c | 2 +- tools/perf/builtin-report.c | 24 ++++++++++++++++++++++-- tools/perf/builtin-top.c | 4 ++-- tools/perf/tests/hists_cumulate.c | 2 +- tools/perf/tests/hists_filter.c | 2 +- tools/perf/tests/hists_output.c | 10 +++++----- tools/perf/util/hist.c | 10 +++++++++- tools/perf/util/hist.h | 2 +- 9 files changed, 43 insertions(+), 15 deletions(-)
tools/perf/builtin-annotate.c +1 -1
@@ -232,7 +232,7 @@ static int __cmd_annotate(struct perf_annotate *ann)if (nr_samples >0 ) { total_nr_samples += nr_samples;hists__collapse_resort (hists,NULL ); -hists__output_resort (hists); +hists__output_resort (hists,NULL );if (symbol_conf.event_group && !perf_evsel__is_group_leader (pos))
tools/perf/builtin-diff.c +1 -1
@@ -605,7 +605,7 @@ static void hists__process(struct hists *hists)hists__precompute (hists);hists__compute_resort (hists); }else { -hists__output_resort (hists); +hists__output_resort (hists,NULL ); }hists__fprintf (hists, true,0 ,0 ,0 , stdout);
tools/perf/builtin-report.c +22 -2
@@ -457,6 +457,19 @@ static void report__collapse_hists(struct report *rep)ui_progress__finish (); } +static void report__output_resort (struct report *rep) +{ +struct ui_progress prog; +struct perf_evsel *pos; + +ui_progress__init (&prog, rep->nr_entries,"Sorting events for output..." ); + +evlist__for_each (rep->session->evlist, pos) +hists__output_resort (evsel__hists (pos), &prog); + +ui_progress__finish (); +} +static int __cmd_report (struct report *rep) {int ret;
@@ -505,13 +518,20 @@ static int __cmd_report(struct report *rep)if (session_done ())return 0 ; +/* +* recalculate number of entries after collapsing since it +* might be changed during the collapse phase. +*/ + rep->nr_entries =0 ; +evlist__for_each (session->evlist, pos) + rep->nr_entries +=evsel__hists (pos)->nr_entries; +if (rep->nr_entries ==0 ) {ui__error ("The %s file has no samples!\n" , file->path);return 0 ; } -evlist__for_each (session->evlist, pos) -hists__output_resort (evsel__hists (pos)); +report__output_resort (rep);return report__browse_hists (rep); }
tools/perf/builtin-top.c +2 -2
@@ -285,7 +285,7 @@ static void perf_top__print_sym_table(struct perf_top *top) }hists__collapse_resort (hists,NULL ); -hists__output_resort (hists); +hists__output_resort (hists,NULL );hists__output_recalc_col_len (hists, top->print_entries - printed);putchar ('\n' );
@@ -554,7 +554,7 @@ static void perf_top__sort_new_samples(void *arg) }hists__collapse_resort (hists,NULL ); -hists__output_resort (hists); +hists__output_resort (hists,NULL ); }static void *display_thread_tui (void *arg)
tools/perf/tests/hists_cumulate.c +1 -1
@@ -187,7 +187,7 @@ static int do_test(struct hists *hists, struct result *expected, size_t nr_expec* function since TEST_ASSERT_VAL() returns in case of failure. */ hists__collapse_resort (hists,NULL ); -hists__output_resort (hists); +hists__output_resort (hists,NULL );if (verbose >2 ) { pr_info("use callchain: %d, cumulate callchain: %d\n",
tools/perf/tests/hists_filter.c +1 -1
@@ -138,7 +138,7 @@ int test__hists_filter(void)struct hists *hists =evsel__hists (evsel);hists__collapse_resort (hists,NULL ); -hists__output_resort (hists); +hists__output_resort (hists,NULL );if (verbose >2 ) {pr_info ("Normal histogram\n" );
tools/perf/tests/hists_output.c +5 -5
@@ -152,7 +152,7 @@ static int test1(struct perf_evsel *evsel, struct machine *machine) goto out;hists__collapse_resort (hists,NULL ); -hists__output_resort (hists); +hists__output_resort (hists,NULL );if (verbose >2 ) {pr_info ("[fields = %s, sort = %s]\n" , field_order, sort_order);
@@ -252,7 +252,7 @@ static int test2(struct perf_evsel *evsel, struct machine *machine) goto out;hists__collapse_resort (hists,NULL ); -hists__output_resort (hists); +hists__output_resort (hists,NULL );if (verbose >2 ) {pr_info ("[fields = %s, sort = %s]\n" , field_order, sort_order);
@@ -306,7 +306,7 @@ static int test3(struct perf_evsel *evsel, struct machine *machine) goto out;hists__collapse_resort (hists,NULL ); -hists__output_resort (hists); +hists__output_resort (hists,NULL );if (verbose >2 ) {pr_info ("[fields = %s, sort = %s]\n" , field_order, sort_order);
@@ -384,7 +384,7 @@ static int test4(struct perf_evsel *evsel, struct machine *machine) goto out;hists__collapse_resort (hists,NULL ); -hists__output_resort (hists); +hists__output_resort (hists,NULL );if (verbose >2 ) {pr_info ("[fields = %s, sort = %s]\n" , field_order, sort_order);
@@ -487,7 +487,7 @@ static int test5(struct perf_evsel *evsel, struct machine *machine) goto out;hists__collapse_resort (hists,NULL ); -hists__output_resort (hists); +hists__output_resort (hists,NULL );if (verbose >2 ) {pr_info ("[fields = %s, sort = %s]\n" , field_order, sort_order);
tools/perf/util/hist.c +9 -1
@@ -6,6 +6,7 @@#include "evlist.h" #include "evsel.h" #include "annotate.h" +#include "ui/progress.h" #include <math.h> static bool hists__filter_entry_by_dso(struct hists *hists,
@@ -987,6 +988,7 @@ static bool hists__collapse_insert_entry(struct hists *hists __maybe_unused,else p = &(*p)->rb_right; } + hists->nr_entries++;rb_link_node (&he->rb_node_in, parent, p);rb_insert_color (&he->rb_node_in, root);
@@ -1024,7 +1026,10 @@ void hists__collapse_resort(struct hists *hists, struct ui_progress *prog)if (!sort__need_collapse)return ; + hists->nr_entries =0 ; + root =hists__get_rotate_entries_in (hists); + next =rb_first (root);while (next) {
@@ -1119,7 +1124,7 @@ static void __hists__insert_output_entry(struct rb_root *entries,rb_insert_color (&he->rb_node, entries); } -void hists__output_resort (struct hists *hists) +void hists__output_resort (struct hists *hists,struct ui_progress *prog) {struct rb_root *root;struct rb_node *next;
@@ -1148,6 +1153,9 @@ void hists__output_resort(struct hists *hists)if (!n->filtered)hists__calc_col_len (hists, n); + +if (prog) +ui_progress__update (prog,1 ); } }
tools/perf/util/hist.h +1 -1
@@ -121,7 +121,7 @@ int hist_entry__sort_snprintf(struct hist_entry *he, char *bf, size_t size, struct hists *hists);void hist_entry__free (struct hist_entry *); -void hists__output_resort (struct hists *hists); +void hists__output_resort (struct hists *hists,struct ui_progress *prog);void hists__collapse_resort (struct hists *hists,struct ui_progress *prog);void hists__decay_entries (struct hists *hists,bool zap_user,bool zap_kernel);
Signature · 1 line
1.9.3
Arnaldo Carvalho de Melo
maintainerPATCH 2/3 perf ui/tui: Print backtrace symbols when segfault occurs
In reply to Arnaldo Carvalho de MeloFrom: Namhyung Kim <[email protected]>
The output will look like below. (I added an error into ui__init() for the test).
$ perf report perf: Segmentation fault -------- backtrace -------- perf[0x503781] /usr/lib/libc.so.6(+0x33b20)[0x7f1a14f04b20] perf(ui__init+0xd5)[0x503645] perf(setup_browser+0x97)[0x4ce4e7] perf(cmd_report+0xcea)[0x4392ba] perf[0x428493] perf(main+0x60a)[0x427c0a] /usr/lib/libc.so.6(__libc_start_main+0xf0)[0x7f1a14ef1040] perf[0x427d29] [0x0]
--- tools/perf/ui/tui/setup.c | 26 ++++++++++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-)
tools/perf/ui/tui/setup.c +24 -2
@@ -1,5 +1,8 @@#include <signal.h> #include <stdbool.h> +#ifdef HAVE_BACKTRACE_SUPPORT +#include <execinfo.h> +#endif #include "../../util/cache.h" #include "../../util/debug.h"
@@ -88,6 +91,25 @@ int ui__getch(int delay_secs)return SLkp_getkey (); } +#ifdef HAVE_BACKTRACE_SUPPORT +static void ui__signal_backtrace (int sig) +{ +void *stackdump[32 ]; +size_t size; + +ui__exit (false); +psignal (sig,"perf" ); + +printf ("-------- backtrace --------\n" ); + size =backtrace (stackdump,ARRAY_SIZE (stackdump)); +backtrace_symbols_fd (stackdump, size,STDOUT_FILENO ); + +exit (0 ); +} +#else +# define ui__signal_backtrace ui__signal +#endif +static void ui__signal (int sig) {ui__exit (false);
@@ -122,8 +144,8 @@ int ui__init(void)ui_browser__init ();tui_progress__init (); -signal (SIGSEGV , ui__signal); -signal (SIGFPE , ui__signal); +signal (SIGSEGV , ui__signal_backtrace); +signal (SIGFPE , ui__signal_backtrace);signal (SIGINT , ui__signal);signal (SIGQUIT , ui__signal);signal (SIGTERM , ui__signal);
Signature · 1 line
1.9.3
Arnaldo Carvalho de Melo
maintainerPATCH 3/3 perf callchain: Append callchains only when requested
In reply to Arnaldo Carvalho de MeloFrom: Namhyung Kim <[email protected]>
The perf report --children can be called with callchain disabled so no need to append callchains. Actually the root of callchain tree is not initialized properly in this case.
--- tools/perf/util/hist.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-)
tools/perf/util/hist.c +4 -3
@@ -304,7 +304,7 @@ static struct hist_entry *hist_entry__new(struct hist_entry *template,size_t callchain_size =0 ;struct hist_entry *he; -if (symbol_conf.use_callchain || symbol_conf.cumulate_callchain) +if (symbol_conf.use_callchain) callchain_size =sizeof (struct callchain_root ); he =zalloc (sizeof (*he) + callchain_size);
@@ -737,7 +737,7 @@ iter_add_single_cumulative_entry(struct hist_entry_iter *iter, iter->he = he; he_cache[iter->curr++] = he; -callchain_append (he->callchain, &callchain_cursor, sample->period); +hist_entry__append_callchain (he, sample);/* * We need to re-initialize the cursor since callchain_append()
@@ -810,7 +810,8 @@ iter_add_next_cumulative_entry(struct hist_entry_iter *iter, iter->he = he; he_cache[iter->curr++] = he; -callchain_append (he->callchain, &cursor, sample->period); +if (symbol_conf.use_callchain) +callchain_append (he->callchain, &cursor, sample->period);return 0 ; }
Signature · 1 line
1.9.3
Quoted 40 lines · Arnaldo Carvalho de Melo
Hi Ingo,
Please consider pulling,
- Arnaldo
The following changes since commit
ac931f87a647ca156f65a4c00e7297165e4fa2d8:perf: Fix building warning on ARM 32 (2014-12-19 13:09:43 +0100)
are available in the git repository at:
git://git.kernel.org/pub/scm/linux/kernel/git/acme/linux.gittags/perf-urgent-for-mingofor you to fetch changes up to
82aa019e0098a1e0801df94345c0297448323126:perf callchain: Append callchains only when requested (2014-12-23 12:06:39 -0300)
----------------------------------------------------------------
perf/urgent fixes and improvements:User visible:
- Show progress bar in more places while doing histogram processing in the hists browser (Namhyung Kim)
- Print backtrace symbols when segfault occurs in 'report' (Namhyung Kim)
Infrastructure:
- Append callchains only when requested (Namhyung Kim)
Signed-off-by Arnaldo Carvalho de Melo <[email protected]>----------------------------------------------------------------
Namhyung Kim (3):
perf report: Show progress bar for output resorting perf ui/tui: Print backtrace symbols when segfault occurs perf callchain: Append callchains only when requested
Quoted 11 lines
tools/perf/builtin-annotate.c | 2 +- tools/perf/builtin-diff.c | 2 +- tools/perf/builtin-report.c | 24 ++++++++++++++++++++++-- tools/perf/builtin-top.c | 4 ++-- tools/perf/tests/hists_cumulate.c | 2 +- tools/perf/tests/hists_filter.c | 2 +- tools/perf/tests/hists_output.c | 10 +++++----- tools/perf/ui/tui/setup.c | 26 ++++++++++++++++++++++++-- tools/perf/util/hist.c | 17 +++++++++++++---- tools/perf/util/hist.h | 2 +- 10 files changed, 71 insertions(+), 20 deletions(-)
Pulled into tip:perf/urgent, thanks a lot Arnaldo!
Ingo