Commit 16b4b4e1 authored by Adrian Hunter's avatar Adrian Hunter Committed by Arnaldo Carvalho de Melo
Browse files

perf record: Respect --no-switch-events



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: default avatarAdrian Hunter <adrian.hunter@intel.com>
Tested-by: default avatarArnaldo 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: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
parent b5164085
Loading
Loading
Loading
Loading
+3 −1
Original line number Diff line number Diff line
@@ -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.
+2 −1
Original line number Diff line number Diff line
@@ -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) {
+2 −1
Original line number Diff line number Diff line
@@ -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);
+3 −2
Original line number Diff line number Diff line
@@ -2501,7 +2501,8 @@ 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,
	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.",
+6 −0
Original line number Diff line number Diff line
@@ -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