Commit 8fb4b679 authored by Namhyung Kim's avatar Namhyung Kim Committed by Arnaldo Carvalho de Melo

perf record: Add --all-cgroups option

The --all-cgroups option is to enable cgroup profiling support.  It
tells kernel to record CGROUP events in the ring buffer so that perf
report can identify task/cgroup association later.

  [root@seventh ~]# perf record --all-cgroups --namespaces /wb/cgtest
  [ perf record: Woken up 1 times to write data ]
  [ perf record: Captured and wrote 0.042 MB perf.data (558 samples) ]
  [root@seventh ~]# perf report --stdio -s cgroup_id,cgroup,pid
  # To display the perf.data header info, please use --header/--header-only options.
  #
  #
  # Total Lost Samples: 0
  #
  # Samples: 558  of event 'cycles'
  # Event count (approx.): 458017341
  #
  # Overhead  cgroup id (dev/inode)  Cgroup          Pid:Command
  # ........  .....................  ..........  ...............
  #
      33.15%  4/0xeffffffb           /sub           9615:looper0
      32.83%  4/0xf00002f5           /sub/cgrp2     9620:looper2
      32.79%  4/0xf00002f4           /sub/cgrp1     9619:looper1
       0.35%  4/0xf00002f5           /sub/cgrp2     9618:cgtest
       0.34%  4/0xf00002f4           /sub/cgrp1     9617:cgtest
       0.32%  4/0xeffffffb           /              9615:looper0
       0.11%  4/0xeffffffb           /sub           9617:cgtest
       0.10%  4/0xeffffffb           /sub           9618:cgtest

  #
  # (Tip: Sample related events with: perf record -e '{cycles,instructions}:S')
  #
  [root@seventh ~]#
Signed-off-by: default avatarNamhyung Kim <namhyung@kernel.org>
Tested-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Mark Rutland <mark.rutland@arm.com>
Cc: Peter Zijlstra <peterz@infradead.org>
Link: http://lore.kernel.org/lkml/20200325124536.2800725-8-namhyung@kernel.org
Link: http://lore.kernel.org/lkml/20200402015249.3800462-1-namhyung@kernel.org
[ Extracted the HAVE_FILE_HANDLE from the followup patch ]
Signed-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
parent ab64069f
...@@ -391,7 +391,10 @@ displayed with the weight and local_weight sort keys. This currently works for ...@@ -391,7 +391,10 @@ displayed with the weight and local_weight sort keys. This currently works for
abort events and some memory events in precise mode on modern Intel CPUs. abort events and some memory events in precise mode on modern Intel CPUs.
--namespaces:: --namespaces::
Record events of type PERF_RECORD_NAMESPACES. Record events of type PERF_RECORD_NAMESPACES. This enables 'cgroup_id' sort key.
--all-cgroups::
Record events of type PERF_RECORD_CGROUP. This enables 'cgroup' sort key.
--transaction:: --transaction::
Record transaction flags for transaction related events. Record transaction flags for transaction related events.
......
...@@ -1433,6 +1433,15 @@ static int __cmd_record(struct record *rec, int argc, const char **argv) ...@@ -1433,6 +1433,15 @@ static int __cmd_record(struct record *rec, int argc, const char **argv)
if (rec->opts.record_namespaces) if (rec->opts.record_namespaces)
tool->namespace_events = true; tool->namespace_events = true;
if (rec->opts.record_cgroup) {
#ifdef HAVE_FILE_HANDLE
tool->cgroup_events = true;
#else
pr_err("cgroup tracking is not supported\n");
return -1;
#endif
}
if (rec->opts.auxtrace_snapshot_mode || rec->switch_output.enabled) { if (rec->opts.auxtrace_snapshot_mode || rec->switch_output.enabled) {
signal(SIGUSR2, snapshot_sig_handler); signal(SIGUSR2, snapshot_sig_handler);
if (rec->opts.auxtrace_snapshot_mode) if (rec->opts.auxtrace_snapshot_mode)
...@@ -2363,6 +2372,8 @@ static struct option __record_options[] = { ...@@ -2363,6 +2372,8 @@ static struct option __record_options[] = {
"per thread proc mmap processing timeout in ms"), "per thread proc mmap processing timeout in ms"),
OPT_BOOLEAN(0, "namespaces", &record.opts.record_namespaces, OPT_BOOLEAN(0, "namespaces", &record.opts.record_namespaces,
"Record namespaces events"), "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(0, "switch-events", &record.opts.record_switch_events,
"Record context switch events"), "Record context switch events"),
OPT_BOOLEAN_FLAG(0, "all-kernel", &record.opts.all_kernel, OPT_BOOLEAN_FLAG(0, "all-kernel", &record.opts.all_kernel,
......
...@@ -1104,6 +1104,11 @@ void perf_evsel__config(struct evsel *evsel, struct record_opts *opts, ...@@ -1104,6 +1104,11 @@ void perf_evsel__config(struct evsel *evsel, struct record_opts *opts,
if (opts->record_namespaces) if (opts->record_namespaces)
attr->namespaces = track; attr->namespaces = track;
if (opts->record_cgroup) {
attr->cgroup = track && !perf_missing_features.cgroup;
perf_evsel__set_sample_bit(evsel, CGROUP);
}
if (opts->record_switch_events) if (opts->record_switch_events)
attr->context_switch = track; attr->context_switch = track;
...@@ -1789,7 +1794,11 @@ static int evsel__open_cpu(struct evsel *evsel, struct perf_cpu_map *cpus, ...@@ -1789,7 +1794,11 @@ static int evsel__open_cpu(struct evsel *evsel, struct perf_cpu_map *cpus,
* Must probe features in the order they were added to the * Must probe features in the order they were added to the
* perf_event_attr interface. * perf_event_attr interface.
*/ */
if (!perf_missing_features.branch_hw_idx && if (!perf_missing_features.cgroup && evsel->core.attr.cgroup) {
perf_missing_features.cgroup = true;
pr_debug2_peo("Kernel has no cgroup sampling support, bailing out\n");
goto out_close;
} else if (!perf_missing_features.branch_hw_idx &&
(evsel->core.attr.branch_sample_type & PERF_SAMPLE_BRANCH_HW_INDEX)) { (evsel->core.attr.branch_sample_type & PERF_SAMPLE_BRANCH_HW_INDEX)) {
perf_missing_features.branch_hw_idx = true; perf_missing_features.branch_hw_idx = true;
pr_debug2("switching off branch HW index support\n"); pr_debug2("switching off branch HW index support\n");
......
...@@ -120,6 +120,7 @@ struct perf_missing_features { ...@@ -120,6 +120,7 @@ struct perf_missing_features {
bool bpf; bool bpf;
bool aux_output; bool aux_output;
bool branch_hw_idx; bool branch_hw_idx;
bool cgroup;
}; };
extern struct perf_missing_features perf_missing_features; extern struct perf_missing_features perf_missing_features;
......
...@@ -34,6 +34,7 @@ struct record_opts { ...@@ -34,6 +34,7 @@ struct record_opts {
bool auxtrace_snapshot_on_exit; bool auxtrace_snapshot_on_exit;
bool auxtrace_sample_mode; bool auxtrace_sample_mode;
bool record_namespaces; bool record_namespaces;
bool record_cgroup;
bool record_switch_events; bool record_switch_events;
bool all_kernel; bool all_kernel;
bool all_user; bool all_user;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment