perf record: Respect --no-switch-events
authorAdrian Hunter <adrian.hunter@intel.com>
Thu, 28 May 2020 12:08:58 +0000 (15:08 +0300)
committerArnaldo Carvalho de Melo <acme@redhat.com>
Thu, 28 May 2020 14:33:36 +0000 (11:33 -0300)
Context switch events are added automatically by Intel PT and Coresight.

Make it possible to suppress them. That is useful for tracing the
scheduler without the disturbance that the switch event processing
creates.

Example:

  Prerequisites:

    $ which perf
    ~/bin/perf
    $ sudo setcap "cap_sys_rawio,cap_sys_admin,cap_sys_ptrace,cap_syslog,cap_ipc_lock=ep" ~/bin/perf
    $ sudo chmod +r /proc/kcore

  Before:

    $ perf record --no-switch-events --kcore -a -e intel_pt//k -- sleep 0.001
    [ perf record: Woken up 1 times to write data ]
    [ perf record: Captured and wrote 0.938 MB perf.data ]
    $ perf script -D | grep PERF_RECORD_SWITCH | wc -l
    572

  After:

    $ perf record --no-switch-events --kcore -a -e intel_pt//k -- sleep 0.001
    Warning:
    Intel Processor Trace decoding will not be possible except for kernel tracing!
    [ perf record: Woken up 1 times to write data ]
    [ perf record: Captured and wrote 0.838 MB perf.data ]
    $ perf script -D | grep PERF_RECORD_SWITCH | wc -l
    0

    $ sudo chmod go-r /proc/kcore
    $ sudo setcap -r ~/bin/perf

Signed-off-by: Adrian Hunter <adrian.hunter@intel.com>
Tested-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Cc: Andi Kleen <ak@linux.intel.com>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Mathieu Poirier <mathieu.poirier@linaro.org>
Link: http://lore.kernel.org/lkml/20200528120859.21604-1-adrian.hunter@intel.com
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
tools/perf/Documentation/perf-record.txt
tools/perf/arch/arm/util/cs-etm.c
tools/perf/arch/x86/util/intel-pt.c
tools/perf/builtin-record.c
tools/perf/util/record.h

index 561ef55743e27196efb0e292bf594b68e060b5ea..97b1a866ab2265af79e6eb4d40dfc2dab8ea0a38 100644 (file)
@@ -458,7 +458,9 @@ This option sets the time out limit. The default value is 500 ms.
 
 --switch-events::
 Record context switch events i.e. events of type PERF_RECORD_SWITCH or
-PERF_RECORD_SWITCH_CPU_WIDE.
+PERF_RECORD_SWITCH_CPU_WIDE. In some cases (e.g. Intel PT or CoreSight)
+switch events will be enabled automatically, which can be suppressed by
+by the option --no-switch-events.
 
 --clang-path=PATH::
 Path to clang binary to use for compiling BPF scriptlets.
index 607499b41bea2782b1050990db2c1f11e4c3ed0b..cea5e33d61d2b5be03b86c045fac209cda90356c 100644 (file)
@@ -265,7 +265,8 @@ static int cs_etm_recording_options(struct auxtrace_record *itr,
        ptr->evlist = evlist;
        ptr->snapshot_mode = opts->auxtrace_snapshot_mode;
 
-       if (perf_can_record_switch_events())
+       if (!record_opts__no_switch_events(opts) &&
+           perf_can_record_switch_events())
                opts->record_switch_events = true;
 
        evlist__for_each_entry(evlist, evsel) {
index 0fe401ad33471fe82d96670e1e35b74c3ba168e2..de69c8a34e1536b7cf9885b1e1cfef097fce392d 100644 (file)
@@ -787,7 +787,8 @@ static int intel_pt_recording_options(struct auxtrace_record *itr,
         * Per-cpu recording needs sched_switch events to distinguish different
         * threads.
         */
-       if (have_timing_info && !perf_cpu_map__empty(cpus)) {
+       if (have_timing_info && !perf_cpu_map__empty(cpus) &&
+           !record_opts__no_switch_events(opts)) {
                if (perf_can_record_switch_events()) {
                        bool cpu_wide = !target__none(&opts->target) &&
                                        !target__has_task(&opts->target);
index c69f16361958621546818c5917c608b7d11c9889..ecd478a22c644d2bd3d20398c6b329cdde5a23e3 100644 (file)
@@ -2501,8 +2501,9 @@ static struct option __record_options[] = {
                    "Record namespaces events"),
        OPT_BOOLEAN(0, "all-cgroups", &record.opts.record_cgroup,
                    "Record cgroup events"),
-       OPT_BOOLEAN(0, "switch-events", &record.opts.record_switch_events,
-                   "Record context switch events"),
+       OPT_BOOLEAN_SET(0, "switch-events", &record.opts.record_switch_events,
+                       &record.opts.record_switch_events_set,
+                       "Record context switch events"),
        OPT_BOOLEAN_FLAG(0, "all-kernel", &record.opts.all_kernel,
                         "Configure all used events to run in kernel space.",
                         PARSE_OPT_EXCLUSIVE),
index 923565c3b155cdea32e4fa00e28b04c86274f9fc..39d1de4b2a3698be5279b77b9cf02fbd13cf5c3f 100644 (file)
@@ -36,6 +36,7 @@ struct record_opts {
        bool          record_namespaces;
        bool          record_cgroup;
        bool          record_switch_events;
+       bool          record_switch_events_set;
        bool          all_kernel;
        bool          all_user;
        bool          kernel_callchains;
@@ -76,4 +77,9 @@ extern struct option *record_options;
 
 int record__parse_freq(const struct option *opt, const char *str, int unset);
 
+static inline bool record_opts__no_switch_events(const struct record_opts *opts)
+{
+       return opts->record_switch_events_set && !opts->record_switch_events;
+}
+
 #endif // _PERF_RECORD_H