Signed-off-by: Stanislav Fomichev <stfomic...@yandex-team.ru>
---
 tools/perf/Documentation/perf-trace.txt |  7 ++++++
 tools/perf/builtin-trace.c              | 39 ++++++++++++++++++++++-----------
 2 files changed, 33 insertions(+), 13 deletions(-)

diff --git a/tools/perf/Documentation/perf-trace.txt 
b/tools/perf/Documentation/perf-trace.txt
index 7da5f75a45f1..301fc9384d93 100644
--- a/tools/perf/Documentation/perf-trace.txt
+++ b/tools/perf/Documentation/perf-trace.txt
@@ -112,9 +112,16 @@ the thread executes on the designated CPUs. Default is to 
monitor all CPUs.
        Trace major pagefaults. To also trace minor pagefaults, specify this
        option twice.
 
+--syscalls::
+       Trace system calls. This options is enabled by default.
+
 EXAMPLES
 --------
 
+Trace only major pagefaults:
+
+ $ perf trace --no-syscalls -f
+
 Trace syscalls, major and minor pagefaults:
 
  $ perf trace -f -f
diff --git a/tools/perf/builtin-trace.c b/tools/perf/builtin-trace.c
index 535f0b504950..90ae4036e5ee 100644
--- a/tools/perf/builtin-trace.c
+++ b/tools/perf/builtin-trace.c
@@ -1212,6 +1212,7 @@ struct trace {
        bool                    summary_only;
        bool                    show_comm;
        bool                    show_tool_stats;
+       bool                    trace_syscalls;
        int                     trace_pgfaults;
 };
 
@@ -1940,17 +1941,19 @@ static int trace__record(struct trace *trace, int argc, 
const char **argv)
        for (i = 0; i < ARRAY_SIZE(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)
@@ -2023,10 +2026,13 @@ static int trace__run(struct trace *trace, int argc, 
const char **argv)
                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;
 
-       perf_evlist__add_vfs_getname(evlist);
+       if (trace->trace_syscalls)
+               perf_evlist__add_vfs_getname(evlist);
 
        if (trace->trace_pgfaults &&
            perf_evlist__add_pgfault(evlist, PERF_COUNT_SW_PAGE_FAULTS_MAJ))
@@ -2432,6 +2438,7 @@ int cmd_trace(int argc, const char **argv, const char 
*prefix __maybe_unused)
                },
                .output = stdout,
                .show_comm = true,
+               .trace_syscalls = true,
        };
        const char *output_name = NULL;
        const char *ev_qualifier_str = NULL;
@@ -2469,6 +2476,7 @@ int cmd_trace(int argc, const char **argv, const char 
*prefix __maybe_unused)
                    "Show only syscall summary with statistics"),
        OPT_BOOLEAN('S', "with-summary", &trace.summary,
                    "Show all syscalls and summary with statistics"),
+       OPT_BOOLEAN(0, "syscalls", &trace.trace_syscalls, "Trace syscalls"),
        OPT_INCR('f', "pgfaults", &trace.trace_pgfaults, "Trace pagefaults"),
        OPT_END()
        };
@@ -2485,6 +2493,11 @@ int cmd_trace(int argc, const char **argv, const char 
*prefix __maybe_unused)
        if (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) {
                err = trace__open_output(&trace, output_name);
                if (err < 0) {
-- 
1.8.3.2

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to