diff options
Diffstat (limited to 'tools/perf/builtin-trace.c')
-rw-r--r-- | tools/perf/builtin-trace.c | 58 |
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) { |