Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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: Namhyung Kim <namhyung@kernel.org>
Tested-by: Arnaldo 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: Arnaldo Carvalho de Melo <acme@redhat.com>

authored by

Namhyung Kim and committed by
Arnaldo Carvalho de Melo
8fb4b679 ab64069f

+27 -2
+4 -1
tools/perf/Documentation/perf-record.txt
··· 391 391 abort events and some memory events in precise mode on modern Intel CPUs. 392 392 393 393 --namespaces:: 394 - Record events of type PERF_RECORD_NAMESPACES. 394 + Record events of type PERF_RECORD_NAMESPACES. This enables 'cgroup_id' sort key. 395 + 396 + --all-cgroups:: 397 + Record events of type PERF_RECORD_CGROUP. This enables 'cgroup' sort key. 395 398 396 399 --transaction:: 397 400 Record transaction flags for transaction related events.
+11
tools/perf/builtin-record.c
··· 1433 1433 if (rec->opts.record_namespaces) 1434 1434 tool->namespace_events = true; 1435 1435 1436 + if (rec->opts.record_cgroup) { 1437 + #ifdef HAVE_FILE_HANDLE 1438 + tool->cgroup_events = true; 1439 + #else 1440 + pr_err("cgroup tracking is not supported\n"); 1441 + return -1; 1442 + #endif 1443 + } 1444 + 1436 1445 if (rec->opts.auxtrace_snapshot_mode || rec->switch_output.enabled) { 1437 1446 signal(SIGUSR2, snapshot_sig_handler); 1438 1447 if (rec->opts.auxtrace_snapshot_mode) ··· 2372 2363 "per thread proc mmap processing timeout in ms"), 2373 2364 OPT_BOOLEAN(0, "namespaces", &record.opts.record_namespaces, 2374 2365 "Record namespaces events"), 2366 + OPT_BOOLEAN(0, "all-cgroups", &record.opts.record_cgroup, 2367 + "Record cgroup events"), 2375 2368 OPT_BOOLEAN(0, "switch-events", &record.opts.record_switch_events, 2376 2369 "Record context switch events"), 2377 2370 OPT_BOOLEAN_FLAG(0, "all-kernel", &record.opts.all_kernel,
+10 -1
tools/perf/util/evsel.c
··· 1104 1104 if (opts->record_namespaces) 1105 1105 attr->namespaces = track; 1106 1106 1107 + if (opts->record_cgroup) { 1108 + attr->cgroup = track && !perf_missing_features.cgroup; 1109 + perf_evsel__set_sample_bit(evsel, CGROUP); 1110 + } 1111 + 1107 1112 if (opts->record_switch_events) 1108 1113 attr->context_switch = track; 1109 1114 ··· 1794 1789 * Must probe features in the order they were added to the 1795 1790 * perf_event_attr interface. 1796 1791 */ 1797 - if (!perf_missing_features.branch_hw_idx && 1792 + if (!perf_missing_features.cgroup && evsel->core.attr.cgroup) { 1793 + perf_missing_features.cgroup = true; 1794 + pr_debug2_peo("Kernel has no cgroup sampling support, bailing out\n"); 1795 + goto out_close; 1796 + } else if (!perf_missing_features.branch_hw_idx && 1798 1797 (evsel->core.attr.branch_sample_type & PERF_SAMPLE_BRANCH_HW_INDEX)) { 1799 1798 perf_missing_features.branch_hw_idx = true; 1800 1799 pr_debug2("switching off branch HW index support\n");
+1
tools/perf/util/evsel.h
··· 120 120 bool bpf; 121 121 bool aux_output; 122 122 bool branch_hw_idx; 123 + bool cgroup; 123 124 }; 124 125 125 126 extern struct perf_missing_features perf_missing_features;
+1
tools/perf/util/record.h
··· 34 34 bool auxtrace_snapshot_on_exit; 35 35 bool auxtrace_sample_mode; 36 36 bool record_namespaces; 37 + bool record_cgroup; 37 38 bool record_switch_events; 38 39 bool all_kernel; 39 40 bool all_user;