aboutsummaryrefslogtreecommitdiffstats
path: root/tools/perf/builtin-trace.c
diff options
context:
space:
mode:
Diffstat (limited to 'tools/perf/builtin-trace.c')
-rw-r--r--tools/perf/builtin-trace.c58
1 files changed, 32 insertions, 26 deletions
diff --git a/tools/perf/builtin-trace.c b/tools/perf/builtin-trace.c
index 0b58e24c7ccb..dc7a694b61fe 100644
--- a/tools/perf/builtin-trace.c
+++ b/tools/perf/builtin-trace.c
@@ -1215,6 +1215,7 @@ struct trace {
1215 bool summary_only; 1215 bool summary_only;
1216 bool show_comm; 1216 bool show_comm;
1217 bool show_tool_stats; 1217 bool show_tool_stats;
1218 bool trace_syscalls;
1218 int trace_pgfaults; 1219 int trace_pgfaults;
1219}; 1220};
1220 1221
@@ -1927,17 +1928,19 @@ static int trace__record(struct trace *trace, int argc, const char **argv)
1927 for (i = 0; i < ARRAY_SIZE(record_args); i++) 1928 for (i = 0; i < ARRAY_SIZE(record_args); i++)
1928 rec_argv[j++] = record_args[i]; 1929 rec_argv[j++] = record_args[i];
1929 1930
1930 for (i = 0; i < sc_args_nr; i++) 1931 if (trace->trace_syscalls) {
1931 rec_argv[j++] = sc_args[i]; 1932 for (i = 0; i < sc_args_nr; i++)
1932 1933 rec_argv[j++] = sc_args[i];
1933 /* event string may be different for older kernels - e.g., RHEL6 */ 1934
1934 if (is_valid_tracepoint("raw_syscalls:sys_enter")) 1935 /* event string may be different for older kernels - e.g., RHEL6 */
1935 rec_argv[j++] = "raw_syscalls:sys_enter,raw_syscalls:sys_exit"; 1936 if (is_valid_tracepoint("raw_syscalls:sys_enter"))
1936 else if (is_valid_tracepoint("syscalls:sys_enter")) 1937 rec_argv[j++] = "raw_syscalls:sys_enter,raw_syscalls:sys_exit";
1937 rec_argv[j++] = "syscalls:sys_enter,syscalls:sys_exit"; 1938 else if (is_valid_tracepoint("syscalls:sys_enter"))
1938 else { 1939 rec_argv[j++] = "syscalls:sys_enter,syscalls:sys_exit";
1939 pr_err("Neither raw_syscalls nor syscalls events exist.\n"); 1940 else {
1940 return -1; 1941 pr_err("Neither raw_syscalls nor syscalls events exist.\n");
1942 return -1;
1943 }
1941 } 1944 }
1942 1945
1943 if (trace->trace_pgfaults & TRACE_PFMAJ) 1946 if (trace->trace_pgfaults & TRACE_PFMAJ)
@@ -2010,10 +2013,13 @@ static int trace__run(struct trace *trace, int argc, const char **argv)
2010 goto out; 2013 goto out;
2011 } 2014 }
2012 2015
2013 if (perf_evlist__add_syscall_newtp(evlist, trace__sys_enter, trace__sys_exit)) 2016 if (trace->trace_syscalls &&
2017 perf_evlist__add_syscall_newtp(evlist, trace__sys_enter,
2018 trace__sys_exit))
2014 goto out_error_tp; 2019 goto out_error_tp;
2015 2020
2016 perf_evlist__add_vfs_getname(evlist); 2021 if (trace->trace_syscalls)
2022 perf_evlist__add_vfs_getname(evlist);
2017 2023
2018 if ((trace->trace_pgfaults & TRACE_PFMAJ) && 2024 if ((trace->trace_pgfaults & TRACE_PFMAJ) &&
2019 perf_evlist__add_pgfault(evlist, PERF_COUNT_SW_PAGE_FAULTS_MAJ)) 2025 perf_evlist__add_pgfault(evlist, PERF_COUNT_SW_PAGE_FAULTS_MAJ))
@@ -2215,13 +2221,10 @@ static int trace__replay(struct trace *trace)
2215 if (evsel == NULL) 2221 if (evsel == NULL)
2216 evsel = perf_evlist__find_tracepoint_by_name(session->evlist, 2222 evsel = perf_evlist__find_tracepoint_by_name(session->evlist,
2217 "syscalls:sys_enter"); 2223 "syscalls:sys_enter");
2218 if (evsel == NULL) {
2219 pr_err("Data file does not have raw_syscalls:sys_enter event\n");
2220 goto out;
2221 }
2222 2224
2223 if (perf_evsel__init_syscall_tp(evsel, trace__sys_enter) < 0 || 2225 if (evsel &&
2224 perf_evsel__init_sc_tp_ptr_field(evsel, args)) { 2226 (perf_evsel__init_syscall_tp(evsel, trace__sys_enter) < 0 ||
2227 perf_evsel__init_sc_tp_ptr_field(evsel, args))) {
2225 pr_err("Error during initialize raw_syscalls:sys_enter event\n"); 2228 pr_err("Error during initialize raw_syscalls:sys_enter event\n");
2226 goto out; 2229 goto out;
2227 } 2230 }
@@ -2231,13 +2234,9 @@ static int trace__replay(struct trace *trace)
2231 if (evsel == NULL) 2234 if (evsel == NULL)
2232 evsel = perf_evlist__find_tracepoint_by_name(session->evlist, 2235 evsel = perf_evlist__find_tracepoint_by_name(session->evlist,
2233 "syscalls:sys_exit"); 2236 "syscalls:sys_exit");
2234 if (evsel == NULL) { 2237 if (evsel &&
2235 pr_err("Data file does not have raw_syscalls:sys_exit event\n"); 2238 (perf_evsel__init_syscall_tp(evsel, trace__sys_exit) < 0 ||
2236 goto out; 2239 perf_evsel__init_sc_tp_uint_field(evsel, ret))) {
2237 }
2238
2239 if (perf_evsel__init_syscall_tp(evsel, trace__sys_exit) < 0 ||
2240 perf_evsel__init_sc_tp_uint_field(evsel, ret)) {
2241 pr_err("Error during initialize raw_syscalls:sys_exit event\n"); 2240 pr_err("Error during initialize raw_syscalls:sys_exit event\n");
2242 goto out; 2241 goto out;
2243 } 2242 }
@@ -2440,6 +2439,7 @@ int cmd_trace(int argc, const char **argv, const char *prefix __maybe_unused)
2440 }, 2439 },
2441 .output = stdout, 2440 .output = stdout,
2442 .show_comm = true, 2441 .show_comm = true,
2442 .trace_syscalls = true,
2443 }; 2443 };
2444 const char *output_name = NULL; 2444 const char *output_name = NULL;
2445 const char *ev_qualifier_str = NULL; 2445 const char *ev_qualifier_str = NULL;
@@ -2479,6 +2479,7 @@ int cmd_trace(int argc, const char **argv, const char *prefix __maybe_unused)
2479 "Show all syscalls and summary with statistics"), 2479 "Show all syscalls and summary with statistics"),
2480 OPT_CALLBACK_DEFAULT('F', "pf", &trace.trace_pgfaults, "all|maj|min", 2480 OPT_CALLBACK_DEFAULT('F', "pf", &trace.trace_pgfaults, "all|maj|min",
2481 "Trace pagefaults", parse_pagefaults, "maj"), 2481 "Trace pagefaults", parse_pagefaults, "maj"),
2482 OPT_BOOLEAN(0, "syscalls", &trace.trace_syscalls, "Trace syscalls"),
2482 OPT_END() 2483 OPT_END()
2483 }; 2484 };
2484 int err; 2485 int err;
@@ -2499,6 +2500,11 @@ int cmd_trace(int argc, const char **argv, const char *prefix __maybe_unused)
2499 if (trace.summary_only) 2500 if (trace.summary_only)
2500 trace.summary = trace.summary_only; 2501 trace.summary = trace.summary_only;
2501 2502
2503 if (!trace.trace_syscalls && !trace.trace_pgfaults) {
2504 pr_err("Please specify something to trace.\n");
2505 return -1;
2506 }
2507
2502 if (output_name != NULL) { 2508 if (output_name != NULL) {
2503 err = trace__open_output(&trace, output_name); 2509 err = trace__open_output(&trace, output_name);
2504 if (err < 0) { 2510 if (err < 0) {