perf/core improvements and fixes
Subsystems (8)
Arnaldo Carvalho de Melo
maintainerHi Ingo,
Please consider pulling,
Regards,
- Arnaldo
Test results at the end of this message, as usual.
The following changes since commit ad07c8ceb6631a83b62d405a61448bba92adac68:
perf/core: Remove unused perf_flags (2019-01-21 11:01:31 +0100)
are available in the Git repository at:
git://git.kernel.org/pub/scm/linux/kernel/git/acme/linux.git tags/perf-core-for-mingo-5.0-20190121
for you to fetch changes up to 32e9136e37840a62c659259a394ed3735e3b3c84:
perf utils: Move perf_config using routines from color.c to separate object (2019-01-21 17:38:56 -0300)
----------------------------------------------------------------
perf/core improvements and fixes:
BPF:
Song Liu:
- Introduce PERF_RECORD_KSYMBOL to allow tooling to notice the addition of new kernel symbols and be able to resolve samples in such symbols.
- Introduce PERF_RECORD_BPF_EVENT to notify tooling about the loading and unloading of BPF programs, making them visible and allowing for the request of further information to allow for things like annotation.
- Change the userspace perf tools to handle those new events and to synthesize them for pre-existing loaded BPF programs.
Kernel:
Arnaldo Carvalho de Melo:
- Make perf_event_output() propagate the output() return, allowing users to check for -ENOSPC in the ring buffer.
perf report:
Thomas Richter:
- Display arch specific diagnostic counter sets, starting with s390 diagnostic counter sets.
perf session:
Jiri Olsa:
- Introduce a reader object to prep for multithreaded processing of recorded events.
Misc:
Rasmus Villemoes:
- Replace automatic const char[] variables by statics, to avoid initializing them at runtime, instead having them in .rodata, reducing code size.
YueHaibing:
- Remove duplicated workqueue.h include from perf_event.h
Brajeswar Ghosh:
- Remove some more duplicated headers.
----------------------------------------------------------------
Arnaldo Carvalho de Melo (4):
perf: Make perf_event_output() propagate the output() return
perf top: Synthesize BPF events for pre-existing loaded BPF programs perf python: Remove -fstack-clash-protection when building with some clang versions perf utils: Move perf_config using routines from color.c to separate object
Brajeswar Ghosh (1):
perf tools: Remove duplicate headers
Jiri Olsa (6):
perf session: Rearrange perf_session__process_events function perf session: Get rid of file_size variable
perf session: Add reader object
perf session: Add 'data_size' member to reader object perf session: Add 'data_offset' member to reader object perf session: Add reader__process_events function
Rasmus Villemoes (1):
perf tools: Replace automatic const char[] variables by statics
Song Liu (8):
perf, bpf: Introduce PERF_RECORD_KSYMBOL
tools headers uapi: Sync tools/include/uapi/linux/perf_event.h perf, bpf: Introduce PERF_RECORD_BPF_EVENT
tools headers uapi: Sync tools/include/uapi/linux/perf_event.h perf tools: Handle PERF_RECORD_KSYMBOL
perf tools: Handle PERF_RECORD_BPF_EVENT
perf tools: Synthesize PERF_RECORD_* for loaded BPF programs
bpf: Add module name [bpf] to ksymbols for bpf programs
Thomas Richter (3):
perf report: Display arch specific diagnostic counter sets, starting with s390 perf report: Display names in s390 diagnostic counter sets
perf report: Dump s390 counter set data to file
YueHaibing (1):
perf: Remove duplicated workqueue.h include from perf_event.h
include/linux/filter.h | 7 + include/linux/perf_event.h | 21 +- include/uapi/linux/perf_event.h | 53 ++++- kernel/bpf/core.c | 2 +- kernel/bpf/syscall.c | 2 + kernel/events/core.c | 224 +++++++++++++++++++- kernel/kallsyms.c | 2 +- kernel/trace/bpf_trace.c | 3 +- tools/include/uapi/linux/perf_event.h | 53 ++++- tools/perf/builtin-c2c.c | 4 +- tools/perf/builtin-kmem.c | 4 +- tools/perf/builtin-record.c | 7 + tools/perf/builtin-report.c | 6 +- tools/perf/builtin-sched.c | 2 +- tools/perf/builtin-stat.c | 1 - tools/perf/builtin-top.c | 7 + tools/perf/examples/bpf/augmented_raw_syscalls.c | 4 +- tools/perf/examples/bpf/augmented_syscalls.c | 14 +- tools/perf/examples/bpf/etcsnoop.c | 10 +- tools/perf/perf.h | 1 + tools/perf/tests/bp_account.c | 1 - tools/perf/ui/browsers/header.c | 2 +- tools/perf/ui/browsers/hists.c | 4 +- tools/perf/util/Build | 5 + tools/perf/util/bpf-event.c | 257 +++++++++++++++++++++++ tools/perf/util/bpf-event.h | 38 ++++ tools/perf/util/color.c | 39 ---- tools/perf/util/color_config.c | 47 +++++ tools/perf/util/dso.h | 1 - tools/perf/util/event.c | 41 ++++ tools/perf/util/event.h | 36 ++++ tools/perf/util/evlist.h | 4 +- tools/perf/util/evsel.c | 19 +- tools/perf/util/evsel.h | 2 + tools/perf/util/machine.c | 58 +++++ tools/perf/util/machine.h | 3 + tools/perf/util/s390-cpumcf-kernel.h | 62 ++++++ tools/perf/util/s390-cpumsf.c | 77 ++++++- tools/perf/util/s390-sample-raw.c | 222 ++++++++++++++++++++ tools/perf/util/sample-raw.c | 18 ++ tools/perf/util/sample-raw.h | 14 ++ tools/perf/util/session.c | 98 ++++++--- tools/perf/util/setup.py | 2 + tools/perf/util/tool.h | 5 +- tools/perf/util/zlib.c | 1 - 45 files changed, 1358 insertions(+), 125 deletions(-) create mode 100644 tools/perf/util/bpf-event.c create mode 100644 tools/perf/util/bpf-event.h create mode 100644 tools/perf/util/color_config.c create mode 100644 tools/perf/util/s390-cpumcf-kernel.h create mode 100644 tools/perf/util/s390-sample-raw.c create mode 100644 tools/perf/util/sample-raw.c create mode 100644 tools/perf/util/sample-raw.h
Test results:
The first ones are container based builds of tools/perf with and without libelf support. Where clang is available, it is also used to build perf with/without libelf, and building with LIBCLANGLLVM=1 (built-in clang) with gcc and clang when clang and its devel libraries are installed.
The objtool and samples/bpf/ builds are disabled now that I'm switching from using the sources in a local volume to fetching them from a http server to build it inside the container, to make it easier to build in a container cluster. Those will come back later.
Several are cross builds, the ones with -x-ARCH and the android one, and those may not have all the features built, due to lack of multi-arch devel packages, available and being used so far on just a few, like debian:experimental-x-{arm64,mipsel}.
The 'perf test' one will perform a variety of tests exercising tools/perf/util/, tools/lib/{bpf,traceevent,etc}, as well as run perf commands with a variety of command line event specifications to then intercept the sys_perf_event syscall to check that the perf_event_attr fields are set up as expected, among a variety of other unit tests.
Then there is the 'make -C tools/perf build-test' ones, that build tools/perf/ with a variety of feature sets, exercising the build with an incomplete set of features as well as with a complete one. It is planned to have it run on each of the containers mentioned above, using some container orchestration infrastructure. Get in contact if interested in helping having this in place.
$ dm 1 alpine:3.4 : Ok gcc (Alpine 5.3.0) 5.3.0 2 alpine:3.5 : Ok gcc (Alpine 6.2.1) 6.2.1 20160822 3 alpine:3.6 : Ok gcc (Alpine 6.3.0) 6.3.0 4 alpine:3.7 : Ok gcc (Alpine 6.4.0) 6.4.0 5 alpine:3.8 : Ok gcc (Alpine 6.4.0) 6.4.0 6 alpine:edge : Ok gcc (Alpine 8.2.0) 8.2.0 7 amazonlinux:1 : Ok gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-28) 8 amazonlinux:2 : Ok gcc (GCC) 7.3.1 20180303 (Red Hat 7.3.1-5) 9 android-ndk:r12b-arm : Ok gcc (GCC) 6.3.1 20161221 (Red Hat 6.3.1-1) 10 android-ndk:r15c-arm : Ok gcc (GCC) 8.2.1 20181215 (Red Hat 8.2.1-6) 11 centos:5 : Ok gcc (GCC) 4.1.2 20080704 (Red Hat 4.1.2-55) 12 centos:6 : Ok gcc (GCC) 4.4.7 20120313 (Red Hat 4.4.7-23) 13 centos:7 : Ok gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-36) 14 clearlinux:latest : Ok gcc (Clear Linux OS for Intel Architecture) 8.2.1 20180502 15 debian:7 : Ok gcc (Debian 4.7.2-5) 4.7.2 16 debian:8 : Ok gcc (Debian 4.9.2-10+deb8u2) 4.9.2 17 debian:9 : Ok gcc (Debian 6.3.0-18+deb9u1) 6.3.0 20170516 18 debian:experimental : Ok gcc (Debian 8.2.0-13) 8.2.0 19 debian:experimental-x-arm64 : Ok gcc (Debian 8.2.0-13) 8.2.0 20 debian:experimental-x-mips : Ok gcc (Debian 8.2.0-13) 8.2.0 21 debian:experimental-x-mips64 : Ok gcc (Debian 8.2.0-13) 8.2.0 22 debian:experimental-x-mipsel : Ok gcc (Debian 8.2.0-13) 8.2.0 23 fedora:20 : Ok gcc (GCC) 4.8.3 20140911 (Red Hat 4.8.3-7) 24 fedora:22 : Ok gcc (GCC) 5.3.1 20160406 (Red Hat 5.3.1-6) 25 fedora:23 : Ok gcc (GCC) 5.3.1 20160406 (Red Hat 5.3.1-6) 26 fedora:24 : Ok gcc (GCC) 6.3.1 20161221 (Red Hat 6.3.1-1) 27 fedora:24-x-ARC-uClibc : Ok gcc (GCC) 6.3.1 20161221 (Red Hat 6.3.1-1) 28 fedora:25 : Ok gcc (GCC) 6.4.1 20170727 (Red Hat 6.4.1-1) 29 fedora:26 : Ok gcc (GCC) 7.3.1 20180130 (Red Hat 7.3.1-2) 30 fedora:27 : Ok gcc (GCC) 7.3.1 20180712 (Red Hat 7.3.1-6) 31 fedora:28 : Ok gcc (GCC) 8.2.1 20181105 (Red Hat 8.2.1-5) 32 fedora:29 : Ok gcc (GCC) 8.2.1 20181105 (Red Hat 8.2.1-5) 33 fedora:rawhide : Ok gcc (GCC) 8.2.1 20190109 (Red Hat 8.2.1-7) 34 gentoo-stage3-amd64:latest : Ok gcc (Gentoo 7.3.0-r3 p1.4) 7.3.0 35 mageia:5 : Ok gcc (GCC) 4.9.2 36 mageia:6 : Ok gcc (Mageia 5.5.0-1.mga6) 5.5.0 37 opensuse:13.2 : Ok gcc (SUSE Linux) 4.8.3 20140627 [gcc-4_8-branch revision 212064] 38 opensuse:15.0 : Ok gcc (SUSE Linux) 7.3.1 20180323 [gcc-7-branch revision 258812] 39 opensuse:42.1 : Ok gcc (SUSE Linux) 4.8.5 40 opensuse:42.2 : Ok gcc (SUSE Linux) 4.8.5 41 opensuse:42.3 : Ok gcc (SUSE Linux) 4.8.5 42 opensuse:tumbleweed : Ok gcc (SUSE Linux) 8.2.1 20181108 [gcc-8-branch revision 265914] 43 oraclelinux:6 : Ok gcc (GCC) 4.4.7 20120313 (Red Hat 4.4.7-23.0.1) 44 oraclelinux:7 : Ok gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-36.0.1) 45 ubuntu:12.04.5 : Ok gcc (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3 46 ubuntu:14.04.4 : Ok gcc (Ubuntu 4.8.4-2ubuntu1~14.04.4) 4.8.4 47 ubuntu:14.04.4-x-linaro-arm64 : Ok gcc (Ubuntu 4.8.4-2ubuntu1~14.04.4) 4.8.4 48 ubuntu:16.04 : Ok gcc (Ubuntu 5.4.0-6ubuntu1~16.04.10) 5.4.0 20160609 49 ubuntu:16.04-x-arm : Ok gcc (Ubuntu 5.4.0-6ubuntu1~16.04.10) 5.4.0 20160609 50 ubuntu:16.04-x-arm64 : Ok gcc (Ubuntu 5.4.0-6ubuntu1~16.04.10) 5.4.0 20160609 51 ubuntu:16.04-x-powerpc : Ok gcc (Ubuntu 5.4.0-6ubuntu1~16.04.10) 5.4.0 20160609 52 ubuntu:16.04-x-powerpc64 : Ok gcc (Ubuntu 5.4.0-6ubuntu1~16.04.10) 5.4.0 20160609 53 ubuntu:16.04-x-powerpc64el : Ok gcc (Ubuntu 5.4.0-6ubuntu1~16.04.10) 5.4.0 20160609 54 ubuntu:16.04-x-s390 : Ok gcc (Ubuntu 5.4.0-6ubuntu1~16.04.10) 5.4.0 20160609 55 ubuntu:17.10 : Ok gcc (Ubuntu 7.2.0-8ubuntu3.2) 7.2.0 56 ubuntu:18.04 : Ok gcc (Ubuntu 7.3.0-27ubuntu1~18.04) 7.3.0 57 ubuntu:18.04-x-arm : Ok gcc (Ubuntu 7.3.0-27ubuntu1~18.04) 7.3.0 58 ubuntu:18.04-x-arm64 : Ok gcc (Ubuntu 7.3.0-27ubuntu1~18.04) 7.3.0 59 ubuntu:18.04-x-m68k : Ok gcc (Ubuntu 7.3.0-27ubuntu1~18.04) 7.3.0 60 ubuntu:18.04-x-powerpc : Ok gcc (Ubuntu 7.3.0-27ubuntu1~18.04) 7.3.0 61 ubuntu:18.04-x-powerpc64 : Ok gcc (Ubuntu 7.3.0-27ubuntu1~18.04) 7.3.0 62 ubuntu:18.04-x-powerpc64el : Ok gcc (Ubuntu 7.3.0-27ubuntu1~18.04) 7.3.0 63 ubuntu:18.04-x-riscv64 : Ok gcc (Ubuntu 7.3.0-27ubuntu1~18.04) 7.3.0 64 ubuntu:18.04-x-s390 : Ok gcc (Ubuntu 7.3.0-27ubuntu1~18.04) 7.3.0 65 ubuntu:18.04-x-sh4 : Ok gcc (Ubuntu 7.3.0-27ubuntu1~18.04) 7.3.0 66 ubuntu:18.04-x-sparc64 : Ok gcc (Ubuntu 7.3.0-27ubuntu1~18.04) 7.3.0 67 ubuntu:18.10 : Ok gcc (Ubuntu 8.2.0-7ubuntu1) 8.2.0 68 ubuntu:19.04 : Ok gcc (Ubuntu 8.2.0-12ubuntu1) 8.2.0 69 ubuntu:19.04-x-alpha : Ok gcc (Ubuntu 8.2.0-12ubuntu1) 8.2.0 70 ubuntu:19.04-x-hppa : Ok gcc (Ubuntu 8.2.0-12ubuntu1) 8.2.0 $
# uname -a
Linux quaco 5.0.0-rc3+ #16 SMP Mon Jan 21 12:01:36 -03 2019 x86_64 x86_64 x86_64 GNU/Linux
# git log --oneline -1
32e9136e3784 perf utils: Move perf_config using routines from color.c to separate object
# perf version --build-options
perf version 5.0.rc2.g32e9136
dwarf: [ on ] # HAVE_DWARF_SUPPORT
dwarf_getlocations: [ on ] # HAVE_DWARF_GETLOCATIONS_SUPPORT
glibc: [ on ] # HAVE_GLIBC_SUPPORT
gtk2: [ on ] # HAVE_GTK2_SUPPORT
syscall_table: [ on ] # HAVE_SYSCALL_TABLE_SUPPORT
libbfd: [ on ] # HAVE_LIBBFD_SUPPORT
libelf: [ on ] # HAVE_LIBELF_SUPPORT
libnuma: [ on ] # HAVE_LIBNUMA_SUPPORT
numa_num_possible_cpus: [ on ] # HAVE_LIBNUMA_SUPPORT
libperl: [ on ] # HAVE_LIBPERL_SUPPORT
libpython: [ on ] # HAVE_LIBPYTHON_SUPPORT
libslang: [ on ] # HAVE_SLANG_SUPPORT
libcrypto: [ on ] # HAVE_LIBCRYPTO_SUPPORT
libunwind: [ on ] # HAVE_LIBUNWIND_SUPPORT
libdw-dwarf-unwind: [ on ] # HAVE_DWARF_SUPPORT
zlib: [ on ] # HAVE_ZLIB_SUPPORT
lzma: [ on ] # HAVE_LZMA_SUPPORT
get_cpuid: [ on ] # HAVE_AUXTRACE_SUPPORT
bpf: [ on ] # HAVE_LIBBPF_SUPPORT
# perf test
1: vmlinux symtab matches kallsyms : Ok
2: Detect openat syscall event : Ok
3: Detect openat syscall event on all cpus : Ok
4: Read samples using the mmap interface : Ok
5: Test data source output : Ok
6: Parse event definition strings : Ok
7: Simple expression parser : Ok
8: PERF_RECORD_* events & perf_sample fields : Ok
9: Parse perf pmu format : Ok
10: DSO data read : Ok
11: DSO data cache : Ok
12: DSO data reopen : Ok
13: Roundtrip evsel->name : Ok
14: Parse sched tracepoints fields : Ok
15: syscalls:sys_enter_openat event fields : Ok
16: Setup struct perf_event_attr : Ok
17: Match and link multiple hists : Ok
18: 'import perf' in python : Ok
19: Breakpoint overflow signal handler : Ok
20: Breakpoint overflow sampling : Ok
21: Breakpoint accounting : Ok
22: Watchpoint :
22.1: Read Only Watchpoint : Skip
22.2: Write Only Watchpoint : Ok
22.3: Read / Write Watchpoint : Ok
22.4: Modify Watchpoint : Ok
23: Number of exit events of a simple workload : Ok
24: Software clock events period values : Ok
25: Object code reading : Ok
26: Sample parsing : Ok
27: Use a dummy software event to keep tracking : Ok
28: Parse with no sample_id_all bit set : Ok
29: Filter hist entries : Ok
30: Lookup mmap thread : Ok
31: Share thread mg : Ok
32: Sort output of hist entries : Ok
33: Cumulate child hist entries : Ok
34: Track with sched_switch : Ok
35: Filter fds with revents mask in a fdarray : Ok
36: Add fd to a fdarray, making it autogrow : Ok
37: kmod_path__parse : Ok
38: Thread map : Ok
39: LLVM search and compile :
39.1: Basic BPF llvm compile : Ok
39.2: kbuild searching : Ok
39.3: Compile source for BPF prologue generation : Ok
39.4: Compile source for BPF relocation : Ok
40: Session topology : Ok
41: BPF filter :
41.1: Basic BPF filtering : Ok
41.2: BPF pinning : Ok
41.3: BPF prologue generation : Ok
41.4: BPF relocation checker : Ok
42: Synthesize thread map : Ok
43: Remove thread map : Ok
44: Synthesize cpu map : Ok
45: Synthesize stat config : Ok
46: Synthesize stat : Ok
47: Synthesize stat round : Ok
48: Synthesize attr update : Ok
49: Event times : Ok
50: Read backward ring buffer : Ok
51: Print cpu map : Ok
52: Probe SDT events : Ok
53: is_printable_array : Ok
54: Print bitmap : Ok
55: perf hooks : Ok
56: builtin clang support : Skip (not compiled in)
57: unit_number__scnprintf : Ok
58: mem2node : Ok
59: x86 rdpmc : Ok
60: Convert perf time to TSC : Ok
61: DWARF unwind : Ok
62: x86 instruction decoder - new instructions : Ok
63: x86 bp modify : Ok
64: probe libc's inet_pton & backtrace it with ping : Ok
65: Use vfs_getname probe to get syscall args filenames : Ok
66: Add vfs_getname probe to get syscall args filenames : Ok
67: Check open filename arg using perf trace + vfs_getname: Ok $ make -C tools/perf build-test
make: Entering directory '/home/acme/git/perf/tools/perf'
- tarpkg: ./tests/perf-targz-src-pkg .
make_no_scripts_O: make NO_LIBPYTHON=1 NO_LIBPERL=1
make_util_pmu_bison_o_O: make util/pmu-bison.o
make_install_prefix_slash_O: make install prefix=/tmp/krava/
make_with_babeltrace_O: make LIBBABELTRACE=1
make_doc_O: make doc
make_no_demangle_O: make NO_DEMANGLE=1
make_no_gtk2_O: make NO_GTK2=1
make_clean_all_O: make clean all
make_install_O: make install
make_no_libpython_O: make NO_LIBPYTHON=1
make_help_O: make help
make_with_clangllvm_O: make LIBCLANGLLVM=1
make_no_libaudit_O: make NO_LIBAUDIT=1
make_no_slang_O: make NO_SLANG=1
make_debug_O: make DEBUG=1
make_no_libbionic_O: make NO_LIBBIONIC=1
make_no_backtrace_O: make NO_BACKTRACE=1
make_minimal_O: make NO_LIBPERL=1 NO_LIBPYTHON=1 NO_NEWT=1 NO_GTK2=1 NO_DEMANGLE=1 NO_LIBELF=1 NO_LIBUNWIND=1 NO_BACKTRACE=1 NO_LIBNUMA=1 NO_LIBAUDIT=1 NO_LIBBIONIC=1 NO_LIBDW_DWARF_UNWIND=1 NO_AUXTRACE=1 NO_LIBBPF=1 NO_LIBCRYPTO=1 NO_SDT=1 NO_JVMTI=1
make_no_libunwind_O: make NO_LIBUNWIND=1
make_no_libbpf_O: make NO_LIBBPF=1
make_install_bin_O: make install-bin
make_no_libnuma_O: make NO_LIBNUMA=1
make_pure_O: make
make_no_libelf_O: make NO_LIBELF=1
make_static_O: make LDFLAGS=-static
make_no_ui_O: make NO_NEWT=1 NO_SLANG=1 NO_GTK2=1
make_install_prefix_O: make install prefix=/tmp/krava
make_no_libdw_dwarf_unwind_O: make NO_LIBDW_DWARF_UNWIND=1
make_no_auxtrace_O: make NO_AUXTRACE=1
make_util_map_o_O: make util/map.o
make_perf_o_O: make perf.o
make_no_libperl_O: make NO_LIBPERL=1
make_cscope_O: make cscope
make_no_newt_O: make NO_NEWT=1
make_tags_O: make tags
OK
make: Leaving directory '/home/acme/git/perf/tools/perf'
$Arnaldo Carvalho de Melo
maintainerPATCH 1/24 perf tools: Replace automatic const char[] variables by statics
From: Rasmus Villemoes <[email protected]>
An automatic const char[] variable gets initialized at runtime, just like any other automatic variable. For long strings, that uses a lot of stack and wastes time building the string; e.g. for the "No %s allocation events..." case one has:
444516: 48 b8 4e 6f 20 25 73 20 61 6c movabs $0x6c61207325206f4e,%rax # "No %s al"
...
444674: 48 89 45 80 mov %rax,-0x80(%rbp) 444678: 48 b8 6c 6f 63 61 74 69 6f 6e movabs $0x6e6f697461636f6c,%rax # "location" 444682: 48 89 45 88 mov %rax,-0x78(%rbp) 444686: 48 b8 20 65 76 65 6e 74 73 20 movabs $0x2073746e65766520,%rax # " events " 444690: 66 44 89 55 c4 mov %r10w,-0x3c(%rbp) 444695: 48 89 45 90 mov %rax,-0x70(%rbp) 444699: 48 b8 66 6f 75 6e 64 2e 20 20 movabs $0x20202e646e756f66,%rax
Make them all static so that the compiler just references objects in .rodata.
Committer testing:
Ok, using dwarves's codiff tool:
$ codiff --functions /tmp/perf.before ~/bin/perf
builtin-sched.c:
cmd_sched | -48
1 function changed, 48 bytes removed, diff: -48 builtin-report.c:
cmd_report | -32
1 function changed, 32 bytes removed, diff: -32
builtin-kmem.c:
cmd_kmem | -64
build_alloc_func_list | -502 functions changed, 114 bytes removed, diff: -114
builtin-c2c.c:
perf_c2c__report | -390
1 function changed, 390 bytes removed, diff: -390
ui/browsers/header.c:
tui__header_window | -104
1 function changed, 104 bytes removed, diff: -104
/home/acme/bin/perf:
9 functions changed, 688 bytes removed, diff: -688
--- tools/perf/builtin-c2c.c | 4 ++-- tools/perf/builtin-kmem.c | 4 ++-- tools/perf/builtin-report.c | 6 +++--- tools/perf/builtin-sched.c | 2 +- tools/perf/ui/browsers/header.c | 2 +- tools/perf/ui/browsers/hists.c | 4 ++-- 6 files changed, 11 insertions(+), 11 deletions(-)
tools/perf/builtin-c2c.c +2 -2
@@ -2343,7 +2343,7 @@ static int perf_c2c__browse_cacheline(struct hist_entry *he)struct c2c_cacheline_browser *cl_browser;struct hist_browser *browser;int key =-1 ; -const char help[] = +static const char help[] =" ENTER Toggle callchains (if present) \n" " n Toggle Node details info \n" " s Toggle full length of symbol and source line columns \n"
@@ -2424,7 +2424,7 @@ static int perf_c2c__hists_browse(struct hists *hists) {struct hist_browser *browser;int key =-1 ; -const char help[] = +static const char help[] =" d Display cacheline details \n" " ENTER Toggle callchains (if present) \n" " q Quit \n" ;
tools/perf/builtin-kmem.c +2 -2
@@ -334,7 +334,7 @@ static int build_alloc_func_list(void)struct alloc_func *func;struct machine *machine = &kmem_session->machines.host;regex_t alloc_func_regex; -const char pattern[] ="^_?_?(alloc|get_free|get_zeroed)_pages?" ; +static const char pattern[] ="^_?_?(alloc|get_free|get_zeroed)_pages?" ; ret =regcomp (&alloc_func_regex, pattern,REG_EXTENDED );if (ret) {
@@ -1924,7 +1924,7 @@ int cmd_kmem(int argc, const char **argv) NULL };struct perf_session *session; -const char errmsg[] ="No %s allocation events found. Have you run 'perf kmem record --%s'?\n" ; +static const char errmsg[] ="No %s allocation events found. Have you run 'perf kmem record --%s'?\n" ;int ret =perf_config (kmem_config,NULL );if (ret)
tools/perf/builtin-report.c +3 -3
@@ -956,9 +956,9 @@ int cmd_report(int argc, const char **argv)int branch_mode =-1 ;bool branch_call_mode = false;#define CALLCHAIN_DEFAULT_OPT "graph,0.5,caller,function,percent" -const char report_callchain_help[] ="Display call graph (stack chain/backtrace):\n\n" -CALLCHAIN_REPORT_HELP -"\n\t\t\t\tDefault: " CALLCHAIN_DEFAULT_OPT ; +static const char report_callchain_help[] ="Display call graph (stack chain/backtrace):\n\n" +CALLCHAIN_REPORT_HELP +"\n\t\t\t\tDefault: " CALLCHAIN_DEFAULT_OPT ;char callchain_default_opt[] =CALLCHAIN_DEFAULT_OPT ;const char *const report_usage[] = {"perf report [<options>]" ,
tools/perf/builtin-sched.c +1 -1
@@ -3336,7 +3336,7 @@ static int __cmd_record(int argc, const char **argv)int cmd_sched (int argc,const char **argv) { -const char default_sort_order[] ="avg, max, switch, runtime" ; +static const char default_sort_order[] ="avg, max, switch, runtime" ;struct perf_sched sched = { .tool = { .sample = perf_sched__process_tracepoint_sample,
tools/perf/ui/browsers/header.c +1 -1
@@ -35,7 +35,7 @@ static int list_menu__run(struct ui_browser *menu) {int key;unsigned long offset; -const char help[] = +static const char help[] ="h/?/F1 Show this window\n" "UP/DOWN/PGUP\n" "PGDN/SPACE\n"
tools/perf/ui/browsers/hists.c +2 -2
@@ -2748,7 +2748,7 @@ static int perf_evsel__hists_browse(struct perf_evsel *evsel, int nr_events,"S Zoom into current Processor Socket\n" \/* help messages are sorted by lexical order of the hotkey */ - const char report_help[] = HIST_BROWSER_HELP_COMMON + static const char report_help[] = HIST_BROWSER_HELP_COMMON"i Show header information\n" "P Print histograms to perf.hist.N\n" "r Run available scripts\n"
@@ -2756,7 +2756,7 @@ static int perf_evsel__hists_browse(struct perf_evsel *evsel, int nr_events,"t Zoom into current Thread\n" "V Verbose (DSO names in callchains, etc)\n" "/ Filter symbol by name" ; -const char top_help[] =HIST_BROWSER_HELP_COMMON +static const char top_help[] =HIST_BROWSER_HELP_COMMON "P Print histograms to perf.hist.N\n" "t Zoom into current Thread\n" "V Verbose (DSO names in callchains, etc)\n"
Signature · 1 line
2.20.1
Arnaldo Carvalho de Melo
maintainerPATCH 2/24 perf session: Rearrange perf_session__process_events function
In reply to Arnaldo Carvalho de MeloFrom: Jiri Olsa <[email protected]>
To reduce function arguments and the code.
--- tools/perf/util/session.c | 20 +++++++------------- 1 file changed, 7 insertions(+), 13 deletions(-)
tools/perf/util/session.c +7 -13
@@ -1820,13 +1820,14 @@ fetch_mmaped_event(struct perf_session *session,#define NUM_MMAPS 128#endif -static int __perf_session__process_events (struct perf_session *session, -u64 data_offset,u64 data_size, -u64 file_size) +static int __perf_session__process_events (struct perf_session *session) {struct ordered_events *oe = &session->ordered_events;struct perf_tool *tool = session->tool;int fd =perf_data__fd (session->data); +u64 file_size =perf_data__size (session->data); +u64 data_offset = session->header.data_offset; +u64 data_size = session->header.data_size;u64 head, page_offset, file_offset, file_pos, size;int err, mmap_prot, mmap_flags, map_idx =0 ;size_t mmap_size;
@@ -1944,20 +1945,13 @@ static int __perf_session__process_events(struct perf_session *session,int perf_session__process_events (struct perf_session *session) { -u64 size =perf_data__size (session->data); -int err; -if (perf_session__register_idle_thread (session) <0 )return -ENOMEM ; -if (!perf_data__is_pipe (session->data)) - err =__perf_session__process_events (session, - session->header.data_offset, - session->header.data_size, size); -else - err =__perf_session__process_pipe_events (session); +if (perf_data__is_pipe (session->data)) +return __perf_session__process_pipe_events (session); -return err; +return __perf_session__process_events (session); }bool perf_session__has_traces (struct perf_session *session,const char *msg)
Signature · 1 line
2.20.1
Arnaldo Carvalho de Melo
maintainerPATCH 3/24 perf session: Get rid of file_size variable
In reply to Arnaldo Carvalho de MeloFrom: Jiri Olsa <[email protected]>
It's not needed and removing it makes the code a little simpler for the upcoming changes.
It's safe to replace file_size with data_size, because the perf_data__size() value is never smaller than data_offset + data_size.
--- tools/perf/util/session.c | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-)
tools/perf/util/session.c +5 -7
@@ -1825,7 +1825,6 @@ static int __perf_session__process_events(struct perf_session *session)struct ordered_events *oe = &session->ordered_events;struct perf_tool *tool = session->tool;int fd =perf_data__fd (session->data); -u64 file_size =perf_data__size (session->data);u64 data_offset = session->header.data_offset;u64 data_size = session->header.data_size;u64 head, page_offset, file_offset, file_pos, size;
@@ -1845,14 +1844,13 @@ static int __perf_session__process_events(struct perf_session *session)if (data_size ==0 ) goto out; -if (data_offset + data_size < file_size) - file_size = data_offset + data_size; +ui_progress__init_size (&prog, data_size,"Processing events..." ); -ui_progress__init_size (&prog, file_size,"Processing events..." ); + data_size += data_offset; mmap_size =MMAP_SIZE ; -if (mmap_size > file_size) { - mmap_size = file_size; +if (mmap_size > data_size) { + mmap_size = data_size; session->one_mmap = true; }
@@ -1917,7 +1915,7 @@ static int __perf_session__process_events(struct perf_session *session)if (session_done ()) goto out; -if (file_pos < file_size) +if (file_pos < data_size) goto more; out:
Signature · 1 line
2.20.1
Arnaldo Carvalho de Melo
maintainerPATCH 4/24 perf session: Add reader object
In reply to Arnaldo Carvalho de MeloFrom: Jiri Olsa <[email protected]>
Add a session private reader object to encapsulate the reading of the event data block. Starting with a 'fd' field.
--- tools/perf/util/session.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-)
tools/perf/util/session.c +8 -2
@@ -1820,11 +1820,17 @@ fetch_mmaped_event(struct perf_session *session,#define NUM_MMAPS 128#endif +struct reader { +int fd; +}; +static int __perf_session__process_events (struct perf_session *session) { +struct reader rd = { + .fd =perf_data__fd (session->data), + };struct ordered_events *oe = &session->ordered_events;struct perf_tool *tool = session->tool; -int fd =perf_data__fd (session->data);u64 data_offset = session->header.data_offset;u64 data_size = session->header.data_size;u64 head, page_offset, file_offset, file_pos, size;
@@ -1864,7 +1870,7 @@ static int __perf_session__process_events(struct perf_session *session) mmap_flags =MAP_PRIVATE ; } remap: - buf =mmap (NULL , mmap_size, mmap_prot, mmap_flags, fd, + buf =mmap (NULL , mmap_size, mmap_prot, mmap_flags, rd.fd, file_offset);if (buf ==MAP_FAILED ) {pr_err ("failed to mmap file\n" );
Signature · 1 line
2.20.1
Arnaldo Carvalho de Melo
maintainerPATCH 5/24 perf session: Add 'data_size' member to reader object
In reply to Arnaldo Carvalho de MeloFrom: Jiri Olsa <[email protected]>
Add a 'data_size' member to the reader object. Keep the 'data_size' variable instead of replacing it with rd.data_size as it will be used in the following patch.
--- tools/perf/util/session.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
tools/perf/util/session.c +3 -1
@@ -1822,17 +1822,19 @@ fetch_mmaped_event(struct perf_session *session,struct reader {int fd; +u64 data_size; };static int __perf_session__process_events (struct perf_session *session) {struct reader rd = { .fd =perf_data__fd (session->data), + .data_size = session->header.data_size, };struct ordered_events *oe = &session->ordered_events;struct perf_tool *tool = session->tool;u64 data_offset = session->header.data_offset; -u64 data_size = session->header.data_size; +u64 data_size = rd.data_size;u64 head, page_offset, file_offset, file_pos, size;int err, mmap_prot, mmap_flags, map_idx =0 ;size_t mmap_size;
Signature · 1 line
2.20.1
Arnaldo Carvalho de Melo
maintainerPATCH 6/24 perf session: Add 'data_offset' member to reader object
In reply to Arnaldo Carvalho de MeloFrom: Jiri Olsa <[email protected]>
Add 'data_offset' member to reader object.
--- tools/perf/util/session.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-)
tools/perf/util/session.c +5 -4
@@ -1823,6 +1823,7 @@ fetch_mmaped_event(struct perf_session *session,struct reader {int fd;u64 data_size; +u64 data_offset; };static int __perf_session__process_events (struct perf_session *session)
@@ -1830,10 +1831,10 @@ static int __perf_session__process_events(struct perf_session *session)struct reader rd = { .fd =perf_data__fd (session->data), .data_size = session->header.data_size, + .data_offset = session->header.data_offset, };struct ordered_events *oe = &session->ordered_events;struct perf_tool *tool = session->tool; -u64 data_offset = session->header.data_offset;u64 data_size = rd.data_size;u64 head, page_offset, file_offset, file_pos, size;int err, mmap_prot, mmap_flags, map_idx =0 ;
@@ -1845,16 +1846,16 @@ static int __perf_session__process_events(struct perf_session *session)perf_tool__fill_defaults (tool); - page_offset = page_size * (data_offset / page_size); + page_offset = page_size * (rd.data_offset / page_size); file_offset = page_offset; - head = data_offset - page_offset; + head = rd.data_offset - page_offset;if (data_size ==0 ) goto out;ui_progress__init_size (&prog, data_size,"Processing events..." ); - data_size += data_offset; + data_size += rd.data_offset; mmap_size =MMAP_SIZE ;if (mmap_size > data_size) {
Signature · 1 line
2.20.1
Arnaldo Carvalho de Melo
maintainerPATCH 7/24 perf session: Add reader__process_events function
In reply to Arnaldo Carvalho de MeloFrom: Jiri Olsa <[email protected]>
The reader object is defined by file's fd, data offset and data size.
Now we can simply define a reader object for an arbitrary file data portion and pass it to reader__process_events().
--- tools/perf/util/session.c | 62 ++++++++++++++++++++++++--------------- 1 file changed, 38 insertions(+), 24 deletions(-)
tools/perf/util/session.c +38 -24
@@ -1826,36 +1826,25 @@ struct reader {u64 data_offset; }; -static int __perf_session__process_events (struct perf_session *session) +static int +reader__process_events (struct reader *rd,struct perf_session *session, +struct ui_progress *prog) { -struct reader rd = { - .fd =perf_data__fd (session->data), - .data_size = session->header.data_size, - .data_offset = session->header.data_offset, - }; -struct ordered_events *oe = &session->ordered_events; -struct perf_tool *tool = session->tool; -u64 data_size = rd.data_size; +u64 data_size = rd->data_size;u64 head, page_offset, file_offset, file_pos, size; -int err, mmap_prot, mmap_flags, map_idx =0 ; +int err =0 , mmap_prot, mmap_flags, map_idx =0 ;size_t mmap_size;char *buf, *mmaps[NUM_MMAPS ];union perf_event *event; -struct ui_progress prog;s64 skip; -perf_tool__fill_defaults (tool); - - page_offset = page_size * (rd.data_offset / page_size); + page_offset = page_size * (rd->data_offset / page_size); file_offset = page_offset; - head = rd.data_offset - page_offset; + head = rd->data_offset - page_offset; -if (data_size ==0 ) - goto out; +ui_progress__init_size (prog, data_size,"Processing events..." ); -ui_progress__init_size (&prog, data_size,"Processing events..." ); - - data_size += rd.data_offset; + data_size += rd->data_offset; mmap_size =MMAP_SIZE ;if (mmap_size > data_size) {
@@ -1873,12 +1862,12 @@ static int __perf_session__process_events(struct perf_session *session) mmap_flags =MAP_PRIVATE ; } remap: - buf =mmap (NULL , mmap_size, mmap_prot, mmap_flags, rd.fd, + buf =mmap (NULL , mmap_size, mmap_prot, mmap_flags, rd->fd, file_offset);if (buf ==MAP_FAILED ) {pr_err ("failed to mmap file\n" ); err = -errno; - goto out_err; + goto out; } mmaps[map_idx] = buf; map_idx = (map_idx +1 ) & (ARRAY_SIZE (mmaps) -1 );
@@ -1910,7 +1899,7 @@ static int __perf_session__process_events(struct perf_session *session) file_offset + head, event->header.size, event->header.type); err = -EINVAL ; - goto out_err; + goto out; }if (skip)
@@ -1919,7 +1908,7 @@ static int __perf_session__process_events(struct perf_session *session) head += size; file_pos += size; -ui_progress__update (&prog, size); +ui_progress__update (prog, size);if (session_done ()) goto out;
@@ -1928,6 +1917,31 @@ static int __perf_session__process_events(struct perf_session *session) goto more; out: +return err; +} + +static int __perf_session__process_events (struct perf_session *session) +{ +struct reader rd = { + .fd =perf_data__fd (session->data), + .data_size = session->header.data_size, + .data_offset = session->header.data_offset, + }; +struct ordered_events *oe = &session->ordered_events; +struct perf_tool *tool = session->tool; +struct ui_progress prog; +int err; + +perf_tool__fill_defaults (tool); + +if (rd.data_size ==0 ) +return -1 ; + +ui_progress__init_size (&prog, rd.data_size,"Processing events..." ); + + err =reader__process_events (&rd, session, &prog); +if (err) + goto out_err;/* do the final flush for ordered samples */ err =ordered_events__flush (oe,OE_FLUSH__FINAL );if (err)
Signature · 1 line
2.20.1
Arnaldo Carvalho de Melo
maintainerPATCH 8/24 perf: Remove duplicated workqueue.h include from perf_event.h
In reply to Arnaldo Carvalho de MeloFrom: YueHaibing <[email protected]>
It is already included a little bit higher up in that file.
--- include/linux/perf_event.h | 1 - 1 file changed, 1 deletion(-)
include/linux/perf_event.h +0 -1
@@ -53,7 +53,6 @@ struct perf_guest_info_callbacks {#include <linux/atomic.h> #include <linux/sysfs.h> #include <linux/perf_regs.h> -#include <linux/workqueue.h> #include <linux/cgroup.h> #include <asm/local.h>
Signature · 1 line
2.20.1
Arnaldo Carvalho de Melo
maintainerPATCH 9/24 perf tools: Remove duplicate headers
In reply to Arnaldo Carvalho de MeloFrom: Brajeswar Ghosh <[email protected]>
Remove duplicate headers which are included more than once in the same file.
--- tools/perf/builtin-stat.c | 1 - tools/perf/tests/bp_account.c | 1 - tools/perf/util/dso.h | 1 - tools/perf/util/zlib.c | 1 - 4 files changed, 4 deletions(-)
tools/perf/builtin-stat.c +0 -1
@@ -83,7 +83,6 @@#include <unistd.h> #include <sys/time.h> #include <sys/resource.h> -#include <sys/wait.h> #include "sane_ctype.h"
tools/perf/tests/bp_account.c +0 -1
@@ -15,7 +15,6 @@#include <sys/mman.h> #include <linux/compiler.h> #include <linux/hw_breakpoint.h> -#include <sys/ioctl.h> #include "tests.h" #include "debug.h"
tools/perf/util/dso.h +0 -1
@@ -8,7 +8,6 @@#include <sys/types.h> #include <stdbool.h> #include "rwsem.h" -#include <linux/types.h> #include <linux/bitops.h> #include "map.h" #include "namespaces.h"
tools/perf/util/zlib.c +0 -1
@@ -6,7 +6,6 @@#include <sys/mman.h> #include <zlib.h> #include <linux/compiler.h> -#include <unistd.h> #include "util/compress.h" #include "util/util.h"
Signature · 1 line
2.20.1
Arnaldo Carvalho de Melo
maintainerPATCH 10/24 perf report: Display arch specific diagnostic counter sets, starting with s390
In reply to Arnaldo Carvalho de MeloFrom: Thomas Richter <[email protected]>
On s390 the event bc000 (also named CF_DIAG) extracts the CPU Measurement Facility diagnostic counter sets and displays them as counter number and counter value pairs sorted by counter set number.
Output:
[root@s35lp76 perf]# ./perf report -D --stdio
[00000000] Counterset:0 Counters:6
Counter:000 Value:0x000000000085ec36 Counter:001 Value:0x0000000000796c94 Counter:002 Value:0x0000000000005ada Counter:003 Value:0x0000000000092460 Counter:004 Value:0x0000000000006073 Counter:005 Value:0x00000000001a9a73
[0x000038] Counterset:1 Counters:2
Counter:000 Value:0x000000000007c59f Counter:001 Value:0x000000000002fad6
[0x000050] Counterset:2 Counters:16
Counter:000 Value:000000000000000000 Counter:001 Value:000000000000000000 Counter:002 Value:000000000000000000 Counter:003 Value:000000000000000000 Counter:004 Value:000000000000000000 Counter:005 Value:000000000000000000 Counter:006 Value:000000000000000000 Counter:007 Value:000000000000000000 Counter:008 Value:000000000000000000 Counter:009 Value:000000000000000000 Counter:010 Value:000000000000000000 Counter:011 Value:000000000000000000 Counter:012 Value:000000000000000000 Counter:013 Value:000000000000000000 Counter:014 Value:000000000000000000 Counter:015 Value:000000000000000000
[0x0000d8] Counterset:3 Counters:128
Counter:000 Value:0x000000000000020f Counter:001 Value:0x00000000000001d8 Counter:002 Value:0x000000000000d7fa Counter:003 Value:0x000000000000008b
...
The number in brackets is the offset into the raw data field of the sample.
New functions trace_event_sample_raw__init() and s390_sample_raw() are introduced in the code path to enable interpretation on non s390 platforms. This event bc000 attached raw data is generated only on s390 platform. Correct display on other platforms requires correct endianness handling.
Committer notes:
Added a init function that sets up a evlist function pointer to avoid repeated tests on evlist->env and calls to perf_env__name() that involves normalizing, etc, for each PERF_RECORD_SAMPLE.
Removed needless __maybe_unused from the trace_event_raw() prototype in session.h, move it to be an static function in evlist.
--- tools/perf/util/Build | 2 + tools/perf/util/evlist.h | 4 +- tools/perf/util/s390-cpumcf-kernel.h | 62 ++++++++++ tools/perf/util/s390-sample-raw.c | 173 +++++++++++++++++++++++++++ tools/perf/util/sample-raw.c | 18 +++ tools/perf/util/sample-raw.h | 14 +++ tools/perf/util/session.c | 5 + 7 files changed, 277 insertions(+), 1 deletion(-) create mode 100644 tools/perf/util/s390-cpumcf-kernel.h create mode 100644 tools/perf/util/s390-sample-raw.c create mode 100644 tools/perf/util/sample-raw.c create mode 100644 tools/perf/util/sample-raw.h
tools/perf/util/Build +2 -0
@@ -44,6 +44,8 @@ libperf-y += machine.o libperf-y += map.o libperf-y += pstack.o libperf-y += session.o +libperf-y += sample-raw.o +libperf-y += s390-sample-raw.o libperf-$(CONFIG_TRACE) += syscalltbl.o libperf-y += ordered-events.o libperf-y += namespaces.o
tools/perf/util/evlist.h +3 -1
@@ -49,6 +49,9 @@ struct perf_evlist {struct perf_evsel *selected;struct events_stats stats;struct perf_env *env; +void (*trace_event_sample_raw)(struct perf_evlist *evlist, +union perf_event *event, +struct perf_sample *sample);u64 first_sample_time;u64 last_sample_time; };
@@ -314,5 +317,4 @@ void perf_evlist__force_leader(struct perf_evlist *evlist);struct perf_evsel *perf_evlist__reset_weak_group (struct perf_evlist *evlist,struct perf_evsel *evsel); -#endif /* __PERF_EVLIST_H */
tools/perf/util/s390-cpumcf-kernel.h new file +62 -0
62 lines not on this page · raw message
tools/perf/util/s390-sample-raw.c new file +173 -0
173 lines not on this page · raw message
tools/perf/util/sample-raw.c new file +18 -0
@@ -0,0 +1,18 @@ +/* SPDX-License-Identifier: GPL-2.0 */ + +#include <string.h> +#include "evlist.h" +#include "env.h" +#include "sample-raw.h" + +/* +* Check platform the perf data file was created on and perform platform +* specific interpretation. +*/ +void perf_evlist__init_trace_event_sample_raw (struct perf_evlist *evlist) +{ +const char *arch_pf =perf_env__arch (evlist->env); + +if (arch_pf && !strcmp ("s390" , arch_pf)) + evlist->trace_event_sample_raw = perf_evlist__s390_sample_raw; +}
tools/perf/util/sample-raw.h new file +14 -0
@@ -0,0 +1,14 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +#ifndef __SAMPLE_RAW_H +#define __SAMPLE_RAW_H 1 + +struct perf_evlist ; +union perf_event ; +struct perf_sample ; + +void perf_evlist__s390_sample_raw (struct perf_evlist *evlist, +union perf_event *event, +struct perf_sample *sample); + +void perf_evlist__init_trace_event_sample_raw (struct perf_evlist *evlist); +#endif /* __PERF_EVLIST_H */
tools/perf/util/session.c +5 -0
@@ -23,6 +23,7 @@#include "auxtrace.h" #include "thread.h" #include "thread-stack.h" +#include "sample-raw.h" #include "stat.h" #include "arch/common.h"
@@ -147,6 +148,8 @@ struct perf_session *perf_session__new(struct perf_data *data,perf_session__set_id_hdr_size (session);perf_session__set_comm_exec (session); } + +perf_evlist__init_trace_event_sample_raw (session->evlist); } }else { session->machines.host.env = &perf_env;
@@ -1065,6 +1068,8 @@ static void dump_event(struct perf_evlist *evlist, union perf_event *event, file_offset, event->header.size, event->header.type);trace_event (event); +if (event->header.type ==PERF_RECORD_SAMPLE && evlist->trace_event_sample_raw) + evlist->trace_event_sample_raw (evlist, event, sample);if (sample)perf_evlist__print_tstamp (evlist, event, sample);
Signature · 1 line
2.20.1
Arnaldo Carvalho de Melo
maintainerPATCH 11/24 perf report: Display names in s390 diagnostic counter sets
In reply to Arnaldo Carvalho de MeloFrom: Thomas Richter <[email protected]>
On s390 the CPU Measurement Facility diagnostic counter sets are displayed by counter number and value. Add the logical counter name in the output (if it is available). Otherwise "unknown" is shown.
Output before:
[root@s35lp76 perf]# ./perf report -D --stdio
[00000000] Counterset:0 Counters:6
Counter:000 Value:0x000000000085ec36 Counter:001 Value:0x0000000000796c94 Counter:002 Value:0x0000000000005ada Counter:003 Value:0x0000000000092460 Counter:004 Value:0x0000000000006073 Counter:005 Value:0x00000000001a9a73
[0x000038] Counterset:1 Counters:2
Counter:000 Value:0x000000000007c59f Counter:001 Value:0x000000000002fad6
[0x000050] Counterset:2 Counters:16
Counter:000 Value:000000000000000000 Counter:001 Value:000000000000000000
Output after:
[root@s35lp76 perf]# ./perf report -D --stdio
[00000000] Counterset:0 Counters:6
Counter:000 cpu_cycles Value:0x000000000085ec36
Counter:001 instructions Value:0x0000000000796c94
Counter:002 l1i_dir_writes Value:0x0000000000005ada
Counter:003 l1i_penalty_cycles Value:0x0000000000092460
Counter:004 l1d_dir_writes Value:0x0000000000006073
Counter:005 l1d_penalty_cycles Value:0x00000000001a9a73
[0x000038] Counterset:1 Counters:2
Counter:000 problem_state_cpu_cycles Value:0x000000000007c59f
Counter:001 problem_state_instructions Value:0x000000000002fad6
[0x000050] Counterset:2 Counters:16
Counter:000 prng_functions Value:000000000000000000--- tools/perf/util/s390-sample-raw.c | 59 ++++++++++++++++++++++++++++--- 1 file changed, 54 insertions(+), 5 deletions(-)
tools/perf/util/s390-sample-raw.c +54 -5
@@ -29,6 +29,7 @@#include "color.h" #include "sample-raw.h" #include "s390-cpumcf-kernel.h" +#include "pmu-events/pmu-events.h" static size_t ctrset_size (struct cf_ctrset_entry *set) {
@@ -112,14 +113,61 @@ static void s390_cpumcfdg_dumptrail(const char *color, size_t offset, te.tod_base, te.mach_type); } +/* Return starting number of a counter set */ +static int get_counterset_start (int setnr) +{ +switch (setnr) { +case CPUMF_CTR_SET_BASIC :/* Basic counter set */ +return 0 ; +case CPUMF_CTR_SET_USER :/* Problem state counter set */ +return 32 ; +case CPUMF_CTR_SET_CRYPTO :/* Crypto counter set */ +return 64 ; +case CPUMF_CTR_SET_EXT :/* Extended counter set */ +return 128 ; +case CPUMF_CTR_SET_MT_DIAG :/* Diagnostic counter set */ +return 448 ; +default : +return -1 ; + } +} + +/* Scan the PMU table and extract the logical name of a counter from the +* PMU events table. Input is the counter set and counter number with in the +* set. Construct the event number and use this as key. If they match return +* the name of this counter. +* If no match is found a NULL pointer is returned. +*/ +static const char *get_counter_name (int set,int nr,struct pmu_events_map *map) +{ +int rc, event_nr, wanted =get_counterset_start (set) + nr; + +if (map) { +struct pmu_event *evp = map->table; + +for (; evp->name || evp->event || evp->desc; ++evp) { +if (evp->name ==NULL || evp->event ==NULL ) +continue ; + rc =sscanf (evp->event,"event=%x" , &event_nr); +if (rc ==1 && event_nr == wanted) +return evp->name; + } + } +return NULL ; +} +static void s390_cpumcfdg_dump (struct perf_sample *sample) {size_t i, len = sample->raw_size, offset =0 ;unsigned char *buf = sample->raw_data;const char *color =PERF_COLOR_BLUE ;struct cf_ctrset_entry *cep, ce; +struct pmu_events_map *map; +struct perf_pmu pmu;u64 *p; +memset (&pmu,0 ,sizeof (pmu)); + map =perf_pmu__find_map (&pmu);while (offset < len) { cep = (struct cf_ctrset_entry *)(buf + offset);
@@ -136,12 +184,13 @@ static void s390_cpumcfdg_dump(struct perf_sample *sample)color_fprintf (stdout, color," [%#08zx] Counterset:%d" " Counters:%d\n" , offset, ce.set, ce.ctr); -for (i =0 , p = (u64 *)(cep +1 ); i < ce.ctr; i +=2 , p +=2 ) +for (i =0 , p = (u64 *)(cep +1 ); i < ce.ctr; ++i, ++p) { +const char *ev_name =get_counter_name (ce.set, i, map); +color_fprintf (stdout, color, -"\tCounter:%03d Value:%#018lx" -" Counter:%03d Value:%#018lx\n" , - i,be64_to_cpu (*p), - i +1 ,be64_to_cpu (*(p +1 ))); +"\tCounter:%03d %s Value:%#018lx\n" , i, + ev_name ?:"<unknown>" ,be64_to_cpu (*p)); + } offset +=ctrset_size (&ce); } }
Signature · 1 line
2.20.1
Arnaldo Carvalho de Melo
maintainerPATCH 12/24 perf report: Dump s390 counter set data to file
In reply to Arnaldo Carvalho de MeloFrom: Thomas Richter <[email protected]>
Add support for the new s390 PMU device cpum_cf_diag to extract the counter set diagnostic data. This data is available as event raw data and can be created with this command:
[root@s35lp76 perf]# ./perf record -R -e '{rbd000,rbc000}' --
~/mytests/facultaet 2500
[ perf record: Woken up 1 times to write data ] [ perf record: Captured and wrote 0.009 MB perf.data ] [root@s35lp76 perf]#
The new event 0xbc000 generated this counter set diagnostic trace data. The data can be extracted using command:
[root@s35lp76 perf]# ./perf report --stdio --itrace=d
#
# Total Lost Samples: 0
#
# Samples: 21 of events 'anon group { rbd000, rbc000 }'
# Event count (approx.): 21
#
# Overhead Command Shared Object Symbol
# ................ ......... ................. ........................
#
80.95% 0.00% facultaet facultaet [.] facultaet
4.76% 0.00% facultaet [kernel.kallsyms] [k] check_chain_key
4.76% 0.00% facultaet [kernel.kallsyms] [k] ftrace_likely_update
4.76% 0.00% facultaet [kernel.kallsyms] [k] lock_release
4.76% 0.00% facultaet libc-2.26.so [.] _dl_addr
[root@s35lp76 perf]# ll aux*
-rw-r--r-- 1 root root 3408 Oct 16 12:40 aux.ctr.02
-rw-r--r-- 1 root root 4096 Oct 16 12:40 aux.smp.02
[root@s35lp76 perf]#The files named aux.ctr.## contain the counter set diagnostic data and the files named aux.smp.## contain the sampling diagnostic data. ## stand for the CPU number the data was taken from.
--- tools/perf/util/s390-cpumsf.c | 77 +++++++++++++++++++++++++++++++++-- 1 file changed, 73 insertions(+), 4 deletions(-)
tools/perf/util/s390-cpumsf.c +73 -4
@@ -162,6 +162,7 @@#include "auxtrace.h" #include "s390-cpumsf.h" #include "s390-cpumsf-kernel.h" +#include "s390-cpumcf-kernel.h" #include "config.h" struct s390_cpumsf {
@@ -184,8 +185,58 @@ struct s390_cpumsf_queue {struct auxtrace_buffer *buffer;int cpu;FILE *logfile; +FILE *logfile_ctr; }; +/* Check if the raw data should be dumped to file. If this is the case and +* the file to dump to has not been opened for writing, do so. +* +* Return 0 on success and greater zero on error so processing continues. +*/ +static int s390_cpumcf_dumpctr (struct s390_cpumsf *sf, +struct perf_sample *sample) +{ +struct s390_cpumsf_queue *sfq; +struct auxtrace_queue *q; +int rc =0 ; + +if (!sf->use_logfile || sf->queues.nr_queues <= sample->cpu) +return rc; + + q = &sf->queues.queue_array[sample->cpu]; + sfq = q->priv; +if (!sfq)/* Queue not yet allocated */ +return rc; + +if (!sfq->logfile_ctr) { +char *name; + + rc = (sf->logdir) + ?asprintf (&name,"%s/aux.ctr.%02x" , + sf->logdir, sample->cpu) + :asprintf (&name,"aux.ctr.%02x" , sample->cpu); +if (rc >0 ) + sfq->logfile_ctr =fopen (name,"w" ); +if (sfq->logfile_ctr ==NULL ) { +pr_err ("Failed to open counter set log file %s, " +"continue...\n" , name); + rc =1 ; + } +free (name); + } + +if (sfq->logfile_ctr) { +/* See comment above for -4 */ +size_t n =fwrite (sample->raw_data, sample->raw_size -4 ,1 , + sfq->logfile_ctr); +if (n !=1 ) { +pr_err ("Failed to write counter set data\n" ); + rc =1 ; + } + } +return rc; +} +/* Display s390 CPU measurement facility basic-sampling data entry */ static bool s390_cpumsf_basic_show (const char *color,size_t pos,struct hws_basic_entry *basic)
@@ -792,7 +843,7 @@ static int s390_cpumsf_lost(struct s390_cpumsf *sf, struct perf_sample *sample) }static int -s390_cpumsf_process_event (struct perf_session *session__maybe_unused , +s390_cpumsf_process_event (struct perf_session *session,union perf_event *event,struct perf_sample *sample,struct perf_tool *tool)
@@ -801,6 +852,8 @@ s390_cpumsf_process_event(struct perf_session *session __maybe_unused, struct s390_cpumsf, auxtrace);u64 timestamp = sample->time; +struct perf_evsel *ev_bc000; +int err =0 ;if (dump_trace)
@@ -811,6 +864,16 @@ s390_cpumsf_process_event(struct perf_session *session __maybe_unused,return -EINVAL ; } +if (event->header.type ==PERF_RECORD_SAMPLE && + sample->raw_size) { +/* Handle event with raw data */ + ev_bc000 =perf_evlist__event2evsel (session->evlist, event); +if (ev_bc000 && + ev_bc000->attr.config ==PERF_EVENT_CPUM_CF_DIAG ) + err =s390_cpumcf_dumpctr (sf, sample); +return err; + } +if (event->header.type ==PERF_RECORD_AUX && event->aux.flags &PERF_AUX_FLAG_TRUNCATED )return s390_cpumsf_lost (sf, sample);
@@ -891,9 +954,15 @@ static void s390_cpumsf_free_queues(struct perf_session *session)struct s390_cpumsf_queue *sfq = (struct s390_cpumsf_queue *) queues->queue_array[i].priv; -if (sfq !=NULL && sfq->logfile) { -fclose (sfq->logfile); - sfq->logfile =NULL ; +if (sfq !=NULL ) { +if (sfq->logfile) { +fclose (sfq->logfile); + sfq->logfile =NULL ; + } +if (sfq->logfile_ctr) { +fclose (sfq->logfile_ctr); + sfq->logfile_ctr =NULL ; + } }zfree (&queues->queue_array[i].priv); }
Signature · 1 line
2.20.1
Arnaldo Carvalho de Melo
maintainerPATCH 13/24 perf: Make perf_event_output() propagate the output() return
In reply to Arnaldo Carvalho de MeloFrom: Arnaldo Carvalho de Melo <[email protected]>
For the original mode of operation it isn't needed, since we report back errors via PERF_RECORD_LOST records in the ring buffer, but for use in bpf_perf_event_output() it is convenient to return the errors, basically -ENOSPC.
Currently bpf_perf_event_output() returns an error indication, the last thing it does, which is to push it to the ring buffer is that can fail and if so, this failure won't be reported back to its users, fix it.
--- include/linux/perf_event.h | 6 +++--- kernel/events/core.c | 11 +++++++---- kernel/trace/bpf_trace.c | 3 +-- tools/perf/examples/bpf/augmented_raw_syscalls.c | 4 ++-- tools/perf/examples/bpf/augmented_syscalls.c | 14 +++++++------- tools/perf/examples/bpf/etcsnoop.c | 10 +++++----- 6 files changed, 25 insertions(+), 23 deletions(-)
include/linux/perf_event.h +3 -3
@@ -978,9 +978,9 @@ extern void perf_event_output_forward(struct perf_event *event,extern void perf_event_output_backward (struct perf_event *event,struct perf_sample_data *data,struct pt_regs *regs); -extern void perf_event_output (struct perf_event *event, -struct perf_sample_data *data, -struct pt_regs *regs); +extern int perf_event_output (struct perf_event *event, +struct perf_sample_data *data, +struct pt_regs *regs);static inline bool is_default_overflow_handler (struct perf_event *event)
kernel/events/core.c +7 -4
@@ -6489,7 +6489,7 @@ void perf_prepare_sample(struct perf_event_header *header, data->phys_addr =perf_virt_to_phys (data->addr); } -static __always_inline void +static __always_inline int __perf_event_output(struct perf_event *event, struct perf_sample_data *data, struct pt_regs *regs,
@@ -6499,13 +6499,15 @@ __perf_event_output(struct perf_event *event, {struct perf_output_handle handle;struct perf_event_header header; +int err;/* protect the callchain buffers */ rcu_read_lock ();perf_prepare_sample (&header, data, event, regs); -if (output_begin (&handle, event, header.size)) + err =output_begin (&handle, event, header.size); +if (err) goto exit;perf_output_sample (&handle, &header, data, event);
@@ -6514,6 +6516,7 @@ __perf_event_output(struct perf_event *event, exit:rcu_read_unlock (); +return err; }void
@@ -6532,12 +6535,12 @@ perf_event_output_backward(struct perf_event *event,__perf_event_output (event, data, regs, perf_output_begin_backward); } -void +int perf_event_output (struct perf_event *event,struct perf_sample_data *data,struct pt_regs *regs) { -__perf_event_output (event, data, regs, perf_output_begin); +return __perf_event_output (event, data, regs, perf_output_begin); }/*
kernel/trace/bpf_trace.c +1 -2
@@ -431,8 +431,7 @@ __bpf_perf_event_output(struct pt_regs *regs, struct bpf_map *map,if (unlikely (event->oncpu != cpu))return -EOPNOTSUPP ; -perf_event_output (event, sd, regs); -return 0 ; +return perf_event_output (event, sd, regs); } BPF_CALL_5(bpf_perf_event_output, struct pt_regs *, regs, struct bpf_map *, map,
tools/perf/examples/bpf/augmented_raw_syscalls.c +2 -2
@@ -141,8 +141,8 @@ int sys_enter(struct syscall_enter_args *args) len =sizeof (augmented_args.args); } -perf_event_output (args, &__augmented_syscalls__,BPF_F_CURRENT_CPU , &augmented_args, len); -return 0 ; +/* If perf_event_output fails, return non-zero so that it gets recorded unaugmented */ +return perf_event_output (args, &__augmented_syscalls__,BPF_F_CURRENT_CPU , &augmented_args, len); }SEC ("raw_syscalls:sys_exit" )
tools/perf/examples/bpf/augmented_syscalls.c +7 -7
@@ -55,9 +55,9 @@ int syscall_enter(syscall)(struct syscall_enter_##syscall##_args *args) \ len -=sizeof (augmented_args.filename.value) - augmented_args.filename.size; \ len &=sizeof (augmented_args.filename.value) -1 ; \ } \ -perf_event_output (args, &__augmented_syscalls__,BPF_F_CURRENT_CPU , \ - &augmented_args, len); \ -return 0 ; \ +/* If perf_event_output fails, return non-zero so that it gets recorded unaugmented */ \ +return perf_event_output (args, &__augmented_syscalls__,BPF_F_CURRENT_CPU , \ + &augmented_args, len); \ } \int syscall_exit (syscall )(struct syscall_exit_args *args) \ { \
@@ -125,10 +125,10 @@ int syscall_enter(syscall)(struct syscall_enter_##syscall##_args *args) \/* addrlen = augmented_args.args.addrlen; */ \/* */ \probe_read (&augmented_args.addr, addrlen, args->addr_ptr); \ -perf_event_output (args, &__augmented_syscalls__,BPF_F_CURRENT_CPU , \ - &augmented_args, \ -sizeof (augmented_args) -sizeof (augmented_args.addr) + addrlen); \ -return 0 ; \ +/* If perf_event_output fails, return non-zero so that it gets recorded unaugmented */ \ +return perf_event_output (args, &__augmented_syscalls__,BPF_F_CURRENT_CPU , \ + &augmented_args, \ +sizeof (augmented_args) -sizeof (augmented_args.addr) + addrlen);\ } \int syscall_exit (syscall )(struct syscall_exit_args *args) \ { \
tools/perf/examples/bpf/etcsnoop.c +5 -5
@@ -49,11 +49,11 @@ int syscall_enter(syscall)(struct syscall_enter_##syscall##_args *args) \ args->filename_ptr); \if (__builtin_memcmp (augmented_args.filename.value, etc,4 ) !=0 ) \return 0 ; \ -perf_event_output (args, &__augmented_syscalls__,BPF_F_CURRENT_CPU , \ - &augmented_args, \ - (sizeof (augmented_args) -sizeof (augmented_args.filename.value) + \ - augmented_args.filename.size)); \ -return 0 ; \ +/* If perf_event_output fails, return non-zero so that it gets recorded unaugmented */ \ +return perf_event_output (args, &__augmented_syscalls__,BPF_F_CURRENT_CPU , \ + &augmented_args, \ + (sizeof (augmented_args) -sizeof (augmented_args.filename.value) + \ + augmented_args.filename.size)); \ }struct syscall_enter_openat_args {
Signature · 1 line
2.20.1
Arnaldo Carvalho de Melo
maintainerPATCH 14/24 perf, bpf: Introduce PERF_RECORD_KSYMBOL
In reply to Arnaldo Carvalho de MeloFrom: Song Liu <[email protected]>
For better performance analysis of dynamically JITed and loaded kernel functions, such as BPF programs, this patch introduces PERF_RECORD_KSYMBOL, a new perf_event_type that exposes kernel symbol register/unregister information to user space.
The following data structure is used for PERF_RECORD_KSYMBOL.
/*
* struct {
* struct perf_event_header header;
* u64 addr;
* u32 len;
* u16 ksym_type;
* u16 flags;
* char name[];
* struct sample_id sample_id;
* };
*/
--- include/linux/perf_event.h | 8 +++ include/uapi/linux/perf_event.h | 26 ++++++++- kernel/events/core.c | 98 ++++++++++++++++++++++++++++++++- 3 files changed, 130 insertions(+), 2 deletions(-)
include/linux/perf_event.h +8 -0
@@ -1122,6 +1122,10 @@ static inline void perf_event_task_sched_out(struct task_struct *prev, }extern void perf_event_mmap (struct vm_area_struct *vma); + +extern void perf_event_ksymbol (u16 ksym_type,u64 addr,u32 len, +bool unregister,const char *sym); +extern struct perf_guest_info_callbacks *perf_guest_cbs;extern int perf_register_guest_info_callbacks (struct perf_guest_info_callbacks *callbacks);extern int perf_unregister_guest_info_callbacks (struct perf_guest_info_callbacks *callbacks);
@@ -1342,6 +1346,10 @@ static inline int perf_unregister_guest_info_callbacks (struct perf_guest_info_callbacks *callbacks) { return 0; }static inline void perf_event_mmap (struct vm_area_struct *vma) { } + +typedef int (perf_ksymbol_get_name_f )(char *name,int name_len,void *data); +static inline void perf_event_ksymbol (u16 ksym_type,u64 addr,u32 len, +bool unregister,const char *sym) { }static inline void perf_event_exec (void ) { }static inline void perf_event_comm (struct task_struct *tsk,bool exec) { }static inline void perf_event_namespaces (struct task_struct *tsk) { }
include/uapi/linux/perf_event.h +25 -1
@@ -372,7 +372,8 @@ struct perf_event_attr { context_switch : 1, /* context switch data */ write_backward : 1, /* Write ring buffer from end to beginning */ namespaces : 1, /* include namespaces data */ - __reserved_1 : 35; + ksymbol : 1, /* include ksymbol events */ + __reserved_1 : 34;union {__u32 wakeup_events;/* wakeup every n events */
@@ -963,9 +964,32 @@ enum perf_event_type {*/ PERF_RECORD_NAMESPACES =16 , +/* +* Record ksymbol register/unregister events: +* +* struct { +* struct perf_event_header header; +* u64 addr; +* u32 len; +* u16 ksym_type; +* u16 flags; +* char name[]; +* struct sample_id sample_id; +* }; +*/ +PERF_RECORD_KSYMBOL =17 , + PERF_RECORD_MAX, /* non-ABI */ }; +enum perf_record_ksymbol_type { +PERF_RECORD_KSYMBOL_TYPE_UNKNOWN =0 , +PERF_RECORD_KSYMBOL_TYPE_BPF =1 , +PERF_RECORD_KSYMBOL_TYPE_MAX /* non-ABI */ +}; + +#define PERF_RECORD_KSYMBOL_FLAGS_UNREGISTER (1 << 0) +#define PERF_MAX_STACK_DEPTH 127#define PERF_MAX_CONTEXTS_PER_STACK 8
kernel/events/core.c +97 -1
128 lines not on this page · raw message
Signature · 1 line
2.20.1
Arnaldo Carvalho de Melo
maintainerPATCH 15/24 tools headers uapi: Sync tools/include/uapi/linux/perf_event.h
In reply to Arnaldo Carvalho de MeloFrom: Song Liu <[email protected]>
Sync changes for PERF_RECORD_KSYMBOL.
--- tools/include/uapi/linux/perf_event.h | 26 +++++++++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-)
tools/include/uapi/linux/perf_event.h +25 -1
@@ -372,7 +372,8 @@ struct perf_event_attr { context_switch : 1, /* context switch data */ write_backward : 1, /* Write ring buffer from end to beginning */ namespaces : 1, /* include namespaces data */ - __reserved_1 : 35; + ksymbol : 1, /* include ksymbol events */ + __reserved_1 : 34;union {__u32 wakeup_events;/* wakeup every n events */
@@ -963,9 +964,32 @@ enum perf_event_type {*/ PERF_RECORD_NAMESPACES =16 , +/* +* Record ksymbol register/unregister events: +* +* struct { +* struct perf_event_header header; +* u64 addr; +* u32 len; +* u16 ksym_type; +* u16 flags; +* char name[]; +* struct sample_id sample_id; +* }; +*/ +PERF_RECORD_KSYMBOL =17 , + PERF_RECORD_MAX, /* non-ABI */ }; +enum perf_record_ksymbol_type { +PERF_RECORD_KSYMBOL_TYPE_UNKNOWN =0 , +PERF_RECORD_KSYMBOL_TYPE_BPF =1 , +PERF_RECORD_KSYMBOL_TYPE_MAX /* non-ABI */ +}; + +#define PERF_RECORD_KSYMBOL_FLAGS_UNREGISTER (1 << 0) +#define PERF_MAX_STACK_DEPTH 127#define PERF_MAX_CONTEXTS_PER_STACK 8
Signature · 1 line
2.20.1
Arnaldo Carvalho de Melo
maintainerPATCH 16/24 perf, bpf: Introduce PERF_RECORD_BPF_EVENT
In reply to Arnaldo Carvalho de MeloFrom: Song Liu <[email protected]>
For better performance analysis of BPF programs, this patch introduces PERF_RECORD_BPF_EVENT, a new perf_event_type that exposes BPF program load/unload information to user space.
Each BPF program may contain up to BPF_MAX_SUBPROGS (256) sub programs. The following example shows kernel symbols for a BPF program with 7 sub programs:
ffffffffa0257cf9 t bpf_prog_b07ccb89267cf242_F
ffffffffa02592e1 t bpf_prog_2dcecc18072623fc_F
ffffffffa025b0e9 t bpf_prog_bb7a405ebaec5d5c_F
ffffffffa025dd2c t bpf_prog_a7540d4a39ec1fc7_F
ffffffffa025fcca t bpf_prog_05762d4ade0e3737_F
ffffffffa026108f t bpf_prog_db4bd11e35df90d4_F
ffffffffa0263f00 t bpf_prog_89d64e4abf0f0126_F
ffffffffa0257cf9 t bpf_prog_ae31629322c4b018__dummy_tracepoiWhen a bpf program is loaded, PERF_RECORD_KSYMBOL is generated for each of these sub programs. Therefore, PERF_RECORD_BPF_EVENT is not needed for simple profiling.
For annotation, user space need to listen to PERF_RECORD_BPF_EVENT and gather more information about these (sub) programs via sys_bpf.
--- include/linux/filter.h | 7 ++ include/linux/perf_event.h | 6 ++ include/uapi/linux/perf_event.h | 29 +++++++- kernel/bpf/core.c | 2 +- kernel/bpf/syscall.c | 2 + kernel/events/core.c | 115 ++++++++++++++++++++++++++++++++ 6 files changed, 159 insertions(+), 2 deletions(-)
include/linux/filter.h +7 -0
@@ -951,6 +951,7 @@ bpf_address_lookup(unsigned long addr, unsigned long *size,void bpf_prog_kallsyms_add (struct bpf_prog *fp);void bpf_prog_kallsyms_del (struct bpf_prog *fp); +void bpf_get_prog_name (const struct bpf_prog *prog,char *sym);#else /* CONFIG_BPF_JIT */
@@ -1006,6 +1007,12 @@ static inline void bpf_prog_kallsyms_add(struct bpf_prog *fp)static inline void bpf_prog_kallsyms_del (struct bpf_prog *fp) { } + +static inline void bpf_get_prog_name (const struct bpf_prog *prog,char *sym) +{ + sym[0 ] ='\0' ; +} +#endif /* CONFIG_BPF_JIT */ void bpf_prog_kallsyms_del_subprogs (struct bpf_prog *fp);
include/linux/perf_event.h +6 -0
@@ -1125,6 +1125,9 @@ extern void perf_event_mmap(struct vm_area_struct *vma);extern void perf_event_ksymbol (u16 ksym_type,u64 addr,u32 len,bool unregister,const char *sym); +extern void perf_event_bpf_event (struct bpf_prog *prog, +enum perf_bpf_event_type type, +u16 flags);extern struct perf_guest_info_callbacks *perf_guest_cbs;extern int perf_register_guest_info_callbacks (struct perf_guest_info_callbacks *callbacks);
@@ -1350,6 +1353,9 @@ static inline void perf_event_mmap(struct vm_area_struct *vma) { }typedef int (perf_ksymbol_get_name_f )(char *name,int name_len,void *data);static inline void perf_event_ksymbol (u16 ksym_type,u64 addr,u32 len,bool unregister,const char *sym) { } +static inline void perf_event_bpf_event (struct bpf_prog *prog, +enum perf_bpf_event_type type, +u16 flags) { }static inline void perf_event_exec (void ) { }static inline void perf_event_comm (struct task_struct *tsk,bool exec) { }static inline void perf_event_namespaces (struct task_struct *tsk) { }
include/uapi/linux/perf_event.h +28 -1
@@ -373,7 +373,8 @@ struct perf_event_attr { write_backward : 1, /* Write ring buffer from end to beginning */ namespaces : 1, /* include namespaces data */ ksymbol : 1, /* include ksymbol events */ - __reserved_1 : 34; + bpf_event : 1, /* include bpf events */ + __reserved_1 : 33;union {__u32 wakeup_events;/* wakeup every n events */
@@ -979,6 +980,25 @@ enum perf_event_type {*/ PERF_RECORD_KSYMBOL =17 , +/* +* Record bpf events: +* enum perf_bpf_event_type { +* PERF_BPF_EVENT_UNKNOWN = 0, +* PERF_BPF_EVENT_PROG_LOAD = 1, +* PERF_BPF_EVENT_PROG_UNLOAD = 2, +* }; +* +* struct { +* struct perf_event_header header; +* u16 type; +* u16 flags; +* u32 id; +* u8 tag[BPF_TAG_SIZE]; +* struct sample_id sample_id; +* }; +*/ +PERF_RECORD_BPF_EVENT =18 , + PERF_RECORD_MAX, /* non-ABI */ };
@@ -990,6 +1010,13 @@ enum perf_record_ksymbol_type {#define PERF_RECORD_KSYMBOL_FLAGS_UNREGISTER (1 << 0) +enum perf_bpf_event_type { +PERF_BPF_EVENT_UNKNOWN =0 , +PERF_BPF_EVENT_PROG_LOAD =1 , +PERF_BPF_EVENT_PROG_UNLOAD =2 , +PERF_BPF_EVENT_MAX ,/* non-ABI */ +}; +#define PERF_MAX_STACK_DEPTH 127#define PERF_MAX_CONTEXTS_PER_STACK 8
kernel/bpf/core.c +1 -1
@@ -495,7 +495,7 @@ bpf_get_prog_addr_region(const struct bpf_prog *prog, *symbol_end = addr + hdr->pages *PAGE_SIZE ; } -static void bpf_get_prog_name (const struct bpf_prog *prog,char *sym) +void bpf_get_prog_name (const struct bpf_prog *prog,char *sym) {const char *end = sym +KSYM_NAME_LEN ;const struct btf_type *type;
kernel/bpf/syscall.c +2 -0
@@ -1211,6 +1211,7 @@ static void __bpf_prog_put_rcu(struct rcu_head *rcu)static void __bpf_prog_put (struct bpf_prog *prog,bool do_idr_lock) {if (atomic_dec_and_test (&prog->aux->refcnt)) { +perf_event_bpf_event (prog,PERF_BPF_EVENT_PROG_UNLOAD ,0 );/* bpf_prog_free_id() must be called first */ bpf_prog_free_id (prog, do_idr_lock);bpf_prog_kallsyms_del_all (prog);
@@ -1554,6 +1555,7 @@ static int bpf_prog_load(union bpf_attr *attr, union bpf_attr __user *uattr) }bpf_prog_kallsyms_add (prog); +perf_event_bpf_event (prog,PERF_BPF_EVENT_PROG_LOAD ,0 );return err; free_used_maps:
kernel/events/core.c +115 -0
139 lines not on this page · raw message
Signature · 1 line
2.20.1
Arnaldo Carvalho de Melo
maintainerPATCH 17/24 tools headers uapi: Sync tools/include/uapi/linux/perf_event.h
In reply to Arnaldo Carvalho de MeloFrom: Song Liu <[email protected]>
Sync for PERF_RECORD_BPF_EVENT.
--- tools/include/uapi/linux/perf_event.h | 29 ++++++++++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-)
tools/include/uapi/linux/perf_event.h +28 -1
@@ -373,7 +373,8 @@ struct perf_event_attr { write_backward : 1, /* Write ring buffer from end to beginning */ namespaces : 1, /* include namespaces data */ ksymbol : 1, /* include ksymbol events */ - __reserved_1 : 34; + bpf_event : 1, /* include bpf events */ + __reserved_1 : 33;union {__u32 wakeup_events;/* wakeup every n events */
@@ -979,6 +980,25 @@ enum perf_event_type {*/ PERF_RECORD_KSYMBOL =17 , +/* +* Record bpf events: +* enum perf_bpf_event_type { +* PERF_BPF_EVENT_UNKNOWN = 0, +* PERF_BPF_EVENT_PROG_LOAD = 1, +* PERF_BPF_EVENT_PROG_UNLOAD = 2, +* }; +* +* struct { +* struct perf_event_header header; +* u16 type; +* u16 flags; +* u32 id; +* u8 tag[BPF_TAG_SIZE]; +* struct sample_id sample_id; +* }; +*/ +PERF_RECORD_BPF_EVENT =18 , + PERF_RECORD_MAX, /* non-ABI */ };
@@ -990,6 +1010,13 @@ enum perf_record_ksymbol_type {#define PERF_RECORD_KSYMBOL_FLAGS_UNREGISTER (1 << 0) +enum perf_bpf_event_type { +PERF_BPF_EVENT_UNKNOWN =0 , +PERF_BPF_EVENT_PROG_LOAD =1 , +PERF_BPF_EVENT_PROG_UNLOAD =2 , +PERF_BPF_EVENT_MAX ,/* non-ABI */ +}; +#define PERF_MAX_STACK_DEPTH 127#define PERF_MAX_CONTEXTS_PER_STACK 8
Signature · 1 line
2.20.1
Arnaldo Carvalho de Melo
maintainerPATCH 18/24 perf tools: Handle PERF_RECORD_KSYMBOL
In reply to Arnaldo Carvalho de MeloFrom: Song Liu <[email protected]>
This patch handles PERF_RECORD_KSYMBOL in perf record/report. Specifically, map and symbol are created for ksymbol register, and removed for ksymbol unregister.
This patch also sets perf_event_attr.ksymbol properly. The flag is ON by default.
--- tools/perf/util/event.c | 21 +++++++++++++++ tools/perf/util/event.h | 20 ++++++++++++++ tools/perf/util/evsel.c | 10 ++++++- tools/perf/util/evsel.h | 1 + tools/perf/util/machine.c | 55 +++++++++++++++++++++++++++++++++++++++ tools/perf/util/machine.h | 3 +++ tools/perf/util/session.c | 4 +++ tools/perf/util/tool.h | 4 ++- 8 files changed, 116 insertions(+), 2 deletions(-)
tools/perf/util/event.c +21 -0
@@ -24,6 +24,7 @@#include "symbol/kallsyms.h" #include "asm/bug.h" #include "stat.h" +#include "session.h" #define DEFAULT_PROC_MAP_PARSE_TIMEOUT 500
@@ -45,6 +46,7 @@ static const char *perf_event__names[] = { [PERF_RECORD_SWITCH] = "SWITCH", [PERF_RECORD_SWITCH_CPU_WIDE] = "SWITCH_CPU_WIDE", [PERF_RECORD_NAMESPACES] = "NAMESPACES", + [PERF_RECORD_KSYMBOL] = "KSYMBOL", [PERF_RECORD_HEADER_ATTR] = "ATTR", [PERF_RECORD_HEADER_EVENT_TYPE] = "EVENT_TYPE", [PERF_RECORD_HEADER_TRACING_DATA] = "TRACING_DATA",
@@ -1329,6 +1331,14 @@ int perf_event__process_switch(struct perf_tool *tool __maybe_unused,return machine__process_switch_event (machine, event); } +int perf_event__process_ksymbol (struct perf_tool *tool__maybe_unused , +union perf_event *event, +struct perf_sample *sample__maybe_unused , +struct machine *machine) +{ +return machine__process_ksymbol (machine, event, sample); +} +size_t perf_event__fprintf_mmap (union perf_event *event,FILE *fp) { return fprintf(fp, " %d/%d: [%#" PRIx64 "(%#" PRIx64 ") @ %#" PRIx64 "]: %c %s\n",
@@ -1461,6 +1471,14 @@ static size_t perf_event__fprintf_lost(union perf_event *event, FILE *fp)return fprintf (fp," lost %" PRIu64"\n" , event->lost.lost); } +size_t perf_event__fprintf_ksymbol (union perf_event *event,FILE *fp) +{ +return fprintf (fp," ksymbol event with addr %lx len %u type %u flags 0x%x name %s\n" , + event->ksymbol_event.addr, event->ksymbol_event.len, + event->ksymbol_event.ksym_type, + event->ksymbol_event.flags, event->ksymbol_event.name); +} +size_t perf_event__fprintf (union perf_event *event,FILE *fp) { size_t ret = fprintf(fp, "PERF_RECORD_%s",
@@ -1496,6 +1514,9 @@ size_t perf_event__fprintf(union perf_event *event, FILE *fp)case PERF_RECORD_LOST : ret +=perf_event__fprintf_lost (event, fp);break ; +case PERF_RECORD_KSYMBOL : + ret +=perf_event__fprintf_ksymbol (event, fp); +break ;default : ret +=fprintf (fp,"\n" ); }
tools/perf/util/event.h +20 -0
@@ -5,6 +5,7 @@#include <limits.h> #include <stdio.h> #include <linux/kernel.h> +#include <linux/bpf.h> #include "../perf.h" #include "build-id.h"
@@ -84,6 +85,19 @@ struct throttle_event {u64 stream_id; }; +#ifndef KSYM_NAME_LEN +#define KSYM_NAME_LEN 256 +#endif + +struct ksymbol_event { +struct perf_event_header header; +u64 addr; +u32 len; +u16 ksym_type; +u16 flags; +char name[KSYM_NAME_LEN ]; +}; +#define PERF_SAMPLE_MASK \ (PERF_SAMPLE_IP | PERF_SAMPLE_TID | \ PERF_SAMPLE_TIME | PERF_SAMPLE_ADDR | \
@@ -651,6 +665,7 @@ union perf_event {struct stat_round_event stat_round;struct time_conv_event time_conv;struct feature_event feat; +struct ksymbol_event ksymbol_event; };void perf_event__print_totals (void );
@@ -748,6 +763,10 @@ int perf_event__process_exit(struct perf_tool *tool,union perf_event *event, struct perf_sample *sample, struct machine *machine); +int perf_event__process_ksymbol (struct perf_tool *tool, +union perf_event *event, +struct perf_sample *sample, +struct machine *machine); int perf_tool__process_synth_event(struct perf_tool *tool, union perf_event *event, struct machine *machine,
@@ -811,6 +830,7 @@ size_t perf_event__fprintf_switch(union perf_event *event, FILE *fp);size_t perf_event__fprintf_thread_map (union perf_event *event,FILE *fp);size_t perf_event__fprintf_cpu_map (union perf_event *event,FILE *fp);size_t perf_event__fprintf_namespaces (union perf_event *event,FILE *fp); +size_t perf_event__fprintf_ksymbol (union perf_event *event,FILE *fp);size_t perf_event__fprintf (union perf_event *event,FILE *fp); int kallsyms__get_function_start(const char *kallsyms_filename,
tools/perf/util/evsel.c +9 -1
@@ -1035,6 +1035,7 @@ void perf_evsel__config(struct perf_evsel *evsel, struct record_opts *opts, attr->mmap = track; attr->mmap2 = track && !perf_missing_features.mmap2; attr->comm = track; + attr->ksymbol = track && !perf_missing_features.ksymbol;if (opts->record_namespaces) attr->namespaces = track;
@@ -1652,6 +1653,7 @@ int perf_event_attr__fprintf(FILE *fp, struct perf_event_attr *attr,PRINT_ATTRf (context_switch, p_unsigned);PRINT_ATTRf (write_backward, p_unsigned);PRINT_ATTRf (namespaces, p_unsigned); +PRINT_ATTRf (ksymbol, p_unsigned);PRINT_ATTRn ("{ wakeup_events, wakeup_watermark }" , wakeup_events, p_unsigned);PRINT_ATTRf (bp_type, p_unsigned);
@@ -1811,6 +1813,8 @@ int perf_evsel__open(struct perf_evsel *evsel, struct cpu_map *cpus, PERF_SAMPLE_BRANCH_NO_CYCLES);if (perf_missing_features.group_read && evsel->attr.inherit) evsel->attr.read_format &= ~(PERF_FORMAT_GROUP |PERF_FORMAT_ID ); +if (perf_missing_features.ksymbol) + evsel->attr.ksymbol =0 ; retry_sample_id:if (perf_missing_features.sample_id_all) evsel->attr.sample_id_all =0 ;
@@ -1930,7 +1934,11 @@ int perf_evsel__open(struct perf_evsel *evsel, struct cpu_map *cpus,* Must probe features in the order they were added to the * perf_event_attr interface. */ -if (!perf_missing_features.write_backward && evsel->attr.write_backward) { +if (!perf_missing_features.ksymbol && evsel->attr.ksymbol) { + perf_missing_features.ksymbol = true; +pr_debug2 ("switching off ksymbol\n" ); + goto fallback_missing_features; + }else if (!perf_missing_features.write_backward && evsel->attr.write_backward) { perf_missing_features.write_backward = true;pr_debug2 ("switching off write_backward\n" ); goto out_close;
tools/perf/util/evsel.h +1 -0
@@ -168,6 +168,7 @@ struct perf_missing_features {bool lbr_flags;bool write_backward;bool group_read; +bool ksymbol; };extern struct perf_missing_features perf_missing_features;
tools/perf/util/machine.c +55 -0
67 lines not on this page · raw message
tools/perf/util/machine.h +3 -0
@@ -130,6 +130,9 @@ int machine__process_mmap_event(struct machine *machine, union perf_event *event struct perf_sample *sample);int machine__process_mmap2_event (struct machine *machine,union perf_event *event,struct perf_sample *sample); +int machine__process_ksymbol (struct machine *machine, +union perf_event *event, +struct perf_sample *sample);int machine__process_event (struct machine *machine,union perf_event *event,struct perf_sample *sample);
tools/perf/util/session.c +4 -0
@@ -379,6 +379,8 @@ void perf_tool__fill_defaults(struct perf_tool *tool) tool->itrace_start = perf_event__process_itrace_start;if (tool->context_switch ==NULL ) tool->context_switch = perf_event__process_switch; +if (tool->ksymbol ==NULL ) + tool->ksymbol = perf_event__process_ksymbol;if (tool->read ==NULL ) tool->read = process_event_sample_stub;if (tool->throttle ==NULL )
@@ -1310,6 +1312,8 @@ static int machines__deliver_event(struct machines *machines,case PERF_RECORD_SWITCH :case PERF_RECORD_SWITCH_CPU_WIDE :return tool->context_switch (tool, event, sample, machine); +case PERF_RECORD_KSYMBOL : +return tool->ksymbol (tool, event, sample, machine);default : ++evlist->stats.nr_unknown_events;return -1 ;
tools/perf/util/tool.h +3 -1
@@ -53,7 +53,9 @@ struct perf_tool { itrace_start, context_switch, throttle, - unthrottle; + unthrottle, + ksymbol; +event_attr_op attr;event_attr_op event_update;event_op2 tracing_data;
Signature · 1 line
2.20.1
Arnaldo Carvalho de Melo
maintainerPATCH 19/24 perf tools: Handle PERF_RECORD_BPF_EVENT
In reply to Arnaldo Carvalho de MeloFrom: Song Liu <[email protected]>
This patch adds basic handling of PERF_RECORD_BPF_EVENT. Tracking of PERF_RECORD_BPF_EVENT is OFF by default. Option --bpf-event is added to turn it on.
Committer notes:
Add dummy machine__process_bpf_event() variant that returns zero for systems without HAVE_LIBBPF_SUPPORT, such as Alpine Linux, unbreaking the build in such systems.
Remove the needless include <machine.h> from bpf->event.h, provide just forward declarations for the structs and unions in the parameters, to reduce compilation time and needless rebuilds when machine.h gets changed.
Committer testing:
When running with:
# perf record --bpf-event
On an older kernel where PERF_RECORD_BPF_EVENT and PERF_RECORD_KSYMBOL is not present, we fallback to removing those two bits from perf_event_attr, making the tool to continue to work on older kernels:
perf_event_attr:
size 112
{ sample_period, sample_freq } 4000
sample_type IP|TID|TIME|PERIOD
read_format ID
disabled 1
inherit 1
mmap 1
comm 1
freq 1
enable_on_exec 1
task 1
precise_ip 3
sample_id_all 1
exclude_guest 1
mmap2 1
comm_exec 1
ksymbol 1
bpf_event 1
------------------------------------------------------------
sys_perf_event_open: pid 5779 cpu 0 group_fd -1 flags 0x8
sys_perf_event_open failed, error -22
switching off bpf_event
------------------------------------------------------------
perf_event_attr:
size 112
{ sample_period, sample_freq } 4000
sample_type IP|TID|TIME|PERIOD
read_format ID
disabled 1
inherit 1
mmap 1
comm 1
freq 1
enable_on_exec 1
task 1
precise_ip 3
sample_id_all 1
exclude_guest 1
mmap2 1
comm_exec 1
ksymbol 1
------------------------------------------------------------
sys_perf_event_open: pid 5779 cpu 0 group_fd -1 flags 0x8
sys_perf_event_open failed, error -22
switching off ksymbol
------------------------------------------------------------
perf_event_attr:
size 112
{ sample_period, sample_freq } 4000
sample_type IP|TID|TIME|PERIOD
read_format ID
disabled 1
inherit 1
mmap 1
comm 1
freq 1
enable_on_exec 1
task 1
precise_ip 3
sample_id_all 1
exclude_guest 1
mmap2 1
comm_exec 1------------------------------------------------------------
And then proceeds to work without those two features.
As passing --bpf-event is an explicit action performed by the user, perhaps we should emit a warning telling that the kernel has no such feature, but this can be done on top of this patch.
Now with a kernel that supports these events, start the 'record --bpf-event -a' and then run 'perf trace sleep 10000' that will use the BPF augmented_raw_syscalls.o prebuilt (for another kernel version even) and thus should generate PERF_RECORD_BPF_EVENT events:
[root@quaco ~]# perf record -e dummy -a --bpf-event ^C[ perf record: Woken up 1 times to write data ] [ perf record: Captured and wrote 0.713 MB perf.data ]
[root@quaco ~]# bpftool prog
13: cgroup_skb tag 7be49e3934a125ba gpl
loaded_at 2019-01-19T09:09:43-0300 uid 0 xlated 296B jited 229B memlock 4096B map_ids 13,14
14: cgroup_skb tag 2a142ef67aaad174 gpl
loaded_at 2019-01-19T09:09:43-0300 uid 0 xlated 296B jited 229B memlock 4096B map_ids 13,14
15: cgroup_skb tag 7be49e3934a125ba gpl
loaded_at 2019-01-19T09:09:43-0300 uid 0 xlated 296B jited 229B memlock 4096B map_ids 15,16
16: cgroup_skb tag 2a142ef67aaad174 gpl
loaded_at 2019-01-19T09:09:43-0300 uid 0 xlated 296B jited 229B memlock 4096B map_ids 15,16
17: cgroup_skb tag 7be49e3934a125ba gpl
loaded_at 2019-01-19T09:09:44-0300 uid 0 xlated 296B jited 229B memlock 4096B map_ids 17,18
18: cgroup_skb tag 2a142ef67aaad174 gpl
loaded_at 2019-01-19T09:09:44-0300 uid 0 xlated 296B jited 229B memlock 4096B map_ids 17,18
21: cgroup_skb tag 7be49e3934a125ba gpl
loaded_at 2019-01-19T09:09:45-0300 uid 0 xlated 296B jited 229B memlock 4096B map_ids 21,22
22: cgroup_skb tag 2a142ef67aaad174 gpl
loaded_at 2019-01-19T09:09:45-0300 uid 0 xlated 296B jited 229B memlock 4096B map_ids 21,22
31: tracepoint name sys_enter tag 12504ba9402f952f gpl
loaded_at 2019-01-19T09:19:56-0300 uid 0 xlated 512B jited 374B memlock 4096B map_ids 30,29,28
32: tracepoint name sys_exit tag c1bd85c092d6e4aa gpl
loaded_at 2019-01-19T09:19:56-0300 uid 0 xlated 256B jited 191B memlock 4096B map_ids 30,29
# perf report -D | grep PERF_RECORD_BPF_EVENT | nl
1 0 55834574849 0x4fc8 [0x18]: PERF_RECORD_BPF_EVENT bpf event with type 1, flags 0, id 13
2 0 60129542145 0x5118 [0x18]: PERF_RECORD_BPF_EVENT bpf event with type 1, flags 0, id 14
3 0 64424509441 0x5268 [0x18]: PERF_RECORD_BPF_EVENT bpf event with type 1, flags 0, id 15
4 0 68719476737 0x53b8 [0x18]: PERF_RECORD_BPF_EVENT bpf event with type 1, flags 0, id 16
5 0 73014444033 0x5508 [0x18]: PERF_RECORD_BPF_EVENT bpf event with type 1, flags 0, id 17
6 0 77309411329 0x5658 [0x18]: PERF_RECORD_BPF_EVENT bpf event with type 1, flags 0, id 18
7 0 90194313217 0x57a8 [0x18]: PERF_RECORD_BPF_EVENT bpf event with type 1, flags 0, id 21
8 0 94489280513 0x58f8 [0x18]: PERF_RECORD_BPF_EVENT bpf event with type 1, flags 0, id 22
9 7 620922484360 0xb6390 [0x30]: PERF_RECORD_BPF_EVENT bpf event with type 1, flags 0, id 29
10 7 620922486018 0xb6410 [0x30]: PERF_RECORD_BPF_EVENT bpf event with type 2, flags 0, id 29
11 7 620922579199 0xb6490 [0x30]: PERF_RECORD_BPF_EVENT bpf event with type 1, flags 0, id 30
12 7 620922580240 0xb6510 [0x30]: PERF_RECORD_BPF_EVENT bpf event with type 2, flags 0, id 30
13 7 620922765207 0xb6598 [0x30]: PERF_RECORD_BPF_EVENT bpf event with type 1, flags 0, id 31
14 7 620922874543 0xb6620 [0x30]: PERF_RECORD_BPF_EVENT bpf event with type 1, flags 0, id 32
#There, the 31 and 32 tracepoint BPF programs put in place by 'perf trace'.
--- tools/perf/builtin-record.c | 1 + tools/perf/perf.h | 1 + tools/perf/util/Build | 2 ++ tools/perf/util/bpf-event.c | 15 +++++++++++++++ tools/perf/util/bpf-event.h | 22 ++++++++++++++++++++++ tools/perf/util/event.c | 20 ++++++++++++++++++++ tools/perf/util/event.h | 16 ++++++++++++++++ tools/perf/util/evsel.c | 11 ++++++++++- tools/perf/util/evsel.h | 1 + tools/perf/util/machine.c | 3 +++ tools/perf/util/session.c | 4 ++++ tools/perf/util/tool.h | 3 ++- 12 files changed, 97 insertions(+), 2 deletions(-) create mode 100644 tools/perf/util/bpf-event.c create mode 100644 tools/perf/util/bpf-event.h
tools/perf/builtin-record.c +1 -0
@@ -1839,6 +1839,7 @@ static struct option __record_options[] = {OPT_BOOLEAN (0 ,"tail-synthesize" , &record.opts.tail_synthesize,"synthesize non-sample events at the end of output" ),OPT_BOOLEAN (0 ,"overwrite" , &record.opts.overwrite,"use overwrite mode" ), +OPT_BOOLEAN (0 ,"bpf-event" , &record.opts.bpf_event,"record bpf events" ),OPT_BOOLEAN (0 ,"strict-freq" , &record.opts.strict_freq,"Fail if the specified frequency can't be used" ), OPT_CALLBACK('F', "freq", &record.opts, "freq or 'max'",
tools/perf/perf.h +1 -0
@@ -66,6 +66,7 @@ struct record_opts {bool ignore_missing_thread;bool strict_freq;bool sample_id; +bool bpf_event;unsigned int freq;unsigned int mmap_pages;unsigned int auxtrace_mmap_pages;
tools/perf/util/Build +2 -0
@@ -154,6 +154,8 @@ endif libperf-y += perf-hooks.o +libperf-$(CONFIG_LIBBPF) += bpf-event.o + libperf-$(CONFIG_CXX) += c++/ CFLAGS_config.o += -DETC_PERFCONFIG="BUILD_STR($(ETC_PERFCONFIG_SQ))"
tools/perf/util/bpf-event.c new file +15 -0
@@ -0,0 +1,15 @@ +// SPDX-License-Identifier: GPL-2.0 +#include <errno.h> +#include <bpf/bpf.h> +#include "bpf-event.h" +#include "debug.h" +#include "symbol.h" + +int machine__process_bpf_event (struct machine *machine__maybe_unused , +union perf_event *event, +struct perf_sample *sample__maybe_unused ) +{ +if (dump_trace) +perf_event__fprintf_bpf_event (event, stdout); +return 0 ; +}
tools/perf/util/bpf-event.h new file +22 -0
@@ -0,0 +1,22 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +#ifndef __PERF_BPF_EVENT_H +#define __PERF_BPF_EVENT_H + +#include <linux/compiler.h> + +struct machine ; +union perf_event ; +struct perf_sample ; + +#ifdef HAVE_LIBBPF_SUPPORT +int machine__process_bpf_event (struct machine *machine,union perf_event *event, +struct perf_sample *sample); +#else +static inline int machine__process_bpf_event (struct machine *machine__maybe_unused , +union perf_event *event__maybe_unused , +struct perf_sample *sample__maybe_unused ) +{ +return 0 ; +} +#endif // HAVE_LIBBPF_SUPPORT +#endif
tools/perf/util/event.c +20 -0
@@ -25,6 +25,7 @@#include "asm/bug.h" #include "stat.h" #include "session.h" +#include "bpf-event.h" #define DEFAULT_PROC_MAP_PARSE_TIMEOUT 500
@@ -47,6 +48,7 @@ static const char *perf_event__names[] = { [PERF_RECORD_SWITCH_CPU_WIDE] = "SWITCH_CPU_WIDE", [PERF_RECORD_NAMESPACES] = "NAMESPACES", [PERF_RECORD_KSYMBOL] = "KSYMBOL", + [PERF_RECORD_BPF_EVENT] = "BPF_EVENT", [PERF_RECORD_HEADER_ATTR] = "ATTR", [PERF_RECORD_HEADER_EVENT_TYPE] = "EVENT_TYPE", [PERF_RECORD_HEADER_TRACING_DATA] = "TRACING_DATA",
@@ -1339,6 +1341,14 @@ int perf_event__process_ksymbol(struct perf_tool *tool __maybe_unused,return machine__process_ksymbol (machine, event, sample); } +int perf_event__process_bpf_event (struct perf_tool *tool__maybe_unused , +union perf_event *event, +struct perf_sample *sample__maybe_unused , +struct machine *machine) +{ +return machine__process_bpf_event (machine, event, sample); +} +size_t perf_event__fprintf_mmap (union perf_event *event,FILE *fp) { return fprintf(fp, " %d/%d: [%#" PRIx64 "(%#" PRIx64 ") @ %#" PRIx64 "]: %c %s\n",
@@ -1479,6 +1489,13 @@ size_t perf_event__fprintf_ksymbol(union perf_event *event, FILE *fp) event->ksymbol_event.flags, event->ksymbol_event.name); } +size_t perf_event__fprintf_bpf_event (union perf_event *event,FILE *fp) +{ +return fprintf (fp," bpf event with type %u, flags %u, id %u\n" , + event->bpf_event.type, event->bpf_event.flags, + event->bpf_event.id); +} +size_t perf_event__fprintf (union perf_event *event,FILE *fp) { size_t ret = fprintf(fp, "PERF_RECORD_%s",
@@ -1517,6 +1534,9 @@ size_t perf_event__fprintf(union perf_event *event, FILE *fp)case PERF_RECORD_KSYMBOL : ret +=perf_event__fprintf_ksymbol (event, fp);break ; +case PERF_RECORD_BPF_EVENT : + ret +=perf_event__fprintf_bpf_event (event, fp); +break ;default : ret +=fprintf (fp,"\n" ); }
tools/perf/util/event.h +16 -0
@@ -98,6 +98,16 @@ struct ksymbol_event {char name[KSYM_NAME_LEN ]; }; +struct bpf_event { +struct perf_event_header header; +u16 type; +u16 flags; +u32 id; + +/* for bpf_prog types */ +u8 tag[BPF_TAG_SIZE ];// prog tag +}; +#define PERF_SAMPLE_MASK \ (PERF_SAMPLE_IP | PERF_SAMPLE_TID | \ PERF_SAMPLE_TIME | PERF_SAMPLE_ADDR | \
@@ -666,6 +676,7 @@ union perf_event {struct time_conv_event time_conv;struct feature_event feat;struct ksymbol_event ksymbol_event; +struct bpf_event bpf_event; };void perf_event__print_totals (void );
@@ -767,6 +778,10 @@ int perf_event__process_ksymbol(struct perf_tool *tool,union perf_event *event, struct perf_sample *sample, struct machine *machine); +int perf_event__process_bpf_event (struct perf_tool *tool, +union perf_event *event, +struct perf_sample *sample, +struct machine *machine); int perf_tool__process_synth_event(struct perf_tool *tool, union perf_event *event, struct machine *machine,
@@ -831,6 +846,7 @@ size_t perf_event__fprintf_thread_map(union perf_event *event, FILE *fp);size_t perf_event__fprintf_cpu_map (union perf_event *event,FILE *fp);size_t perf_event__fprintf_namespaces (union perf_event *event,FILE *fp);size_t perf_event__fprintf_ksymbol (union perf_event *event,FILE *fp); +size_t perf_event__fprintf_bpf_event (union perf_event *event,FILE *fp);size_t perf_event__fprintf (union perf_event *event,FILE *fp); int kallsyms__get_function_start(const char *kallsyms_filename,
tools/perf/util/evsel.c +10 -1
@@ -1036,6 +1036,8 @@ void perf_evsel__config(struct perf_evsel *evsel, struct record_opts *opts, attr->mmap2 = track && !perf_missing_features.mmap2; attr->comm = track; attr->ksymbol = track && !perf_missing_features.ksymbol; + attr->bpf_event = track && opts->bpf_event && + !perf_missing_features.bpf_event;if (opts->record_namespaces) attr->namespaces = track;
@@ -1654,6 +1656,7 @@ int perf_event_attr__fprintf(FILE *fp, struct perf_event_attr *attr,PRINT_ATTRf (write_backward, p_unsigned);PRINT_ATTRf (namespaces, p_unsigned);PRINT_ATTRf (ksymbol, p_unsigned); +PRINT_ATTRf (bpf_event, p_unsigned);PRINT_ATTRn ("{ wakeup_events, wakeup_watermark }" , wakeup_events, p_unsigned);PRINT_ATTRf (bp_type, p_unsigned);
@@ -1815,6 +1818,8 @@ int perf_evsel__open(struct perf_evsel *evsel, struct cpu_map *cpus, evsel->attr.read_format &= ~(PERF_FORMAT_GROUP |PERF_FORMAT_ID );if (perf_missing_features.ksymbol) evsel->attr.ksymbol =0 ; +if (perf_missing_features.bpf_event) + evsel->attr.bpf_event =0 ; retry_sample_id:if (perf_missing_features.sample_id_all) evsel->attr.sample_id_all =0 ;
@@ -1934,7 +1939,11 @@ int perf_evsel__open(struct perf_evsel *evsel, struct cpu_map *cpus,* Must probe features in the order they were added to the * perf_event_attr interface. */ -if (!perf_missing_features.ksymbol && evsel->attr.ksymbol) { +if (!perf_missing_features.bpf_event && evsel->attr.bpf_event) { + perf_missing_features.bpf_event = true; +pr_debug2 ("switching off bpf_event\n" ); + goto fallback_missing_features; + }else if (!perf_missing_features.ksymbol && evsel->attr.ksymbol) { perf_missing_features.ksymbol = true;pr_debug2 ("switching off ksymbol\n" ); goto fallback_missing_features;
tools/perf/util/evsel.h +1 -0
@@ -169,6 +169,7 @@ struct perf_missing_features {bool write_backward;bool group_read;bool ksymbol; +bool bpf_event; };extern struct perf_missing_features perf_missing_features;
tools/perf/util/machine.c +3 -0
@@ -21,6 +21,7 @@#include "unwind.h" #include "linux/hash.h" #include "asm/bug.h" +#include "bpf-event.h" #include "sane_ctype.h" #include <symbol/kallsyms.h>
@@ -1867,6 +1868,8 @@ int machine__process_event(struct machine *machine, union perf_event *event, ret =machine__process_switch_event (machine, event);break ;case PERF_RECORD_KSYMBOL : ret =machine__process_ksymbol (machine, event, sample);break ; +case PERF_RECORD_BPF_EVENT : + ret =machine__process_bpf_event (machine, event, sample);break ;default : ret =-1 ;break ;
tools/perf/util/session.c +4 -0
@@ -381,6 +381,8 @@ void perf_tool__fill_defaults(struct perf_tool *tool) tool->context_switch = perf_event__process_switch;if (tool->ksymbol ==NULL ) tool->ksymbol = perf_event__process_ksymbol; +if (tool->bpf_event ==NULL ) + tool->bpf_event = perf_event__process_bpf_event;if (tool->read ==NULL ) tool->read = process_event_sample_stub;if (tool->throttle ==NULL )
@@ -1314,6 +1316,8 @@ static int machines__deliver_event(struct machines *machines,return tool->context_switch (tool, event, sample, machine);case PERF_RECORD_KSYMBOL :return tool->ksymbol (tool, event, sample, machine); +case PERF_RECORD_BPF_EVENT : +return tool->bpf_event (tool, event, sample, machine);default : ++evlist->stats.nr_unknown_events;return -1 ;
tools/perf/util/tool.h +2 -1
@@ -54,7 +54,8 @@ struct perf_tool { context_switch, throttle, unthrottle, - ksymbol; + ksymbol, + bpf_event;event_attr_op attr;event_attr_op event_update;
Signature · 1 line
2.20.1
Arnaldo Carvalho de Melo
maintainerPATCH 20/24 perf tools: Synthesize PERF_RECORD_* for loaded BPF programs
In reply to Arnaldo Carvalho de MeloFrom: Song Liu <[email protected]>
This patch synthesize PERF_RECORD_KSYMBOL and PERF_RECORD_BPF_EVENT for BPF programs loaded before perf-record. This is achieved by gathering information about all BPF programs via sys_bpf.
Committer testing:
# perf record --bpf-event sleep 1
[ perf record: Woken up 1 times to write data ]
[ perf record: Captured and wrote 0.021 MB perf.data (7 samples) ]
# perf report -D | grep PERF_RECORD_BPF_EVENT | nl
1 0 0x4b10 [0x18]: PERF_RECORD_BPF_EVENT bpf event with type 1, flags 0, id 13
2 0 0x4c60 [0x18]: PERF_RECORD_BPF_EVENT bpf event with type 1, flags 0, id 14
3 0 0x4db0 [0x18]: PERF_RECORD_BPF_EVENT bpf event with type 1, flags 0, id 15
4 0 0x4f00 [0x18]: PERF_RECORD_BPF_EVENT bpf event with type 1, flags 0, id 16
5 0 0x5050 [0x18]: PERF_RECORD_BPF_EVENT bpf event with type 1, flags 0, id 17
6 0 0x51a0 [0x18]: PERF_RECORD_BPF_EVENT bpf event with type 1, flags 0, id 18
7 0 0x52f0 [0x18]: PERF_RECORD_BPF_EVENT bpf event with type 1, flags 0, id 21
8 0 0x5440 [0x18]: PERF_RECORD_BPF_EVENT bpf event with type 1, flags 0, id 22
# bpftool prog
13: cgroup_skb tag 7be49e3934a125ba gpl
loaded_at 2019-01-19T09:09:43-0300 uid 0
xlated 296B jited 229B memlock 4096B map_ids 13,14
14: cgroup_skb tag 2a142ef67aaad174 gpl
loaded_at 2019-01-19T09:09:43-0300 uid 0
xlated 296B jited 229B memlock 4096B map_ids 13,14
15: cgroup_skb tag 7be49e3934a125ba gpl
loaded_at 2019-01-19T09:09:43-0300 uid 0
xlated 296B jited 229B memlock 4096B map_ids 15,16
16: cgroup_skb tag 2a142ef67aaad174 gpl
loaded_at 2019-01-19T09:09:43-0300 uid 0
xlated 296B jited 229B memlock 4096B map_ids 15,16
17: cgroup_skb tag 7be49e3934a125ba gpl
loaded_at 2019-01-19T09:09:44-0300 uid 0
xlated 296B jited 229B memlock 4096B map_ids 17,18
18: cgroup_skb tag 2a142ef67aaad174 gpl
loaded_at 2019-01-19T09:09:44-0300 uid 0
xlated 296B jited 229B memlock 4096B map_ids 17,18
21: cgroup_skb tag 7be49e3934a125ba gpl
loaded_at 2019-01-19T09:09:45-0300 uid 0
xlated 296B jited 229B memlock 4096B map_ids 21,22
22: cgroup_skb tag 2a142ef67aaad174 gpl
loaded_at 2019-01-19T09:09:45-0300 uid 0
xlated 296B jited 229B memlock 4096B map_ids 21,22
# # perf report -D | grep -B22 PERF_RECORD_KSYMBOL
. ... raw event: size 312 bytes
. 0000: 11 00 00 00 00 00 38 01 ff 44 06 c0 ff ff ff ff ......8..D......
. 0010: e5 00 00 00 01 00 00 00 62 70 66 5f 70 72 6f 67 ........bpf_prog
. 0020: 5f 37 62 65 34 39 65 33 39 33 34 61 31 32 35 62 _7be49e3934a125b
. 0030: 61 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 a...............
<SNIP zeroes>
. 0110: 00 00 00 00 00 00 00 00 21 00 00 00 00 00 00 00 ........!.......
. 0120: 7b e4 9e 39 34 a1 25 ba 00 00 00 00 00 00 00 00 {..94.%.........
. 0130: 00 00 00 00 00 00 00 00 ........ 0 0x49d8 [0x138]: PERF_RECORD_KSYMBOL ksymbol event with addr ffffffffc00644ff len 229 type 1 flags 0x0 name bpf_prog_7be49e3934a125ba --
. ... raw event: size 312 bytes
. 0000: 11 00 00 00 00 00 38 01 48 6d 06 c0 ff ff ff ff ......8.Hm...... . 0010: e5 00 00 00 01 00 00 00 62 70 66 5f 70 72 6f 67 ........bpf_prog . 0020: 5f 32 61 31 34 32 65 66 36 37 61 61 61 64 31 37 _2a142ef67aaad17 . 0030: 34 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 4............... <SNIP zeroes> . 0110: 00 00 00 00 00 00 00 00 21 00 00 00 00 00 00 00 ........!....... . 0120: 2a 14 2e f6 7a aa d1 74 00 00 00 00 00 00 00 00 *...z..t........ . 0130: 00 00 00 00 00 00 00 00 ........
0 0x4b28 [0x138]: PERF_RECORD_KSYMBOL ksymbol event with addr ffffffffc0066d48 len 229 type 1 flags 0x0 name bpf_prog_2a142ef67aaad174 --
. ... raw event: size 312 bytes
. 0000: 11 00 00 00 00 00 38 01 04 cf 03 c0 ff ff ff ff ......8.........
. 0010: e5 00 00 00 01 00 00 00 62 70 66 5f 70 72 6f 67 ........bpf_prog
. 0020: 5f 37 62 65 34 39 65 33 39 33 34 61 31 32 35 62 _7be49e3934a125b
. 0030: 61 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 a...............
<SNIP zeroes>
. 0110: 00 00 00 00 00 00 00 00 21 00 00 00 00 00 00 00 ........!.......
. 0120: 7b e4 9e 39 34 a1 25 ba 00 00 00 00 00 00 00 00 {..94.%.........
. 0130: 00 00 00 00 00 00 00 00 ........ 0 0x4c78 [0x138]: PERF_RECORD_KSYMBOL ksymbol event with addr ffffffffc003cf04 len 229 type 1 flags 0x0 name bpf_prog_7be49e3934a125ba --
. ... raw event: size 312 bytes
. 0000: 11 00 00 00 00 00 38 01 96 28 04 c0 ff ff ff ff ......8..(...... . 0010: e5 00 00 00 01 00 00 00 62 70 66 5f 70 72 6f 67 ........bpf_prog . 0020: 5f 32 61 31 34 32 65 66 36 37 61 61 61 64 31 37 _2a142ef67aaad17 . 0030: 34 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 4............... <SNIP zeroes> . 0110: 00 00 00 00 00 00 00 00 21 00 00 00 00 00 00 00 ........!....... . 0120: 2a 14 2e f6 7a aa d1 74 00 00 00 00 00 00 00 00 *...z..t........ . 0130: 00 00 00 00 00 00 00 00 ........
0 0x4dc8 [0x138]: PERF_RECORD_KSYMBOL ksymbol event with addr ffffffffc0042896 len 229 type 1 flags 0x0 name bpf_prog_2a142ef67aaad174 --
. ... raw event: size 312 bytes
. 0000: 11 00 00 00 00 00 38 01 05 13 17 c0 ff ff ff ff ......8.........
. 0010: e5 00 00 00 01 00 00 00 62 70 66 5f 70 72 6f 67 ........bpf_prog
. 0020: 5f 37 62 65 34 39 65 33 39 33 34 61 31 32 35 62 _7be49e3934a125b
. 0030: 61 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 a...............
<SNIP zeroes>
. 0110: 00 00 00 00 00 00 00 00 21 00 00 00 00 00 00 00 ........!.......
. 0120: 7b e4 9e 39 34 a1 25 ba 00 00 00 00 00 00 00 00 {..94.%.........
. 0130: 00 00 00 00 00 00 00 00 ........ 0 0x4f18 [0x138]: PERF_RECORD_KSYMBOL ksymbol event with addr ffffffffc0171305 len 229 type 1 flags 0x0 name bpf_prog_7be49e3934a125ba --
. ... raw event: size 312 bytes
. 0000: 11 00 00 00 00 00 38 01 0a 8c 23 c0 ff ff ff ff ......8...#..... . 0010: e5 00 00 00 01 00 00 00 62 70 66 5f 70 72 6f 67 ........bpf_prog . 0020: 5f 32 61 31 34 32 65 66 36 37 61 61 61 64 31 37 _2a142ef67aaad17 . 0030: 34 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 4............... <SNIP zeroes> . 0110: 00 00 00 00 00 00 00 00 21 00 00 00 00 00 00 00 ........!....... . 0120: 2a 14 2e f6 7a aa d1 74 00 00 00 00 00 00 00 00 *...z..t........ . 0130: 00 00 00 00 00 00 00 00 ........
0 0x5068 [0x138]: PERF_RECORD_KSYMBOL ksymbol event with addr ffffffffc0238c0a len 229 type 1 flags 0x0 name bpf_prog_2a142ef67aaad174 --
. ... raw event: size 312 bytes
. 0000: 11 00 00 00 00 00 38 01 2a a5 a4 c0 ff ff ff ff ......8.*.......
. 0010: e5 00 00 00 01 00 00 00 62 70 66 5f 70 72 6f 67 ........bpf_prog
. 0020: 5f 37 62 65 34 39 65 33 39 33 34 61 31 32 35 62 _7be49e3934a125b
. 0030: 61 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 a...............
<SNIP zeroes>
. 0110: 00 00 00 00 00 00 00 00 21 00 00 00 00 00 00 00 ........!.......
. 0120: 7b e4 9e 39 34 a1 25 ba 00 00 00 00 00 00 00 00 {..94.%.........
. 0130: 00 00 00 00 00 00 00 00 ........ 0 0x51b8 [0x138]: PERF_RECORD_KSYMBOL ksymbol event with addr ffffffffc0a4a52a len 229 type 1 flags 0x0 name bpf_prog_7be49e3934a125ba --
. ... raw event: size 312 bytes
. 0000: 11 00 00 00 00 00 38 01 9b c9 a4 c0 ff ff ff ff ......8......... . 0010: e5 00 00 00 01 00 00 00 62 70 66 5f 70 72 6f 67 ........bpf_prog . 0020: 5f 32 61 31 34 32 65 66 36 37 61 61 61 64 31 37 _2a142ef67aaad17 . 0030: 34 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 4............... <SNIP zeroes> . 0110: 00 00 00 00 00 00 00 00 21 00 00 00 00 00 00 00 ........!....... . 0120: 2a 14 2e f6 7a aa d1 74 00 00 00 00 00 00 00 00 *...z..t........ . 0130: 00 00 00 00 00 00 00 00 ........
0 0x5308 [0x138]: PERF_RECORD_KSYMBOL ksymbol event with addr ffffffffc0a4c99b len 229 type 1 flags 0x0 name bpf_prog_2a142ef67aaad174
--- tools/perf/builtin-record.c | 6 + tools/perf/util/bpf-event.c | 241 ++++++++++++++++++++++++++++++++++++ tools/perf/util/bpf-event.h | 16 +++ 3 files changed, 263 insertions(+)
tools/perf/builtin-record.c +6 -0
@@ -41,6 +41,7 @@#include "util/perf-hooks.h" #include "util/time-utils.h" #include "util/units.h" +#include "util/bpf-event.h" #include "asm/bug.h" #include <errno.h>
@@ -1082,6 +1083,11 @@ static int record__synthesize(struct record *rec, bool tail)return err; } + err =perf_event__synthesize_bpf_events (tool, process_synthesized_event, + machine, opts); +if (err <0 ) +pr_warning ("Couldn't synthesize bpf events.\n" ); + err =__machine__synthesize_threads (machine, tool, &opts->target, rec->evlist->threads, process_synthesized_event, opts->sample_address,1 );
tools/perf/util/bpf-event.c +241 -0
254 lines not on this page · raw message
tools/perf/util/bpf-event.h +16 -0
@@ -3,14 +3,22 @@#define __PERF_BPF_EVENT_H#include <linux/compiler.h> +#include "event.h" struct machine ;union perf_event ;struct perf_sample ; +struct perf_tool ; +struct record_opts ;#ifdef HAVE_LIBBPF_SUPPORT int machine__process_bpf_event (struct machine *machine,union perf_event *event,struct perf_sample *sample); + +int perf_event__synthesize_bpf_events (struct perf_tool *tool, +perf_event__handler_t process, +struct machine *machine, +struct record_opts *opts);#else static inline int machine__process_bpf_event(struct machine *machine __maybe_unused, union perf_event *event __maybe_unused,
@@ -18,5 +26,13 @@ static inline int machine__process_bpf_event(struct machine *machine __maybe_unu {return 0 ; } + +static inline int perf_event__synthesize_bpf_events (struct perf_tool *tool__maybe_unused , +perf_event__handler_t process__maybe_unused , +struct machine *machine__maybe_unused , +struct record_opts *opts__maybe_unused ) +{ +return 0 ; +}#endif // HAVE_LIBBPF_SUPPORT #endif
Signature · 1 line
2.20.1
Arnaldo Carvalho de Melo
maintainerPATCH 21/24 perf top: Synthesize BPF events for pre-existing loaded BPF programs
In reply to Arnaldo Carvalho de MeloFrom: Arnaldo Carvalho de Melo <[email protected]>
So that we can resolve symbols and map names.
--- tools/perf/builtin-top.c | 7 +++++++ 1 file changed, 7 insertions(+)
tools/perf/builtin-top.c +7 -0
@@ -22,6 +22,7 @@#include "perf.h" #include "util/annotate.h" +#include "util/bpf-event.h" #include "util/config.h" #include "util/color.h" #include "util/drv_configs.h"
@@ -1215,6 +1216,12 @@ static int __cmd_top(struct perf_top *top)init_process_thread (top); + ret =perf_event__synthesize_bpf_events (&top->tool, perf_event__process, + &top->session->machines.host, + &top->record_opts); +if (ret <0 ) +pr_warning ("Couldn't synthesize bpf events.\n" ); +machine__synthesize_threads (&top->session->machines.host, &opts->target, top->evlist->threads, false, top->nr_threads_synthesize);
Signature · 1 line
2.20.1
Arnaldo Carvalho de Melo
maintainerPATCH 22/24 bpf: Add module name [bpf] to ksymbols for bpf programs
In reply to Arnaldo Carvalho de MeloFrom: Song Liu <[email protected]>
With this patch, /proc/kallsyms will show BPF programs as
<addr> t bpf_prog_<tag>_<name> [bpf]
--- kernel/kallsyms.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
kernel/kallsyms.c +1 -1
@@ -494,7 +494,7 @@ static int get_ksymbol_ftrace_mod(struct kallsym_iter *iter)static int get_ksymbol_bpf (struct kallsym_iter *iter) { - iter->module_name[0 ] ='\0' ; +strlcpy (iter->module_name,"bpf" ,MODULE_NAME_LEN ); iter->exported =0 ; return bpf_get_kallsym(iter->pos - iter->pos_ftrace_mod_end, &iter->value, &iter->type,
Signature · 1 line
2.20.1
Arnaldo Carvalho de Melo
maintainerPATCH 23/24 perf python: Remove -fstack-clash-protection when building with some clang versions
In reply to Arnaldo Carvalho de MeloFrom: Arnaldo Carvalho de Melo <[email protected]>
These options are not present in some (all?) clang versions, so when we build for a distro that has a gcc new enough to have these options and that the distro python build config settings use them but clang doesn't support, b00m.
This is the case with fedora rawhide (now gearing towards f30), so check if clang has the and remove the missing ones from CFLAGS.
--- tools/perf/util/setup.py | 2 ++ 1 file changed, 2 insertions(+)
tools/perf/util/setup.py +2 -0
@@ -17,6 +17,8 @@ if cc == "clang": vars[var] = sub("-mcet", "", vars[var]) if not clang_has_option("-fcf-protection"): vars[var] = sub("-fcf-protection", "", vars[var]) + if not clang_has_option("-fstack-clash-protection"): + vars[var] = sub("-fstack-clash-protection", "", vars[var]) from distutils.core import setup, Extension
Signature · 1 line
2.20.1
Arnaldo Carvalho de Melo
maintainerPATCH 24/24 perf utils: Move perf_config using routines from color.c to separate object
In reply to Arnaldo Carvalho de MeloFrom: Arnaldo Carvalho de Melo <[email protected]>
To untangle objects a bit more, avoiding rebuilding the color_fprintf routines when changes are made to the perf config headers.
--- tools/perf/util/Build | 1 + tools/perf/util/color.c | 39 ---------------------------- tools/perf/util/color_config.c | 47 ++++++++++++++++++++++++++++++++++ 3 files changed, 48 insertions(+), 39 deletions(-) create mode 100644 tools/perf/util/color_config.c
tools/perf/util/Build +1 -0
@@ -35,6 +35,7 @@ libperf-y += dso.o libperf-y += symbol.o libperf-y += symbol_fprintf.o libperf-y += color.o +libperf-y += color_config.o libperf-y += metricgroup.o libperf-y += header.o libperf-y += callchain.o
tools/perf/util/color.c +0 -39
@@ -1,7 +1,6 @@// SPDX-License-Identifier: GPL-2.0 #include <linux/kernel.h> #include "cache.h" -#include "config.h" #include <stdlib.h> #include <stdio.h> #include "color.h"
@@ -10,44 +9,6 @@int perf_use_color_default =-1 ; -int perf_config_colorbool (const char *var,const char *value,int stdout_is_tty) -{ -if (value) { -if (!strcasecmp (value,"never" )) -return 0 ; -if (!strcasecmp (value,"always" )) -return 1 ; -if (!strcasecmp (value,"auto" )) - goto auto_color; - } - -/* Missing or explicit false to turn off colorization */ -if (!perf_config_bool (var, value)) -return 0 ; - -/* any normal truth value defaults to 'auto' */ - auto_color: -if (stdout_is_tty <0 ) - stdout_is_tty =isatty (1 ); -if (stdout_is_tty ||pager_in_use ()) { -char *term =getenv ("TERM" ); -if (term &&strcmp (term,"dumb" )) -return 1 ; - } -return 0 ; -} - -int perf_color_default_config (const char *var,const char *value, -void *cb__maybe_unused ) -{ -if (!strcmp (var,"color.ui" )) { - perf_use_color_default =perf_config_colorbool (var, value,-1 ); -return 0 ; - } - -return 0 ; -} -static int __color_vsnprintf (char *bf,size_t size,const char *color,const char *fmt,va_list args,const char *trail) {
tools/perf/util/color_config.c new file +47 -0
47 lines not on this page · raw message
Signature · 1 line
2.20.1
Quoted 162 lines · Arnaldo Carvalho de Melo
Hi Ingo,
Please consider pulling,
Regards,
- Arnaldo
Test results at the end of this message, as usual.
The following changes since commit
ad07c8ceb6631a83b62d405a61448bba92adac68:perf/core: Remove unused
perf_flags(2019-01-21 11:01:31 +0100)are available in the Git repository at:
git://git.kernel.org/pub/scm/linux/kernel/git/acme/linux.gittags/perf-core-for-mingo-5.0-20190121for you to fetch changes up to
32e9136e37840a62c659259a394ed3735e3b3c84:perf utils: Move
perf_configusing routines fromcolor.cto separate object (2019-01-21 17:38:56 -0300)----------------------------------------------------------------
perf/core improvements and fixes:BPF:
Song Liu:
- Introduce
PERF_RECORD_KSYMBOLto allow tooling to notice the addition of new kernel symbols and be able to resolve samples in such symbols.- Introduce
PERF_RECORD_BPF_EVENTto notify tooling about the loading and unloading of BPF programs, making them visible and allowing for the request of further information to allow for things like annotation.- Change the userspace perf tools to handle those new events and to synthesize them for pre-existing loaded BPF programs.
Kernel:
Arnaldo Carvalho de Melo:
- Make
perf_event_output()propagate theoutput()return, allowing users to check for-ENOSPCin the ring buffer.perf report:
Thomas Richter:
- Display arch specific diagnostic counter sets, starting with s390 diagnostic counter sets.
perf session:
Jiri Olsa:
- Introduce a reader object to prep for multithreaded processing of recorded events.
Misc:
Rasmus Villemoes:
- Replace automatic const char[] variables by statics, to avoid initializing them at runtime, instead having them in .rodata, reducing code size.
YueHaibing:
- Remove duplicated
workqueue.hinclude fromperf_event.hBrajeswar Ghosh:
- Remove some more duplicated headers.
Signed-off-by Arnaldo Carvalho de Melo <[email protected]>----------------------------------------------------------------
Arnaldo Carvalho de Melo (4):
perf: Makeperf_event_output()propagate theoutput()return
perf top: Synthesize BPF events for pre-existing loaded BPF programs perf python: Remove -fstack-clash-protection when building with some clang versions perf utils: Moveperf_configusing routines fromcolor.cto separate objectBrajeswar Ghosh (1):
perf tools: Remove duplicate headersJiri Olsa (6):
perf session: Rearrangeperf_session__process_eventsfunction perf session: Get rid offile_sizevariable
perf session: Add reader object
perf session: Add 'data_size' member to reader object perf session: Add 'data_offset' member to reader object perf session: Addreader__process_eventsfunctionRasmus Villemoes (1):
perf tools: Replace automatic const char[] variables by staticsSong Liu (8):
perf, bpf: IntroducePERF_RECORD_KSYMBOL
tools headers uapi: Synctools/include/uapi/linux/perf_event.hperf, bpf: IntroducePERF_RECORD_BPF_EVENT
tools headers uapi: Synctools/include/uapi/linux/perf_event.hperf tools: HandlePERF_RECORD_KSYMBOL
perf tools: HandlePERF_RECORD_BPF_EVENT
perf tools: Synthesize PERF_RECORD_* for loaded BPF programs
bpf: Add module name [bpf] to ksymbols for bpf programsThomas Richter (3):
perf report: Display arch specific diagnostic counter sets, starting with s390 perf report: Display names in s390 diagnostic counter sets
perf report: Dump s390 counter set data to fileYueHaibing (1):
perf: Remove duplicatedworkqueue.hinclude fromperf_event.hinclude/linux/filter.h | 7 + include/linux/perf_event.h | 21 +- include/uapi/linux/perf_event.h | 53 ++++- kernel/bpf/core.c | 2 +- kernel/bpf/syscall.c | 2 + kernel/events/core.c | 224 +++++++++++++++++++- kernel/kallsyms.c | 2 +- kernel/trace/bpf_trace.c | 3 +- tools/include/uapi/linux/perf_event.h | 53 ++++- tools/perf/builtin-c2c.c | 4 +- tools/perf/builtin-kmem.c | 4 +- tools/perf/builtin-record.c | 7 + tools/perf/builtin-report.c | 6 +- tools/perf/builtin-sched.c | 2 +- tools/perf/builtin-stat.c | 1 - tools/perf/builtin-top.c | 7 + tools/perf/examples/bpf/augmented_raw_syscalls.c | 4 +- tools/perf/examples/bpf/augmented_syscalls.c | 14 +- tools/perf/examples/bpf/etcsnoop.c | 10 +- tools/perf/perf.h | 1 + tools/perf/tests/bp_account.c | 1 - tools/perf/ui/browsers/header.c | 2 +- tools/perf/ui/browsers/hists.c | 4 +- tools/perf/util/Build | 5 + tools/perf/util/bpf-event.c | 257 +++++++++++++++++++++++ tools/perf/util/bpf-event.h | 38 ++++ tools/perf/util/color.c | 39 ---- tools/perf/util/color_config.c | 47 +++++ tools/perf/util/dso.h | 1 - tools/perf/util/event.c | 41 ++++ tools/perf/util/event.h | 36 ++++ tools/perf/util/evlist.h | 4 +- tools/perf/util/evsel.c | 19 +- tools/perf/util/evsel.h | 2 + tools/perf/util/machine.c | 58 +++++ tools/perf/util/machine.h | 3 + tools/perf/util/s390-cpumcf-kernel.h | 62 ++++++ tools/perf/util/s390-cpumsf.c | 77 ++++++- tools/perf/util/s390-sample-raw.c | 222 ++++++++++++++++++++ tools/perf/util/sample-raw.c | 18 ++ tools/perf/util/sample-raw.h | 14 ++ tools/perf/util/session.c | 98 ++++++--- tools/perf/util/setup.py | 2 + tools/perf/util/tool.h | 5 +- tools/perf/util/zlib.c | 1 -
Quoted 8 lines
45 files changed, 1358 insertions(+), 125 deletions(-) create mode 100644 tools/perf/util/bpf-event.c create mode 100644 tools/perf/util/bpf-event.h create mode 100644 tools/perf/util/color_config.c create mode 100644 tools/perf/util/s390-cpumcf-kernel.h create mode 100644 tools/perf/util/s390-sample-raw.c create mode 100644 tools/perf/util/sample-raw.c create mode 100644 tools/perf/util/sample-raw.h
Pulled, thanks a lot Arnaldo!
Ingo