perf callchain: Add option to skip ignore symbol when printing callchains
authorNamhyung Kim <namhyung@kernel.org>
Thu, 24 Nov 2016 01:11:13 +0000 (10:11 +0900)
committerArnaldo Carvalho de Melo <acme@redhat.com>
Fri, 25 Nov 2016 13:49:38 +0000 (10:49 -0300)
For tracepoint events, callchains always contain certain functions.
Sometimes it'd be better to skip those functions as they have no value.

Signed-off-by: Namhyung Kim <namhyung@kernel.org>
Tested-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Cc: Andi Kleen <andi@firstfloor.org>
Cc: David Ahern <dsahern@gmail.com>
Cc: Jiri Olsa <jolsa@kernel.org>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Stephane Eranian <eranian@google.com>
Link: http://lkml.kernel.org/r/20161124011114.7102-2-namhyung@kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
tools/perf/builtin-sched.c
tools/perf/util/evsel.h
tools/perf/util/evsel_fprintf.c

index 829468defa07e9b54606987703b05dae9e60c6de..43fcc13e402d6d3ae9c190498752dd2541894780 100644 (file)
@@ -1876,7 +1876,8 @@ static void timehist_print_sample(struct perf_sched *sched,
 
        sample__fprintf_sym(sample, al, 0,
                            EVSEL__PRINT_SYM | EVSEL__PRINT_ONELINE |
-                           EVSEL__PRINT_CALLCHAIN_ARROW,
+                           EVSEL__PRINT_CALLCHAIN_ARROW |
+                           EVSEL__PRINT_SKIP_IGNORED,
                            &callchain_cursor, stdout);
 
 out:
index 27fa3a3435779da75dd15f07ce07e49ccfdd3947..6abb89cd27f95e1c11cdd25786b0cade3a804fe6 100644 (file)
@@ -392,6 +392,7 @@ int perf_evsel__fprintf(struct perf_evsel *evsel,
 #define EVSEL__PRINT_SRCLINE           (1<<5)
 #define EVSEL__PRINT_UNKNOWN_AS_ADDR   (1<<6)
 #define EVSEL__PRINT_CALLCHAIN_ARROW   (1<<7)
+#define EVSEL__PRINT_SKIP_IGNORED      (1<<8)
 
 struct callchain_cursor;
 
index 53bb614feafb0a4d27b135abbca5e721d23ee4d5..5a6f52284452e2ea07be12f5eff85ea306356470 100644 (file)
@@ -109,6 +109,7 @@ int sample__fprintf_callchain(struct perf_sample *sample, int left_alignment,
        int print_srcline = print_opts & EVSEL__PRINT_SRCLINE;
        int print_unknown_as_addr = print_opts & EVSEL__PRINT_UNKNOWN_AS_ADDR;
        int print_arrow = print_opts & EVSEL__PRINT_CALLCHAIN_ARROW;
+       int print_skip_ignored = print_opts & EVSEL__PRINT_SKIP_IGNORED;
        char s = print_oneline ? ' ' : '\t';
        bool first = true;
 
@@ -124,6 +125,9 @@ int sample__fprintf_callchain(struct perf_sample *sample, int left_alignment,
                        if (!node)
                                break;
 
+                       if (node->sym && node->sym->ignore && print_skip_ignored)
+                               goto next;
+
                        printed += fprintf(fp, "%-*.*s", left_alignment, left_alignment, " ");
 
                        if (print_arrow && !first)
@@ -162,8 +166,9 @@ int sample__fprintf_callchain(struct perf_sample *sample, int left_alignment,
                        if (!print_oneline)
                                printed += fprintf(fp, "\n");
 
-                       callchain_cursor_advance(cursor);
                        first = false;
+next:
+                       callchain_cursor_advance(cursor);
                }
        }