aboutsummaryrefslogtreecommitdiffstats
path: root/tools/perf
diff options
context:
space:
mode:
authorDavid Ahern <dsa@cumulusnetworks.com>2016-11-25 15:00:21 -0500
committerArnaldo Carvalho de Melo <acme@redhat.com>2016-11-29 11:06:19 -0500
commit64eff7d9c4469b7e24fb7e5416a67ee5959c3f76 (patch)
treebf747b8f36785f989b6a35aa72299a96a61bf8dc /tools/perf
parentaa58e9afb613fab74f33292705bb43beb0f1828d (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.txt3
-rw-r--r--tools/perf/builtin-script.c2
-rw-r--r--tools/perf/util/evsel_fprintf.c8
-rw-r--r--tools/perf/util/symbol.c8
-rw-r--r--tools/perf/util/symbol.h6
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;
170next: 178next:
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
2056out_free_sym_list:
2057 strlist__delete(symbol_conf.sym_list);
2052out_free_tid_list: 2058out_free_tid_list:
2053 intlist__delete(symbol_conf.tid_list); 2059 intlist__delete(symbol_conf.tid_list);
2054out_free_pid_list: 2060out_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;