|
@@ -1215,6 +1215,7 @@ struct trace {
|
|
bool summary_only;
|
|
bool summary_only;
|
|
bool show_comm;
|
|
bool show_comm;
|
|
bool show_tool_stats;
|
|
bool show_tool_stats;
|
|
|
|
+ bool trace_syscalls;
|
|
int trace_pgfaults;
|
|
int trace_pgfaults;
|
|
};
|
|
};
|
|
|
|
|
|
@@ -1927,17 +1928,19 @@ static int trace__record(struct trace *trace, int argc, const char **argv)
|
|
for (i = 0; i < ARRAY_SIZE(record_args); i++)
|
|
for (i = 0; i < ARRAY_SIZE(record_args); i++)
|
|
rec_argv[j++] = record_args[i];
|
|
rec_argv[j++] = record_args[i];
|
|
|
|
|
|
- for (i = 0; i < sc_args_nr; i++)
|
|
|
|
- rec_argv[j++] = sc_args[i];
|
|
|
|
-
|
|
|
|
- /* event string may be different for older kernels - e.g., RHEL6 */
|
|
|
|
- if (is_valid_tracepoint("raw_syscalls:sys_enter"))
|
|
|
|
- rec_argv[j++] = "raw_syscalls:sys_enter,raw_syscalls:sys_exit";
|
|
|
|
- else if (is_valid_tracepoint("syscalls:sys_enter"))
|
|
|
|
- rec_argv[j++] = "syscalls:sys_enter,syscalls:sys_exit";
|
|
|
|
- else {
|
|
|
|
- pr_err("Neither raw_syscalls nor syscalls events exist.\n");
|
|
|
|
- return -1;
|
|
|
|
|
|
+ if (trace->trace_syscalls) {
|
|
|
|
+ for (i = 0; i < sc_args_nr; i++)
|
|
|
|
+ rec_argv[j++] = sc_args[i];
|
|
|
|
+
|
|
|
|
+ /* event string may be different for older kernels - e.g., RHEL6 */
|
|
|
|
+ if (is_valid_tracepoint("raw_syscalls:sys_enter"))
|
|
|
|
+ rec_argv[j++] = "raw_syscalls:sys_enter,raw_syscalls:sys_exit";
|
|
|
|
+ else if (is_valid_tracepoint("syscalls:sys_enter"))
|
|
|
|
+ rec_argv[j++] = "syscalls:sys_enter,syscalls:sys_exit";
|
|
|
|
+ else {
|
|
|
|
+ pr_err("Neither raw_syscalls nor syscalls events exist.\n");
|
|
|
|
+ return -1;
|
|
|
|
+ }
|
|
}
|
|
}
|
|
|
|
|
|
if (trace->trace_pgfaults & TRACE_PFMAJ)
|
|
if (trace->trace_pgfaults & TRACE_PFMAJ)
|
|
@@ -2010,10 +2013,13 @@ static int trace__run(struct trace *trace, int argc, const char **argv)
|
|
goto out;
|
|
goto out;
|
|
}
|
|
}
|
|
|
|
|
|
- if (perf_evlist__add_syscall_newtp(evlist, trace__sys_enter, trace__sys_exit))
|
|
|
|
|
|
+ if (trace->trace_syscalls &&
|
|
|
|
+ perf_evlist__add_syscall_newtp(evlist, trace__sys_enter,
|
|
|
|
+ trace__sys_exit))
|
|
goto out_error_tp;
|
|
goto out_error_tp;
|
|
|
|
|
|
- perf_evlist__add_vfs_getname(evlist);
|
|
|
|
|
|
+ if (trace->trace_syscalls)
|
|
|
|
+ perf_evlist__add_vfs_getname(evlist);
|
|
|
|
|
|
if ((trace->trace_pgfaults & TRACE_PFMAJ) &&
|
|
if ((trace->trace_pgfaults & TRACE_PFMAJ) &&
|
|
perf_evlist__add_pgfault(evlist, PERF_COUNT_SW_PAGE_FAULTS_MAJ))
|
|
perf_evlist__add_pgfault(evlist, PERF_COUNT_SW_PAGE_FAULTS_MAJ))
|
|
@@ -2215,13 +2221,10 @@ static int trace__replay(struct trace *trace)
|
|
if (evsel == NULL)
|
|
if (evsel == NULL)
|
|
evsel = perf_evlist__find_tracepoint_by_name(session->evlist,
|
|
evsel = perf_evlist__find_tracepoint_by_name(session->evlist,
|
|
"syscalls:sys_enter");
|
|
"syscalls:sys_enter");
|
|
- if (evsel == NULL) {
|
|
|
|
- pr_err("Data file does not have raw_syscalls:sys_enter event\n");
|
|
|
|
- goto out;
|
|
|
|
- }
|
|
|
|
|
|
|
|
- if (perf_evsel__init_syscall_tp(evsel, trace__sys_enter) < 0 ||
|
|
|
|
- perf_evsel__init_sc_tp_ptr_field(evsel, args)) {
|
|
|
|
|
|
+ if (evsel &&
|
|
|
|
+ (perf_evsel__init_syscall_tp(evsel, trace__sys_enter) < 0 ||
|
|
|
|
+ perf_evsel__init_sc_tp_ptr_field(evsel, args))) {
|
|
pr_err("Error during initialize raw_syscalls:sys_enter event\n");
|
|
pr_err("Error during initialize raw_syscalls:sys_enter event\n");
|
|
goto out;
|
|
goto out;
|
|
}
|
|
}
|
|
@@ -2231,13 +2234,9 @@ static int trace__replay(struct trace *trace)
|
|
if (evsel == NULL)
|
|
if (evsel == NULL)
|
|
evsel = perf_evlist__find_tracepoint_by_name(session->evlist,
|
|
evsel = perf_evlist__find_tracepoint_by_name(session->evlist,
|
|
"syscalls:sys_exit");
|
|
"syscalls:sys_exit");
|
|
- if (evsel == NULL) {
|
|
|
|
- pr_err("Data file does not have raw_syscalls:sys_exit event\n");
|
|
|
|
- goto out;
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- if (perf_evsel__init_syscall_tp(evsel, trace__sys_exit) < 0 ||
|
|
|
|
- perf_evsel__init_sc_tp_uint_field(evsel, ret)) {
|
|
|
|
|
|
+ if (evsel &&
|
|
|
|
+ (perf_evsel__init_syscall_tp(evsel, trace__sys_exit) < 0 ||
|
|
|
|
+ perf_evsel__init_sc_tp_uint_field(evsel, ret))) {
|
|
pr_err("Error during initialize raw_syscalls:sys_exit event\n");
|
|
pr_err("Error during initialize raw_syscalls:sys_exit event\n");
|
|
goto out;
|
|
goto out;
|
|
}
|
|
}
|
|
@@ -2440,6 +2439,7 @@ int cmd_trace(int argc, const char **argv, const char *prefix __maybe_unused)
|
|
},
|
|
},
|
|
.output = stdout,
|
|
.output = stdout,
|
|
.show_comm = true,
|
|
.show_comm = true,
|
|
|
|
+ .trace_syscalls = true,
|
|
};
|
|
};
|
|
const char *output_name = NULL;
|
|
const char *output_name = NULL;
|
|
const char *ev_qualifier_str = NULL;
|
|
const char *ev_qualifier_str = NULL;
|
|
@@ -2479,6 +2479,7 @@ int cmd_trace(int argc, const char **argv, const char *prefix __maybe_unused)
|
|
"Show all syscalls and summary with statistics"),
|
|
"Show all syscalls and summary with statistics"),
|
|
OPT_CALLBACK_DEFAULT('F', "pf", &trace.trace_pgfaults, "all|maj|min",
|
|
OPT_CALLBACK_DEFAULT('F', "pf", &trace.trace_pgfaults, "all|maj|min",
|
|
"Trace pagefaults", parse_pagefaults, "maj"),
|
|
"Trace pagefaults", parse_pagefaults, "maj"),
|
|
|
|
+ OPT_BOOLEAN(0, "syscalls", &trace.trace_syscalls, "Trace syscalls"),
|
|
OPT_END()
|
|
OPT_END()
|
|
};
|
|
};
|
|
int err;
|
|
int err;
|
|
@@ -2499,6 +2500,11 @@ int cmd_trace(int argc, const char **argv, const char *prefix __maybe_unused)
|
|
if (trace.summary_only)
|
|
if (trace.summary_only)
|
|
trace.summary = trace.summary_only;
|
|
trace.summary = trace.summary_only;
|
|
|
|
|
|
|
|
+ if (!trace.trace_syscalls && !trace.trace_pgfaults) {
|
|
|
|
+ pr_err("Please specify something to trace.\n");
|
|
|
|
+ return -1;
|
|
|
|
+ }
|
|
|
|
+
|
|
if (output_name != NULL) {
|
|
if (output_name != NULL) {
|
|
err = trace__open_output(&trace, output_name);
|
|
err = trace__open_output(&trace, output_name);
|
|
if (err < 0) {
|
|
if (err < 0) {
|