diff options
| author | David Ahern <dsa@cumulusnetworks.com> | 2016-11-25 15:00:21 -0500 |
|---|---|---|
| committer | Arnaldo Carvalho de Melo <acme@redhat.com> | 2016-11-29 11:06:19 -0500 |
| commit | 64eff7d9c4469b7e24fb7e5416a67ee5959c3f76 (patch) | |
| tree | bf747b8f36785f989b6a35aa72299a96a61bf8dc /tools/perf | |
| parent | aa58e9afb613fab74f33292705bb43beb0f1828d (diff) | |
perf script: Add option to stop printing callchain
Allow user to specify list of symbols which cause the dump of callchains
to stop at that symbol.
Committer notes:
Testing it:
# perf record -ag usleep 1
[ perf record: Woken up 1 times to write data ]
[ perf record: Captured and wrote 1.177 MB perf.data (33 samples) ]
#
# # Without it:
#
# perf script
swapper 0 [000] 9693.370039: 1 cycles:ppp:
2072ad x86_pmu_enable (/usr/lib/debug/lib/modules/4.8.8-300.fc25.x86_64/vmlinux)
3a29d7 perf_pmu_enable.part.90 (/usr/lib/debug/lib/modules/4.8.8-300.fc25.x86_64/vmlinux)
3a713a ctx_resched (/usr/lib/debug/lib/modules/4.8.8-300.fc25.x86_64/vmlinux)
3a76c1 __perf_event_enable (/usr/lib/debug/lib/modules/4.8.8-300.fc25.x86_64/vmlinux)
3a0390 event_function (/usr/lib/debug/lib/modules/4.8.8-300.fc25.x86_64/vmlinux)
3a1cff remote_function (/usr/lib/debug/lib/modules/4.8.8-300.fc25.x86_64/vmlinux)
326978 flush_smp_call_function_queue (/usr/lib/debug/lib/modules/4.8.8-300.fc25.x86_64/vmlinux)
327413 generic_smp_call_function_single_interrupt (/usr/lib/debug/lib/modules/4.8.8-300.fc25.x86_64/vmlinux)
249b37 smp_call_function_single_interrupt (/usr/lib/debug/lib/modules/4.8.8-300.fc25.x86_64/vmlinux)
a04b2c call_function_single_interrupt (/usr/lib/debug/lib/modules/4.8.8-300.fc25.x86_64/vmlinux)
889427 cpuidle_enter (/usr/lib/debug/lib/modules/4.8.8-300.fc25.x86_64/vmlinux)
2e534a call_cpuidle (/usr/lib/debug/lib/modules/4.8.8-300.fc25.x86_64/vmlinux)
2e5730 cpu_startup_entry (/usr/lib/debug/lib/modules/4.8.8-300.fc25.x86_64/vmlinux)
9f5167 rest_init (/usr/lib/debug/lib/modules/4.8.8-300.fc25.x86_64/vmlinux)
137ffeb start_kernel ([kernel.vmlinux].init.text)
137f2ca x86_64_start_reservations ([kernel.vmlinux].init.text)
137f419 x86_64_start_kernel ([kernel.vmlinux].init.text)
swapper 0 [000] 9693.370044: 1 cycles:ppp:
20ca1b intel_pmu_handle_irq (/usr/lib/debug/lib/modules/4.8.8-300.fc25.x86_64/vmlinux)
205b0c perf_event_nmi_handler (/usr/lib/debug/lib/modules/4.8.8-300.fc25.x86_64/vmlinux)
22a14a nmi_handle (/usr/lib/debug/lib/modules/4.8.8-300.fc25.x86_64/vmlinux)
22a6b3 default_do_nmi (/usr/lib/debug/lib/modules/4.8.8-300.fc25.x86_64/vmlinux)
22a83c do_nmi (/usr/lib/debug/lib/modules/4.8.8-300.fc25.x86_64/vmlinux)
a03fb1 end_repeat_nmi (/usr/lib/debug/lib/modules/4.8.8-300.fc25.x86_64/vmlinux)
3a29d7 perf_pmu_enable.part.90 (/usr/lib/debug/lib/modules/4.8.8-300.fc25.x86_64/vmlinux)
3a713a ctx_resched (/usr/lib/debug/lib/modules/4.8.8-300.fc25.x86_64/vmlinux)
3a76c1 __perf_event_enable (/usr/lib/debug/lib/modules/4.8.8-300.fc25.x86_64/vmlinux)
3a0390 event_function (/usr/lib/debug/lib/modules/4.8.8-300.fc25.x86_64/vmlinux)
3a1cff remote_function (/usr/lib/debug/lib/modules/4.8.8-300.fc25.x86_64/vmlinux)
326978 flush_smp_call_function_queue (/usr/lib/debug/lib/modules/4.8.8-300.fc25.x86_64/vmlinux)
327413 generic_smp_call_function_single_interrupt (/usr/lib/debug/lib/modules/4.8.8-300.fc25.x86_64/vmlinux)
249b37 smp_call_function_single_interrupt (/usr/lib/debug/lib/modules/4.8.8-300.fc25.x86_64/vmlinux)
a04b2c call_function_single_interrupt (/usr/lib/debug/lib/modules/4.8.8-300.fc25.x86_64/vmlinux)
889427 cpuidle_enter (/usr/lib/debug/lib/modules/4.8.8-300.fc25.x86_64/vmlinux)
2e534a call_cpuidle (/usr/lib/debug/lib/modules/4.8.8-300.fc25.x86_64/vmlinux)
2e5730 cpu_startup_entry (/usr/lib/debug/lib/modules/4.8.8-300.fc25.x86_64/vmlinux)
9f5167 rest_init (/usr/lib/debug/lib/modules/4.8.8-300.fc25.x86_64/vmlinux)
137ffeb start_kernel ([kernel.vmlinux].init.text)
137f2ca x86_64_start_reservations ([kernel.vmlinux].init.text)
#
# # Using it to see just what are the calls from the 'remote_function' function:
#
# perf script --stop-bt remote_function
swapper 0 [000] 9693.370039: 1 cycles:ppp:
2072ad x86_pmu_enable (/usr/lib/debug/lib/modules/4.8.8-300.fc25.x86_64/vmlinux)
3a29d7 perf_pmu_enable.part.90 (/usr/lib/debug/lib/modules/4.8.8-300.fc25.x86_64/vmlinux)
3a713a ctx_resched (/usr/lib/debug/lib/modules/4.8.8-300.fc25.x86_64/vmlinux)
3a76c1 __perf_event_enable (/usr/lib/debug/lib/modules/4.8.8-300.fc25.x86_64/vmlinux)
3a0390 event_function (/usr/lib/debug/lib/modules/4.8.8-300.fc25.x86_64/vmlinux)
3a1cff remote_function (/usr/lib/debug/lib/modules/4.8.8-300.fc25.x86_64/vmlinux)
swapper 0 [000] 9693.370044: 1 cycles:ppp:
20ca1b intel_pmu_handle_irq (/usr/lib/debug/lib/modules/4.8.8-300.fc25.x86_64/vmlinux)
205b0c perf_event_nmi_handler (/usr/lib/debug/lib/modules/4.8.8-300.fc25.x86_64/vmlinux)
22a14a nmi_handle (/usr/lib/debug/lib/modules/4.8.8-300.fc25.x86_64/vmlinux)
22a6b3 default_do_nmi (/usr/lib/debug/lib/modules/4.8.8-300.fc25.x86_64/vmlinux)
22a83c do_nmi (/usr/lib/debug/lib/modules/4.8.8-300.fc25.x86_64/vmlinux)
a03fb1 end_repeat_nmi (/usr/lib/debug/lib/modules/4.8.8-300.fc25.x86_64/vmlinux)
3a29d7 perf_pmu_enable.part.90 (/usr/lib/debug/lib/modules/4.8.8-300.fc25.x86_64/vmlinux)
3a713a ctx_resched (/usr/lib/debug/lib/modules/4.8.8-300.fc25.x86_64/vmlinux)
3a76c1 __perf_event_enable (/usr/lib/debug/lib/modules/4.8.8-300.fc25.x86_64/vmlinux)
3a0390 event_function (/usr/lib/debug/lib/modules/4.8.8-300.fc25.x86_64/vmlinux)
3a1cff remote_function (/usr/lib/debug/lib/modules/4.8.8-300.fc25.x86_64/vmlinux)
Signed-off-by: David Ahern <dsa@cumulusnetworks.com>
Tested-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Cc: Jiri Olsa <jolsa@kernel.org>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Link: http://lkml.kernel.org/r/1480104021-36275-1-git-send-email-dsahern@gmail.com
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Diffstat (limited to 'tools/perf')
| -rw-r--r-- | tools/perf/Documentation/perf-script.txt | 3 | ||||
| -rw-r--r-- | tools/perf/builtin-script.c | 2 | ||||
| -rw-r--r-- | tools/perf/util/evsel_fprintf.c | 8 | ||||
| -rw-r--r-- | tools/perf/util/symbol.c | 8 | ||||
| -rw-r--r-- | tools/perf/util/symbol.h | 6 |
5 files changed, 25 insertions, 2 deletions
diff --git a/tools/perf/Documentation/perf-script.txt b/tools/perf/Documentation/perf-script.txt index c01904f388ce..0f6ee09f7256 100644 --- a/tools/perf/Documentation/perf-script.txt +++ b/tools/perf/Documentation/perf-script.txt | |||
| @@ -212,6 +212,9 @@ OPTIONS | |||
| 212 | --hide-call-graph:: | 212 | --hide-call-graph:: |
| 213 | When printing symbols do not display call chain. | 213 | When printing symbols do not display call chain. |
| 214 | 214 | ||
| 215 | --stop-bt:: | ||
| 216 | Stop display of callgraph at these symbols | ||
| 217 | |||
| 215 | -C:: | 218 | -C:: |
| 216 | --cpu:: Only report samples for the list of CPUs provided. Multiple CPUs can | 219 | --cpu:: Only report samples for the list of CPUs provided. Multiple CPUs can |
| 217 | be provided as a comma-separated list with no space: 0,1. Ranges of | 220 | be provided as a comma-separated list with no space: 0,1. Ranges of |
diff --git a/tools/perf/builtin-script.c b/tools/perf/builtin-script.c index e1daff36d070..066b4bf73780 100644 --- a/tools/perf/builtin-script.c +++ b/tools/perf/builtin-script.c | |||
| @@ -2151,6 +2151,8 @@ int cmd_script(int argc, const char **argv, const char *prefix __maybe_unused) | |||
| 2151 | "system-wide collection from all CPUs"), | 2151 | "system-wide collection from all CPUs"), |
| 2152 | OPT_STRING('S', "symbols", &symbol_conf.sym_list_str, "symbol[,symbol...]", | 2152 | OPT_STRING('S', "symbols", &symbol_conf.sym_list_str, "symbol[,symbol...]", |
| 2153 | "only consider these symbols"), | 2153 | "only consider these symbols"), |
| 2154 | OPT_STRING(0, "stop-bt", &symbol_conf.bt_stop_list_str, "symbol[,symbol...]", | ||
| 2155 | "Stop display of callgraph at these symbols"), | ||
| 2154 | OPT_STRING('C', "cpu", &cpu_list, "cpu", "list of cpus to profile"), | 2156 | OPT_STRING('C', "cpu", &cpu_list, "cpu", "list of cpus to profile"), |
| 2155 | OPT_STRING('c', "comms", &symbol_conf.comm_list_str, "comm[,comm...]", | 2157 | OPT_STRING('c', "comms", &symbol_conf.comm_list_str, "comm[,comm...]", |
| 2156 | "only display events for these comms"), | 2158 | "only display events for these comms"), |
diff --git a/tools/perf/util/evsel_fprintf.c b/tools/perf/util/evsel_fprintf.c index 5a6f52284452..6b2925542c0a 100644 --- a/tools/perf/util/evsel_fprintf.c +++ b/tools/perf/util/evsel_fprintf.c | |||
| @@ -166,6 +166,14 @@ int sample__fprintf_callchain(struct perf_sample *sample, int left_alignment, | |||
| 166 | if (!print_oneline) | 166 | if (!print_oneline) |
| 167 | printed += fprintf(fp, "\n"); | 167 | printed += fprintf(fp, "\n"); |
| 168 | 168 | ||
| 169 | if (symbol_conf.bt_stop_list && | ||
| 170 | node->sym && | ||
| 171 | node->sym->name && | ||
| 172 | strlist__has_entry(symbol_conf.bt_stop_list, | ||
| 173 | node->sym->name)) { | ||
| 174 | break; | ||
| 175 | } | ||
| 176 | |||
| 169 | first = false; | 177 | first = false; |
| 170 | next: | 178 | next: |
| 171 | callchain_cursor_advance(cursor); | 179 | callchain_cursor_advance(cursor); |
diff --git a/tools/perf/util/symbol.c b/tools/perf/util/symbol.c index 420ada9de22f..df2482b2ba45 100644 --- a/tools/perf/util/symbol.c +++ b/tools/perf/util/symbol.c | |||
| @@ -2032,6 +2032,10 @@ int symbol__init(struct perf_env *env) | |||
| 2032 | symbol_conf.sym_list_str, "symbol") < 0) | 2032 | symbol_conf.sym_list_str, "symbol") < 0) |
| 2033 | goto out_free_tid_list; | 2033 | goto out_free_tid_list; |
| 2034 | 2034 | ||
| 2035 | if (setup_list(&symbol_conf.bt_stop_list, | ||
| 2036 | symbol_conf.bt_stop_list_str, "symbol") < 0) | ||
| 2037 | goto out_free_sym_list; | ||
| 2038 | |||
| 2035 | /* | 2039 | /* |
| 2036 | * A path to symbols of "/" is identical to "" | 2040 | * A path to symbols of "/" is identical to "" |
| 2037 | * reset here for simplicity. | 2041 | * reset here for simplicity. |
| @@ -2049,6 +2053,8 @@ int symbol__init(struct perf_env *env) | |||
| 2049 | symbol_conf.initialized = true; | 2053 | symbol_conf.initialized = true; |
| 2050 | return 0; | 2054 | return 0; |
| 2051 | 2055 | ||
| 2056 | out_free_sym_list: | ||
| 2057 | strlist__delete(symbol_conf.sym_list); | ||
| 2052 | out_free_tid_list: | 2058 | out_free_tid_list: |
| 2053 | intlist__delete(symbol_conf.tid_list); | 2059 | intlist__delete(symbol_conf.tid_list); |
| 2054 | out_free_pid_list: | 2060 | out_free_pid_list: |
| @@ -2064,6 +2070,7 @@ void symbol__exit(void) | |||
| 2064 | { | 2070 | { |
| 2065 | if (!symbol_conf.initialized) | 2071 | if (!symbol_conf.initialized) |
| 2066 | return; | 2072 | return; |
| 2073 | strlist__delete(symbol_conf.bt_stop_list); | ||
| 2067 | strlist__delete(symbol_conf.sym_list); | 2074 | strlist__delete(symbol_conf.sym_list); |
| 2068 | strlist__delete(symbol_conf.dso_list); | 2075 | strlist__delete(symbol_conf.dso_list); |
| 2069 | strlist__delete(symbol_conf.comm_list); | 2076 | strlist__delete(symbol_conf.comm_list); |
| @@ -2071,6 +2078,7 @@ void symbol__exit(void) | |||
| 2071 | intlist__delete(symbol_conf.pid_list); | 2078 | intlist__delete(symbol_conf.pid_list); |
| 2072 | vmlinux_path__exit(); | 2079 | vmlinux_path__exit(); |
| 2073 | symbol_conf.sym_list = symbol_conf.dso_list = symbol_conf.comm_list = NULL; | 2080 | symbol_conf.sym_list = symbol_conf.dso_list = symbol_conf.comm_list = NULL; |
| 2081 | symbol_conf.bt_stop_list = NULL; | ||
| 2074 | symbol_conf.initialized = false; | 2082 | symbol_conf.initialized = false; |
| 2075 | } | 2083 | } |
| 2076 | 2084 | ||
diff --git a/tools/perf/util/symbol.h b/tools/perf/util/symbol.h index 1bcbefc0c325..6c358b7ed336 100644 --- a/tools/perf/util/symbol.h +++ b/tools/perf/util/symbol.h | |||
| @@ -132,14 +132,16 @@ struct symbol_conf { | |||
| 132 | *pid_list_str, | 132 | *pid_list_str, |
| 133 | *tid_list_str, | 133 | *tid_list_str, |
| 134 | *sym_list_str, | 134 | *sym_list_str, |
| 135 | *col_width_list_str; | 135 | *col_width_list_str, |
| 136 | *bt_stop_list_str; | ||
| 136 | struct strlist *dso_list, | 137 | struct strlist *dso_list, |
| 137 | *comm_list, | 138 | *comm_list, |
| 138 | *sym_list, | 139 | *sym_list, |
| 139 | *dso_from_list, | 140 | *dso_from_list, |
| 140 | *dso_to_list, | 141 | *dso_to_list, |
| 141 | *sym_from_list, | 142 | *sym_from_list, |
| 142 | *sym_to_list; | 143 | *sym_to_list, |
| 144 | *bt_stop_list; | ||
| 143 | struct intlist *pid_list, | 145 | struct intlist *pid_list, |
| 144 | *tid_list; | 146 | *tid_list; |
| 145 | const char *symfs; | 147 | const char *symfs; |
