perf/core improvements and fixes
Arnaldo Carvalho de Melo
maintainerHi Ingo,
Please consider pulling,
- Arnaldo
Test results at the end of this message, as usual.
The following changes since commit 7f16023bfcc4b1f2bbccf86219dc97473db6e0d6:
Merge remote-tracking branch 'acme/perf/urgent' into perf/core (2018-09-18 17:20:41 -0300)
are available in the Git repository at:
git://git.kernel.org/pub/scm/linux/kernel/git/acme/linux.git tags/perf-core-for-mingo-4.20-20180919
for you to fetch changes up to 24ef0fd0a1f389b156e6ef0edd71072728831bd9:
perf python: Use -Wno-redundant-decls to build with PYTHON=python3 (2018-09-19 10:25:13 -0300)
----------------------------------------------------------------
perf/core improvements and fixes:
perf test:
- Add watchpoint entry (Ravi Bangoria)
Build fixes:
- Initialize perf_data_file fd field to fix building the CTF (trace format) converter with with gcc 4.8.4 on Ubuntu 14.04 (Jérémie Galarneau)
- Use -Wno-redundant-decls to build with PYTHON=python3 to build the python binding, fixing the build in systems such as Clear Linux (Arnaldo Carvalho de Melo)
Hardware tracing:
- Suppress AUX/OVERWRITE records (Alexander Shishkin)
Infrastructure:
- Adopt PTR_ERR_OR_ZERO from the kernel and use it in the bpf-loader instead of open coded equivalent (Ding Xiang)
- Improve the event ordering code to make it clear and fix a bug related to freeing of events when using pipe mode from 'record' to 'inject' (Jiri Olsa)
- Some prep work to facilitate per-cpu threads to write record data to per-cpu files (Jiri Olsa)
----------------------------------------------------------------
Alexander Shishkin (1):
perf: Suppress AUX/OVERWRITE records
Arnaldo Carvalho de Melo (1):
perf python: Use -Wno-redundant-decls to build with PYTHON=python3
Ding Xiang (2):
tools include: Adopt PTR_ERR_OR_ZERO from the kernel err.h header perf bpf-loader: use PTR_ERR_OR_ZERO inetead of return code
Jiri Olsa (7):
perf ordered_events: Add 'struct ordered_events_buffer' layer perf ordered_events: Prevent crossing max_alloc_size perf tools: Remove perf_tool from event_op2
perf tools: Remove perf_tool from event_op3
perf auxtrace: Pass struct perf_mmap into mmap__read* functions perf tools: Add 'struct perf_mmap' arg to record__write() perf util: Make copyfile_offset() global
Jérémie Galarneau (1):
perf tools: Initialize perf_data_file fd field
Ravi Bangoria (1):
perf test: Add watchpoint test
kernel/events/ring_buffer.c | 14 ++- tools/include/linux/err.h | 7 ++ tools/perf/builtin-annotate.c | 7 +- tools/perf/builtin-inject.c | 37 +++--- tools/perf/builtin-record.c | 51 +++++---- tools/perf/builtin-report.c | 9 +- tools/perf/builtin-script.c | 38 +++---- tools/perf/builtin-stat.c | 23 ++-- tools/perf/tests/Build | 1 + tools/perf/tests/builtin-test.c | 9 ++ tools/perf/tests/tests.h | 3 + tools/perf/tests/wp.c | 229 ++++++++++++++++++++++++++++++++++++++ tools/perf/util/auxtrace.c | 30 +++-- tools/perf/util/auxtrace.h | 21 ++-- tools/perf/util/bpf-loader.c | 2 +- tools/perf/util/data-convert-bt.c | 2 +- tools/perf/util/header.c | 16 ++- tools/perf/util/header.h | 15 +-- tools/perf/util/mmap.c | 6 +- tools/perf/util/mmap.h | 2 +- tools/perf/util/ordered-events.c | 87 ++++++++++++--- tools/perf/util/ordered-events.h | 37 +++--- tools/perf/util/session.c | 75 ++++++------- tools/perf/util/session.h | 5 +- tools/perf/util/setup.py | 2 +- tools/perf/util/stat.c | 5 +- tools/perf/util/stat.h | 5 +- tools/perf/util/tool.h | 7 +- tools/perf/util/util.c | 2 +- tools/perf/util/util.h | 2 + 30 files changed, 519 insertions(+), 230 deletions(-) create mode 100644 tools/perf/tests/wp.c
Test results:
The first ones are container (docker) 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.
The Clear Linux container is building with NO_CLANG=1, the problem preventing its use has been identified and the next builds will build in ClearLinux with both gcc and clang. This time around only gcc was used.
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 6.4.0) 6.4.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 arm-linux-androideabi-gcc (GCC) 4.9.x 20150123 (prerelease)
10 android-ndk:r15c-arm : Ok arm-linux-androideabi-gcc (GCC) 4.9.x 20150123 (prerelease)
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-28)
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+deb8u1) 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-7) 8.2.0
19 debian:experimental-x-arm64 : Ok aarch64-linux-gnu-gcc (Debian 8.2.0-4) 8.2.0
20 debian:experimental-x-mips : Ok mips-linux-gnu-gcc (Debian 8.1.0-12) 8.1.0
21 debian:experimental-x-mips64 : Ok mips64-linux-gnuabi64-gcc (Debian 8.1.0-12) 8.1.0
22 debian:experimental-x-mipsel : Ok mipsel-linux-gnu-gcc (Debian 8.1.0-12) 8.1.0
23 fedora:20 : Ok gcc (GCC) 4.8.3 20140911 (Red Hat 4.8.3-7)
24 fedora:21 : Ok gcc (GCC) 4.9.2 20150212 (Red Hat 4.9.2-6)
25 fedora:22 : Ok gcc (GCC) 5.3.1 20160406 (Red Hat 5.3.1-6)
26 fedora:23 : Ok gcc (GCC) 5.3.1 20160406 (Red Hat 5.3.1-6)
27 fedora:24 : Ok gcc (GCC) 6.3.1 20161221 (Red Hat 6.3.1-1)
28 fedora:24-x-ARC-uClibc : Ok arc-linux-gcc (ARCompact ISA Linux uClibc toolchain 2017.09-rc2) 7.1.1 20170710
29 fedora:25 : Ok gcc (GCC) 6.4.1 20170727 (Red Hat 6.4.1-1)
30 fedora:26 : Ok gcc (GCC) 7.3.1 20180130 (Red Hat 7.3.1-2)
31 fedora:27 : Ok gcc (GCC) 7.3.1 20180712 (Red Hat 7.3.1-6)
32 fedora:28 : Ok gcc (GCC) 8.1.1 20180712 (Red Hat 8.1.1-5)
33 fedora:rawhide : Ok gcc (GCC) 8.2.1 20180905 (Red Hat 8.2.1-3)
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:42.1 : Ok gcc (SUSE Linux) 4.8.5
39 opensuse:42.2 : Ok gcc (SUSE Linux) 4.8.5
40 opensuse:42.3 : Ok gcc (SUSE Linux) 4.8.5
41 opensuse:tumbleweed : Ok gcc (SUSE Linux) 7.3.1 20180323 [gcc-7-branch revision 258812]
42 oraclelinux:6 : Ok gcc (GCC) 4.4.7 20120313 (Red Hat 4.4.7-23.0.1)
43 oraclelinux:7 : Ok gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-28.0.1)
44 ubuntu:12.04.5 : Ok gcc (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3
45 ubuntu:14.04.4 : Ok gcc (Ubuntu 4.8.4-2ubuntu1~14.04.3) 4.8.4
46 ubuntu:14.04.4-x-linaro-arm64 : Ok aarch64-linux-gnu-gcc (Linaro GCC 5.5-2017.10) 5.5.0
47 ubuntu:16.04 : Ok gcc (Ubuntu 5.4.0-6ubuntu1~16.04.10) 5.4.0 20160609
48 ubuntu:16.04-x-arm : Ok arm-linux-gnueabihf-gcc (Ubuntu/Linaro 5.4.0-6ubuntu1~16.04.9) 5.4.0 20160609
49 ubuntu:16.04-x-arm64 : Ok aarch64-linux-gnu-gcc (Ubuntu/Linaro 5.4.0-6ubuntu1~16.04.9) 5.4.0 20160609
50 ubuntu:16.04-x-powerpc : Ok powerpc-linux-gnu-gcc (Ubuntu 5.4.0-6ubuntu1~16.04.9) 5.4.0 20160609
51 ubuntu:16.04-x-powerpc64 : Ok powerpc64-linux-gnu-gcc (Ubuntu/IBM 5.4.0-6ubuntu1~16.04.9) 5.4.0 20160609
52 ubuntu:16.04-x-powerpc64el : Ok powerpc64le-linux-gnu-gcc (Ubuntu/IBM 5.4.0-6ubuntu1~16.04.9) 5.4.0 20160609
53 ubuntu:16.04-x-s390 : Ok s390x-linux-gnu-gcc (Ubuntu 5.4.0-6ubuntu1~16.04.9) 5.4.0 20160609
54 ubuntu:16.10 : Ok gcc (Ubuntu 6.2.0-5ubuntu12) 6.2.0 20161005
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-16ubuntu3) 7.3.0
57 ubuntu:18.04-x-arm : Ok arm-linux-gnueabihf-gcc (Ubuntu/Linaro 7.3.0-16ubuntu3) 7.3.0
58 ubuntu:18.04-x-arm64 : Ok aarch64-linux-gnu-gcc (Ubuntu/Linaro 7.3.0-16ubuntu3) 7.3.0
59 ubuntu:18.04-x-m68k : Ok m68k-linux-gnu-gcc (Ubuntu 7.3.0-16ubuntu3) 7.3.0
60 ubuntu:18.04-x-powerpc : Ok powerpc-linux-gnu-gcc (Ubuntu 7.3.0-16ubuntu3) 7.3.0
61 ubuntu:18.04-x-powerpc64 : Ok powerpc64-linux-gnu-gcc (Ubuntu 7.3.0-16ubuntu3) 7.3.0
62 ubuntu:18.04-x-powerpc64el : Ok powerpc64le-linux-gnu-gcc (Ubuntu 7.3.0-16ubuntu3) 7.3.0
63 ubuntu:18.04-x-riscv64 : Ok riscv64-linux-gnu-gcc (Ubuntu 7.3.0-16ubuntu3) 7.3.0
64 ubuntu:18.04-x-s390 : Ok s390x-linux-gnu-gcc (Ubuntu 7.3.0-16ubuntu3) 7.3.0
65 ubuntu:18.04-x-sh4 : Ok sh4-linux-gnu-gcc (Ubuntu 7.3.0-16ubuntu3) 7.3.0
66 ubuntu:18.04-x-sparc64 : Ok sparc64-linux-gnu-gcc (Ubuntu 7.3.0-16ubuntu3) 7.3.0
67 ubuntu:18.10 : Ok gcc (Ubuntu 8.2.0-4ubuntu1) 8.2.0
#
# uname -a
Linux seventh 4.19.0-rc2-00176-gdb44bf4b4768 #1 SMP Thu Sep 6 14:38:21 -03 2018 x86_64 x86_64 x86_64 GNU/Linux
# git log --oneline -1
29715ae86e6c perf python: Use -Wno-redundant-decls to build with PYTHON=python3
# perf version --build-options
perf version 4.19.rc2.g29715a
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 : FAILED!
64: probe libc's inet_pton & backtrace it with ping : Ok
65: Check open filename arg using perf trace + vfs_getname: Ok
66: Use vfs_getname probe to get syscall args filenames : Ok
67: Add vfs_getname probe to get syscall args filenames : Ok # uname -a
Linux seventh 4.19.0-rc2-00176-gdb44bf4b4768 #1 SMP Thu Sep 6 14:38:21 -03 2018 x86_64 x86_64 x86_64 GNU/Linux
# git log --oneline -1
29715ae86e6c perf python: Use -Wno-redundant-decls to build with PYTHON=python3
# perf version --build-options
perf version 4.19.rc2.g29715a
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 : FAILED!
64: probe libc's inet_pton & backtrace it with ping : Ok
65: Check open filename arg using perf trace + vfs_getname: Ok
66: Use vfs_getname probe to get syscall args filenames : Ok
67: Add vfs_getname probe to get syscall args filenames : Ok [acme@jouet perf]$ time make -C tools/perf build-test
make: Entering directory '/home/acme/git/perf/tools/perf'
- tarpkg: ./tests/perf-targz-src-pkg .
make_clean_all_O: make clean all
make_no_auxtrace_O: make NO_AUXTRACE=1
make_no_libaudit_O: make NO_LIBAUDIT=1
make_static_O: make LDFLAGS=-static
make_no_newt_O: make NO_NEWT=1
make_doc_O: make doc
make_util_map_o_O: make util/map.o
make_no_libbionic_O: make NO_LIBBIONIC=1
make_no_backtrace_O: make NO_BACKTRACE=1
make_no_gtk2_O: make NO_GTK2=1
make_with_babeltrace_O: make LIBBABELTRACE=1
make_no_libperl_O: make NO_LIBPERL=1
make_no_libnuma_O: make NO_LIBNUMA=1
make_no_ui_O: make NO_NEWT=1 NO_SLANG=1 NO_GTK2=1
make_tags_O: make tags
make_debug_O: make DEBUG=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_libdw_dwarf_unwind_O: make NO_LIBDW_DWARF_UNWIND=1
make_no_libunwind_O: make NO_LIBUNWIND=1
make_no_libpython_O: make NO_LIBPYTHON=1
make_util_pmu_bison_o_O: make util/pmu-bison.o
make_install_prefix_slash_O: make install prefix=/tmp/krava/
make_pure_O: make
make_no_libbpf_O: make NO_LIBBPF=1
make_install_prefix_O: make install prefix=/tmp/krava
make_perf_o_O: make perf.o
make_no_demangle_O: make NO_DEMANGLE=1
make_help_O: make help
make_install_O: make install
make_with_clangllvm_O: make LIBCLANGLLVM=1
make_install_bin_O: make install-bin
make_no_scripts_O: make NO_LIBPYTHON=1 NO_LIBPERL=1
make_no_libelf_O: make NO_LIBELF=1
make_no_slang_O: make NO_SLANG=1
OK
make: Leaving directory '/home/acme/git/perf/tools/perf'
$
Arnaldo Carvalho de Melo
maintainerPATCH 1/13 perf: Suppress AUX/OVERWRITE records
From: Alexander Shishkin <[email protected]>
It has been pointed out to me many times that it is useful to be able to switch off AUX records to save the bandwidth for records that actually matter, for example, in AUX overwrite mode.
The usefulness of PERF_RECORD_AUX is in some of its flags, like the TRUNCATED flag that tells the decoder where exactly gaps in the trace are. The OVERWRITE flag, on the other hand will be set on every single record in overwrite mode. However, a PERF_RECORD_AUX[flags=OVERWRITE] is generated on every target task's sched_out, which over time adds up to a lot of useless information.
If any folks out there have userspace that depends on a constant stream of OVERWRITE records for a good reason, they'll have to let us know.
--- kernel/events/ring_buffer.c | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-)
kernel/events/ring_buffer.c +12 -2
@@ -459,10 +459,20 @@ void perf_aux_output_end(struct perf_output_handle *handle, unsigned long size)if (size || handle->aux_flags) {/* * Only send RECORD_AUX if we have something useful to communicate +* +* Note: the OVERWRITE records by themselves are not considered +* useful, as they don't communicate any *new* information, +* aside from the short-lived offset, that becomes history at +* the next event sched-in and therefore isn't useful. +* The userspace that needs to copy out AUX data in overwrite +* mode should know to use user_page::aux_head for the actual +* offset. So, from now on we don't output AUX records that +* have *only* OVERWRITE flag set. */ -perf_event_aux_event (handle->event, aux_head, size, - handle->aux_flags); +if (handle->aux_flags & ~(u64 )PERF_AUX_FLAG_OVERWRITE ) +perf_event_aux_event (handle->event, aux_head, size, + handle->aux_flags); } rb->user_page->aux_head = rb->aux_head;
Signature · 1 line
2.14.4
Arnaldo Carvalho de Melo
maintainerPATCH 2/13 perf test: Add watchpoint test
In reply to Arnaldo Carvalho de MeloFrom: Ravi Bangoria <[email protected]>
We don't have a 'perf test' entry available to test the watchpoint functionality.
Add a simple set of tests:
- Read only watchpoint
- Write only watchpoint
- Read / Write watchpoint
- Runtime watchpoint modification
Ex.: on powerpc:
$ sudo perf test 22 22: Watchpoint : 22.1: Read Only Watchpoint : Ok 22.2: Write Only Watchpoint : Ok 22.3: Read / Write Watchpoint : Ok 22.4: Modify Watchpoint : Ok
--- tools/perf/tests/Build | 1 + tools/perf/tests/builtin-test.c | 9 ++ tools/perf/tests/tests.h | 3 + tools/perf/tests/wp.c | 229 ++++++++++++++++++++++++++++++++++++++++ 4 files changed, 242 insertions(+) create mode 100644 tools/perf/tests/wp.c
tools/perf/tests/Build +1 -0
@@ -21,6 +21,7 @@ perf-y += python-use.o perf-y += bp_signal.o perf-y += bp_signal_overflow.o perf-y += bp_account.o +perf-y += wp.o perf-y += task-exit.o perf-y += sw-clock.o perf-y += mmap-thread-lookup.o
tools/perf/tests/builtin-test.c +9 -0
@@ -120,6 +120,15 @@ static struct test generic_tests[] = { .func = test__bp_accounting, .is_supported = test__bp_signal_is_supported, }, + { + .desc = "Watchpoint", + .func = test__wp, + .subtest = { + .skip_if_fail = false, + .get_nr = test__wp_subtest_get_nr, + .get_desc = test__wp_subtest_get_desc, + }, + }, { .desc = "Number of exit events of a simple workload", .func = test__task_exit,
tools/perf/tests/tests.h +3 -0
@@ -59,6 +59,9 @@ int test__python_use(struct test *test, int subtest);int test__bp_signal (struct test *test,int subtest);int test__bp_signal_overflow (struct test *test,int subtest);int test__bp_accounting (struct test *test,int subtest); +int test__wp (struct test *test,int subtest); +const char *test__wp_subtest_get_desc (int subtest); +int test__wp_subtest_get_nr (void );int test__task_exit (struct test *test,int subtest);int test__mem (struct test *test,int subtest);int test__sw_clock_freq (struct test *test,int subtest);
tools/perf/tests/wp.c new file +229 -0
229 lines not on this page · raw message
Signature · 1 line
2.14.4
Arnaldo Carvalho de Melo
maintainerPATCH 3/13 perf ordered_events: Add 'struct ordered_events_buffer' layer
In reply to Arnaldo Carvalho de MeloFrom: Jiri Olsa <[email protected]>
When ordering events, we use preallocated buffers to store separate events. Those buffers currently don't have their own struct, but since they are basically an array of 'struct ordered_event' objects, we use the first event to hold buffers data - list head, that holds all buffers together:
struct ordered_events {
...
struct ordered_event *buffer;
...
};
struct ordered_event {
u64 timestamp;
u64 file_offset;
union perf_event *event;
struct list_head list;
};This is quite convoluted and error prone as demonstrated by free-ing issue discovered and fixed by Stephane in here [1].
This patch adds the 'struct ordered_events_buffer' object, that holds the buffer data and frees it up properly.
[1] - https://marc.info/?l=linux-kernel&m=153376761329335&w=2
--- tools/perf/util/ordered-events.c | 83 +++++++++++++++++++++++++++++++++------- tools/perf/util/ordered-events.h | 37 ++++++++++-------- 2 files changed, 91 insertions(+), 29 deletions(-)
tools/perf/util/ordered-events.c +70 -13
@@ -80,14 +80,20 @@ static union perf_event *dup_event(struct ordered_events *oe,return oe->copy_on_queue ?__dup_event (oe, event) : event; } -static void free_dup_event (struct ordered_events *oe,union perf_event *event) +static void __free_dup_event (struct ordered_events *oe,union perf_event *event) { -if (event && oe->copy_on_queue) { +if (event) { oe->cur_alloc_size -= event->header.size;free (event); } } +static void free_dup_event (struct ordered_events *oe,union perf_event *event) +{ +if (oe->copy_on_queue) +__free_dup_event (oe, event); +} +#define MAX_SAMPLE_BUFFER (64 * 1024 / sizeof(struct ordered_event))static struct ordered_event *alloc_event (struct ordered_events *oe,union perf_event *event)
@@ -100,15 +106,43 @@ static struct ordered_event *alloc_event(struct ordered_events *oe,if (!new_event)return NULL ; +/* +* We maintain the following scheme of buffers for ordered +* event allocation: +* +* to_free list -> buffer1 (64K) +* buffer2 (64K) +* ... +* +* Each buffer keeps an array of ordered events objects: +* buffer -> event[0] +* event[1] +* ... +* +* Each allocated ordered event is linked to one of +* following lists: +* - time ordered list 'events' +* - list of currently removed events 'cache' +* +* Allocation of the ordered event uses the following order +* to get the memory: +* - use recently removed object from 'cache' list +* - use available object in current allocation buffer +* - allocate new buffer if the current buffer is full +* +* Removal of ordered event object moves it from events to +* the cache list. +*/ if (!list_empty (cache)) { new = list_entry(cache->next, struct ordered_event, list);list_del (&new->list); }else if (oe->buffer) { - new = oe->buffer + oe->buffer_idx; + new = &oe->buffer->event[oe->buffer_idx];if (++oe->buffer_idx ==MAX_SAMPLE_BUFFER ) oe->buffer =NULL ; }else if (oe->cur_alloc_size < oe->max_alloc_size) { -size_t size =MAX_SAMPLE_BUFFER *sizeof (*new); +size_t size =sizeof (*oe->buffer) + +MAX_SAMPLE_BUFFER *sizeof (*new); oe->buffer =malloc (size);if (!oe->buffer) {
@@ -122,11 +156,11 @@ static struct ordered_event *alloc_event(struct ordered_events *oe, oe->cur_alloc_size += size;list_add (&oe->buffer->list, &oe->to_free); -/* First entry is abused to maintain the to_free list. */ - oe->buffer_idx =2 ; - new = oe->buffer +1 ; + oe->buffer_idx =1 ; + new = &oe->buffer->event[0 ]; }else {pr ("allocation limit reached %" PRIu64"B\n" , oe->max_alloc_size); +return NULL ; } new->event = new_event;
@@ -300,15 +334,38 @@ void ordered_events__init(struct ordered_events *oe, ordered_events__deliver_t d oe->deliver = deliver; } +static void +ordered_events_buffer__free (struct ordered_events_buffer *buffer, +unsigned int max,struct ordered_events *oe) +{ +if (oe->copy_on_queue) { +unsigned int i; + +for (i =0 ; i < max; i++) +__free_dup_event (oe, buffer->event[i].event); + } + +free (buffer); +} +void ordered_events__free (struct ordered_events *oe) { -while (!list_empty (&oe->to_free)) { -struct ordered_event *event; +struct ordered_events_buffer *buffer, *tmp; - event = list_entry(oe->to_free.next, struct ordered_event, list); -list_del (&event->list); -free_dup_event (oe, event->event); -free (event); +if (list_empty (&oe->to_free)) +return ; + +/* +* Current buffer might not have all the events allocated +* yet, we need to free only allocated ones ... +*/ +list_del (&oe->buffer->list); +ordered_events_buffer__free (oe->buffer, oe->buffer_idx, oe); + +/* ... and continue with the rest */ +list_for_each_entry_safe (buffer, tmp, &oe->to_free, list) { +list_del (&buffer->list); +ordered_events_buffer__free (buffer,MAX_SAMPLE_BUFFER , oe); } }
tools/perf/util/ordered-events.h +21 -16
@@ -25,23 +25,28 @@ struct ordered_events;typedef int (*ordered_events__deliver_t )(struct ordered_events *oe,struct ordered_event *event); +struct ordered_events_buffer { +struct list_head list; +struct ordered_event event[0 ]; +}; +struct ordered_events { -u64 last_flush; -u64 next_flush; -u64 max_timestamp; -u64 max_alloc_size; -u64 cur_alloc_size; -struct list_head events; -struct list_head cache; -struct list_head to_free; -struct ordered_event *buffer; -struct ordered_event *last; -ordered_events__deliver_t deliver; -int buffer_idx; -unsigned int nr_events; -enum oe_flush last_flush_type; -u32 nr_unordered_events; -bool copy_on_queue; +u64 last_flush; +u64 next_flush; +u64 max_timestamp; +u64 max_alloc_size; +u64 cur_alloc_size; +struct list_head events; +struct list_head cache; +struct list_head to_free; +struct ordered_events_buffer *buffer; +struct ordered_event *last; +ordered_events__deliver_t deliver; +int buffer_idx; +unsigned int nr_events; +enum oe_flush last_flush_type; +u32 nr_unordered_events; +bool copy_on_queue; }; int ordered_events__queue(struct ordered_events *oe, union perf_event *event,
Signature · 1 line
2.14.4
Arnaldo Carvalho de Melo
maintainerPATCH 4/13 perf ordered_events: Prevent crossing max_alloc_size
In reply to Arnaldo Carvalho de MeloFrom: Jiri Olsa <[email protected]>
Stephane reported a possible issue in the ordered events code, which could lead to allocating more memory than guarded by max_alloc_size.
He also suggested the fix to properly check that the new size is below the max_alloc_size limit.
--- tools/perf/util/ordered-events.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-)
tools/perf/util/ordered-events.c +4 -4
@@ -101,6 +101,7 @@ static struct ordered_event *alloc_event(struct ordered_events *oe,struct list_head *cache = &oe->cache;struct ordered_event *new =NULL ;union perf_event *new_event; +size_t size; new_event =dup_event (oe, event);if (!new_event)
@@ -133,6 +134,8 @@ static struct ordered_event *alloc_event(struct ordered_events *oe,* Removal of ordered event object moves it from events to * the cache list. */ + size =sizeof (*oe->buffer) +MAX_SAMPLE_BUFFER *sizeof (*new); +if (!list_empty (cache)) { new = list_entry(cache->next, struct ordered_event, list);list_del (&new->list);
@@ -140,10 +143,7 @@ static struct ordered_event *alloc_event(struct ordered_events *oe, new = &oe->buffer->event[oe->buffer_idx];if (++oe->buffer_idx ==MAX_SAMPLE_BUFFER ) oe->buffer =NULL ; - }else if (oe->cur_alloc_size < oe->max_alloc_size) { -size_t size =sizeof (*oe->buffer) + -MAX_SAMPLE_BUFFER *sizeof (*new); - + }else if ((oe->cur_alloc_size + size) < oe->max_alloc_size) { oe->buffer =malloc (size);if (!oe->buffer) {free_dup_event (oe, new_event);
Signature · 1 line
2.14.4
Arnaldo Carvalho de Melo
maintainerPATCH 5/13 tools include: Adopt PTR_ERR_OR_ZERO from the kernel err.h header
In reply to Arnaldo Carvalho de MeloFrom: Ding Xiang <[email protected]>
Add PTR_ERR_OR_ZERO, so that tools can use it, just like the kernel.
--- tools/include/linux/err.h | 7 +++++++ 1 file changed, 7 insertions(+)
tools/include/linux/err.h +7 -0
@@ -52,4 +52,11 @@ static inline bool __must_check IS_ERR_OR_NULL(__force const void *ptr) return unlikely(!ptr) || IS_ERR_VALUE((unsigned long)ptr); } +static inline int __must_check PTR_ERR_OR_ZERO (__force const void *ptr) +{ +if (IS_ERR (ptr)) +return PTR_ERR (ptr); +else +return 0 ; +}#endif /* _LINUX_ERR_H */
Signature · 1 line
2.14.4
Arnaldo Carvalho de Melo
maintainerPATCH 6/13 perf bpf-loader: use PTR_ERR_OR_ZERO inetead of return code
In reply to Arnaldo Carvalho de MeloFrom: Ding Xiang <[email protected]>
Use PTR_ERR_OR_ZERO() in bpf__setup_stdout() return code instead of open coded equivalent.
--- tools/perf/util/bpf-loader.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
tools/perf/util/bpf-loader.c +1 -1
@@ -1615,7 +1615,7 @@ struct perf_evsel *bpf__setup_output_event(struct perf_evlist *evlist, const chaint bpf__setup_stdout (struct perf_evlist *evlist) {struct perf_evsel *evsel =bpf__setup_output_event (evlist,"__bpf_stdout__" ); -return IS_ERR (evsel) ?PTR_ERR (evsel) :0 ; +return PTR_ERR_OR_ZERO (evsel); }#define ERRNO_OFFSET (e) ((e) - __BPF_LOADER_ERRNO__START)
Signature · 1 line
2.14.4
Arnaldo Carvalho de Melo
maintainerPATCH 7/13 perf tools: Remove perf_tool from event_op2
In reply to Arnaldo Carvalho de MeloFrom: Jiri Olsa <[email protected]>
Now that we keep a perf_tool pointer inside perf_session, there's no need to have a perf_tool argument in the event_op2 callback. Remove it.
--- tools/perf/builtin-annotate.c | 7 ++--- tools/perf/builtin-inject.c | 26 +++++++---------- tools/perf/builtin-report.c | 9 +++--- tools/perf/builtin-script.c | 38 ++++++++++++------------ tools/perf/builtin-stat.c | 23 +++++++-------- tools/perf/util/auxtrace.c | 10 +++---- tools/perf/util/auxtrace.h | 10 +++---- tools/perf/util/header.c | 16 +++++------ tools/perf/util/header.h | 15 ++++------ tools/perf/util/session.c | 67 ++++++++++++++++++------------------------- tools/perf/util/session.h | 5 ++-- tools/perf/util/stat.c | 5 ++-- tools/perf/util/stat.h | 5 ++-- tools/perf/util/tool.h | 3 +- 14 files changed, 103 insertions(+), 136 deletions(-)
tools/perf/builtin-annotate.c +3 -4
@@ -283,12 +283,11 @@ static int process_sample_event(struct perf_tool *tool,return ret; } -static int process_feature_event (struct perf_tool *tool, -union perf_event *event, -struct perf_session *session) +static int process_feature_event (struct perf_session *session, +union perf_event *event) {if (event->feat.feat_id <HEADER_LAST_FEATURE ) -return perf_event__process_feature (tool, event, session); +return perf_event__process_feature (session, event);return 0 ; }
tools/perf/builtin-inject.c +11 -15
@@ -86,12 +86,10 @@ static int perf_event__drop_oe(struct perf_tool *tool __maybe_unused, }#endif -static int perf_event__repipe_op2_synth (struct perf_tool *tool, -union perf_event *event, -struct perf_session *session -__maybe_unused ) +static int perf_event__repipe_op2_synth (struct perf_session *session, +union perf_event *event) { -return perf_event__repipe_synth (tool, event); +return perf_event__repipe_synth (session->tool, event); } static int perf_event__repipe_attr(struct perf_tool *tool,
@@ -362,26 +360,24 @@ static int perf_event__repipe_exit(struct perf_tool *tool,return err; } -static int perf_event__repipe_tracing_data (struct perf_tool *tool, -union perf_event *event, -struct perf_session *session) +static int perf_event__repipe_tracing_data (struct perf_session *session, +union perf_event *event) {int err; -perf_event__repipe_synth (tool, event); - err =perf_event__process_tracing_data (tool, event, session); +perf_event__repipe_synth (session->tool, event); + err =perf_event__process_tracing_data (session, event);return err; } -static int perf_event__repipe_id_index (struct perf_tool *tool, -union perf_event *event, -struct perf_session *session) +static int perf_event__repipe_id_index (struct perf_session *session, +union perf_event *event) {int err; -perf_event__repipe_synth (tool, event); - err =perf_event__process_id_index (tool, event, session); +perf_event__repipe_synth (session->tool, event); + err =perf_event__process_id_index (session, event);return err; }
tools/perf/builtin-report.c +4 -5
@@ -201,14 +201,13 @@ static void setup_forced_leader(struct report *report,perf_evlist__force_leader (evlist); } -static int process_feature_event (struct perf_tool *tool, -union perf_event *event, -struct perf_session *session__maybe_unused ) +static int process_feature_event (struct perf_session *session, +union perf_event *event) { - struct report *rep = container_of(tool, struct report, tool); + struct report *rep = container_of(session->tool, struct report, tool);if (event->feat.feat_id <HEADER_LAST_FEATURE ) -return perf_event__process_feature (tool, event, session); +return perf_event__process_feature (session, event);if (event->feat.feat_id !=HEADER_LAST_FEATURE ) { pr_err("failed: wrong feature ID: %" PRIu64 "\n",
tools/perf/builtin-script.c +18 -20
@@ -2965,9 +2965,8 @@ static void script__setup_sample_type(struct perf_script *script) } } -static int process_stat_round_event (struct perf_tool *tool__maybe_unused , -union perf_event *event, -struct perf_session *session) +static int process_stat_round_event (struct perf_session *session, +union perf_event *event) {struct stat_round_event *round = &event->stat_round;struct perf_evsel *counter;
@@ -2981,9 +2980,8 @@ static int process_stat_round_event(struct perf_tool *tool __maybe_unused,return 0 ; } -static int process_stat_config_event (struct perf_tool *tool__maybe_unused , -union perf_event *event, -struct perf_session *session__maybe_unused ) +static int process_stat_config_event (struct perf_session *session__maybe_unused , +union perf_event *event) {perf_event__read_stat_config (&stat_config, &event->stat_config);return 0 ;
@@ -3009,10 +3007,10 @@ static int set_maps(struct perf_script *script) }static -int process_thread_map_event (struct perf_tool *tool, -union perf_event *event, -struct perf_session *session__maybe_unused ) +int process_thread_map_event (struct perf_session *session, +union perf_event *event) { +struct perf_tool *tool = session->tool; struct perf_script *script = container_of(tool, struct perf_script, tool);if (script->threads) {
@@ -3028,10 +3026,10 @@ int process_thread_map_event(struct perf_tool *tool, }static -int process_cpu_map_event (struct perf_tool *tool__maybe_unused , -union perf_event *event, -struct perf_session *session__maybe_unused ) +int process_cpu_map_event (struct perf_session *session, +union perf_event *event) { +struct perf_tool *tool = session->tool; struct perf_script *script = container_of(tool, struct perf_script, tool);if (script->cpus) {
@@ -3046,21 +3044,21 @@ int process_cpu_map_event(struct perf_tool *tool __maybe_unused,return set_maps (script); } -static int process_feature_event (struct perf_tool *tool, -union perf_event *event, -struct perf_session *session) +static int process_feature_event (struct perf_session *session, +union perf_event *event) {if (event->feat.feat_id <HEADER_LAST_FEATURE ) -return perf_event__process_feature (tool, event, session); +return perf_event__process_feature (session, event);return 0 ; }#ifdef HAVE_AUXTRACE_SUPPORT -static int perf_script__process_auxtrace_info (struct perf_tool *tool, -union perf_event *event, -struct perf_session *session) +static int perf_script__process_auxtrace_info (struct perf_session *session, +union perf_event *event) { -int ret =perf_event__process_auxtrace_info (tool, event, session); +struct perf_tool *tool = session->tool; + +int ret =perf_event__process_auxtrace_info (session, event);if (ret ==0 ) { struct perf_script *script = container_of(tool, struct perf_script, tool);
tools/perf/builtin-stat.c +11 -12
@@ -1354,9 +1354,8 @@ static int __cmd_record(int argc, const char **argv)return argc; } -static int process_stat_round_event (struct perf_tool *tool__maybe_unused , -union perf_event *event, -struct perf_session *session) +static int process_stat_round_event (struct perf_session *session, +union perf_event *event) {struct stat_round_event *stat_round = &event->stat_round;struct perf_evsel *counter;
@@ -1381,10 +1380,10 @@ static int process_stat_round_event(struct perf_tool *tool __maybe_unused, }static -int process_stat_config_event (struct perf_tool *tool, -union perf_event *event, -struct perf_session *session__maybe_unused ) +int process_stat_config_event (struct perf_session *session, +union perf_event *event) { +struct perf_tool *tool = session->tool; struct perf_stat *st = container_of(tool, struct perf_stat, tool);perf_event__read_stat_config (&stat_config, &event->stat_config);
@@ -1424,10 +1423,10 @@ static int set_maps(struct perf_stat *st) }static -int process_thread_map_event (struct perf_tool *tool, -union perf_event *event, -struct perf_session *session__maybe_unused ) +int process_thread_map_event (struct perf_session *session, +union perf_event *event) { +struct perf_tool *tool = session->tool; struct perf_stat *st = container_of(tool, struct perf_stat, tool);if (st->threads) {
@@ -1443,10 +1442,10 @@ int process_thread_map_event(struct perf_tool *tool, }static -int process_cpu_map_event (struct perf_tool *tool, -union perf_event *event, -struct perf_session *session__maybe_unused ) +int process_cpu_map_event (struct perf_session *session, +union perf_event *event) { +struct perf_tool *tool = session->tool; struct perf_stat *st = container_of(tool, struct perf_stat, tool);struct cpu_map *cpus;
tools/perf/util/auxtrace.c +4 -6
@@ -906,9 +906,8 @@ int perf_event__synthesize_auxtrace_info(struct auxtrace_record *itr,return err; } -int perf_event__process_auxtrace_info (struct perf_tool *tool__maybe_unused , -union perf_event *event, -struct perf_session *session) +int perf_event__process_auxtrace_info (struct perf_session *session, +union perf_event *event) {enum auxtrace_type type = event->auxtrace_info.type;
@@ -1185,9 +1184,8 @@ void events_stats__auxtrace_error_warn(const struct events_stats *stats) } } -int perf_event__process_auxtrace_error (struct perf_tool *tool__maybe_unused , -union perf_event *event, -struct perf_session *session) +int perf_event__process_auxtrace_error (struct perf_session *session, +union perf_event *event) {if (auxtrace__dont_decode (session))return 0 ;
tools/perf/util/auxtrace.h +4 -6
@@ -517,15 +517,13 @@ int perf_event__synthesize_auxtrace_info(struct auxtrace_record *itr,struct perf_tool *tool, struct perf_session *session, perf_event__handler_t process); -int perf_event__process_auxtrace_info (struct perf_tool *tool, -union perf_event *event, -struct perf_session *session); +int perf_event__process_auxtrace_info (struct perf_session *session, +union perf_event *event);s64 perf_event__process_auxtrace (struct perf_tool *tool,union perf_event *event,struct perf_session *session); -int perf_event__process_auxtrace_error (struct perf_tool *tool, -union perf_event *event, -struct perf_session *session); +int perf_event__process_auxtrace_error (struct perf_session *session, +union perf_event *event);int itrace_parse_synth_opts (const struct option *opt,const char *str,int unset);void itrace_synth_opts__set_default (struct itrace_synth_opts *synth_opts);
tools/perf/util/header.c +7 -9
@@ -3448,10 +3448,10 @@ int perf_event__synthesize_features(struct perf_tool *tool,return ret; } -int perf_event__process_feature (struct perf_tool *tool, -union perf_event *event, -struct perf_session *session__maybe_unused ) +int perf_event__process_feature (struct perf_session *session, +union perf_event *event) { +struct perf_tool *tool = session->tool;struct feat_fd ff = { .fd =0 };struct feature_event *fe = (struct feature_event *)event;int type = fe->header.type;
@@ -3856,9 +3856,8 @@ int perf_event__synthesize_tracing_data(struct perf_tool *tool, int fd,return aligned_size; } -int perf_event__process_tracing_data (struct perf_tool *tool__maybe_unused , -union perf_event *event, -struct perf_session *session) +int perf_event__process_tracing_data (struct perf_session *session, +union perf_event *event) {ssize_t size_read, padding, size = event->tracing_data.size;int fd =perf_data__fd (session->data);
@@ -3924,9 +3923,8 @@ int perf_event__synthesize_build_id(struct perf_tool *tool,return err; } -int perf_event__process_build_id (struct perf_tool *tool__maybe_unused , -union perf_event *event, -struct perf_session *session) +int perf_event__process_build_id (struct perf_session *session, +union perf_event *event) { __event_process_build_id(&event->build_id, event->build_id.filename,
tools/perf/util/header.h +6 -9
@@ -116,9 +116,8 @@ int perf_event__synthesize_extra_attr(struct perf_tool *tool,perf_event__handler_t process, bool is_pipe); -int perf_event__process_feature (struct perf_tool *tool, -union perf_event *event, -struct perf_session *session); +int perf_event__process_feature (struct perf_session *session, +union perf_event *event); int perf_event__synthesize_attr(struct perf_tool *tool, struct perf_event_attr *attr, u32 ids, u64 *id,
@@ -148,17 +147,15 @@ size_t perf_event__fprintf_event_update(union perf_event *event, FILE *fp);int perf_event__synthesize_tracing_data (struct perf_tool *tool,int fd,struct perf_evlist *evlist,perf_event__handler_t process); -int perf_event__process_tracing_data (struct perf_tool *tool, -union perf_event *event, -struct perf_session *session); +int perf_event__process_tracing_data (struct perf_session *session, +union perf_event *event);int perf_event__synthesize_build_id (struct perf_tool *tool,struct dso *pos,u16 misc,perf_event__handler_t process,struct machine *machine); -int perf_event__process_build_id (struct perf_tool *tool, -union perf_event *event, -struct perf_session *session); +int perf_event__process_build_id (struct perf_session *session, +union perf_event *event);bool is_perf_magic (u64 magic);#define NAME_ALIGN 64
tools/perf/util/session.c +28 -39
142 lines not on this page · raw message
tools/perf/util/session.h +2 -3
@@ -120,9 +120,8 @@ int perf_session__deliver_synth_event(struct perf_session *session,union perf_event *event, struct perf_sample *sample); -int perf_event__process_id_index (struct perf_tool *tool, -union perf_event *event, -struct perf_session *session); +int perf_event__process_id_index (struct perf_session *session, +union perf_event *event); int perf_event__synthesize_id_index(struct perf_tool *tool, perf_event__handler_t process,
tools/perf/util/stat.c +2 -3
@@ -374,9 +374,8 @@ int perf_stat_process_counter(struct perf_stat_config *config,return 0 ; } -int perf_event__process_stat_event (struct perf_tool *tool__maybe_unused , -union perf_event *event, -struct perf_session *session) +int perf_event__process_stat_event (struct perf_session *session, +union perf_event *event) {struct perf_counts_values count;struct stat_event *st = &event->stat;
tools/perf/util/stat.h +2 -3
@@ -199,9 +199,8 @@ int perf_stat_process_counter(struct perf_stat_config *config,struct perf_tool ;union perf_event ;struct perf_session ; -int perf_event__process_stat_event (struct perf_tool *tool, -union perf_event *event, -struct perf_session *session); +int perf_event__process_stat_event (struct perf_session *session, +union perf_event *event);size_t perf_event__fprintf_stat (union perf_event *event,FILE *fp);size_t perf_event__fprintf_stat_round (union perf_event *event,FILE *fp);
tools/perf/util/tool.h +1 -2
@@ -26,8 +26,7 @@ typedef int (*event_attr_op)(struct perf_tool *tool,union perf_event *event, struct perf_evlist **pevlist); -typedef int (*event_op2 )(struct perf_tool *tool,union perf_event *event, -struct perf_session *session); +typedef int (*event_op2 )(struct perf_session *session,union perf_event *event);typedef int (*event_oe )(struct perf_tool *tool,union perf_event *event,struct ordered_events *oe);
Signature · 1 line
2.14.4
Arnaldo Carvalho de Melo
maintainerPATCH 8/13 perf tools: Remove perf_tool from event_op3
In reply to Arnaldo Carvalho de MeloFrom: Jiri Olsa <[email protected]>
Now that we keep a perf_tool pointer inside perf_session, there's no need to have a perf_tool argument in the event_op3 callback. Remove it.
--- tools/perf/builtin-inject.c | 11 +++++------ tools/perf/util/auxtrace.c | 7 +++---- tools/perf/util/auxtrace.h | 5 ++--- tools/perf/util/session.c | 8 +++----- tools/perf/util/tool.h | 4 +--- 5 files changed, 14 insertions(+), 21 deletions(-)
tools/perf/builtin-inject.c +5 -6
@@ -131,10 +131,10 @@ static int copy_bytes(struct perf_inject *inject, int fd, off_t size)return 0 ; } -static s64 perf_event__repipe_auxtrace (struct perf_tool *tool, -union perf_event *event, -struct perf_session *session) +static s64 perf_event__repipe_auxtrace (struct perf_session *session, +union perf_event *event) { +struct perf_tool *tool = session->tool; struct perf_inject *inject = container_of(tool, struct perf_inject, tool);int ret;
@@ -172,9 +172,8 @@ static s64 perf_event__repipe_auxtrace(struct perf_tool *tool,#else static s64 -perf_event__repipe_auxtrace (struct perf_tool *tool__maybe_unused , -union perf_event *event__maybe_unused , -struct perf_session *session__maybe_unused ) +perf_event__repipe_auxtrace (struct perf_session *session__maybe_unused , +union perf_event *event__maybe_unused ) {pr_err ("AUX area tracing not supported\n" );return -EINVAL ;
tools/perf/util/auxtrace.c +3 -4
@@ -931,9 +931,8 @@ int perf_event__process_auxtrace_info(struct perf_session *session, } } -s64 perf_event__process_auxtrace (struct perf_tool *tool, -union perf_event *event, -struct perf_session *session) +s64 perf_event__process_auxtrace (struct perf_session *session, +union perf_event *event) {s64 err;
@@ -949,7 +948,7 @@ s64 perf_event__process_auxtrace(struct perf_tool *tool,if (!session->auxtrace || event->header.type !=PERF_RECORD_AUXTRACE )return -EINVAL ; - err = session->auxtrace->process_auxtrace_event (session, event, tool); + err = session->auxtrace->process_auxtrace_event (session, event, session->tool);if (err <0 )return err;
tools/perf/util/auxtrace.h +2 -3
@@ -519,9 +519,8 @@ int perf_event__synthesize_auxtrace_info(struct auxtrace_record *itr, perf_event__handler_t process);int perf_event__process_auxtrace_info (struct perf_session *session,union perf_event *event); -s64 perf_event__process_auxtrace (struct perf_tool *tool, -union perf_event *event, -struct perf_session *session); +s64 perf_event__process_auxtrace (struct perf_session *session, +union perf_event *event);int perf_event__process_auxtrace_error (struct perf_session *session,union perf_event *event); int itrace_parse_synth_opts(const struct option *opt, const char *str,
tools/perf/util/session.c +3 -5
@@ -275,10 +275,8 @@ static int skipn(int fd, off_t n)return 0 ; } -static s64 process_event_auxtrace_stub (struct perf_tool *tool__maybe_unused , -union perf_event *event, -struct perf_session *session -__maybe_unused ) +static s64 process_event_auxtrace_stub (struct perf_session *session__maybe_unused , +union perf_event *event) {dump_printf (": unhandled!\n" );if (perf_data__is_pipe (session->data))
@@ -1376,7 +1374,7 @@ static s64 perf_session__process_user_event(struct perf_session *session,case PERF_RECORD_AUXTRACE :/* setup for reading amidst mmap */ lseek (fd, file_offset + event->header.size,SEEK_SET ); -return tool->auxtrace (tool, event, session); +return tool->auxtrace (session, event);case PERF_RECORD_AUXTRACE_ERROR :perf_session__auxtrace_error_inc (session, event);return tool->auxtrace_error (session, event);
tools/perf/util/tool.h +1 -3
@@ -27,13 +27,11 @@ typedef int (*event_attr_op)(struct perf_tool *tool, struct perf_evlist **pevlist);typedef int (*event_op2 )(struct perf_session *session,union perf_event *event); +typedef s64 (*event_op3 )(struct perf_session *session,union perf_event *event);typedef int (*event_oe )(struct perf_tool *tool,union perf_event *event,struct ordered_events *oe); -typedef s64 (*event_op3 )(struct perf_tool *tool,union perf_event *event, -struct perf_session *session); -enum show_feature_header {SHOW_FEAT_NO_HEADER =0 ,SHOW_FEAT_HEADER ,
Signature · 1 line
2.14.4
Arnaldo Carvalho de Melo
maintainerPATCH 9/13 perf auxtrace: Pass struct perf_mmap into mmap__read* functions
In reply to Arnaldo Carvalho de MeloFrom: Jiri Olsa <[email protected]>
The perf_mmap struct will hold a file pointer to write the mmap's contents, so we need to propagate it down the stack to record__write callers instead of its member the auxtrace_mmap struct.
--- tools/perf/builtin-record.c | 27 +++++++++++++-------------- tools/perf/util/auxtrace.c | 11 ++++++----- tools/perf/util/auxtrace.h | 5 +++-- 3 files changed, 22 insertions(+), 21 deletions(-)
tools/perf/builtin-record.c +13 -14
@@ -207,11 +207,11 @@ static int record__process_auxtrace(struct perf_tool *tool, }static int record__auxtrace_mmap_read (struct record *rec, -struct auxtrace_mmap *mm) +struct perf_mmap *map) {int ret; - ret =auxtrace_mmap__read (mm, rec->itr, &rec->tool, + ret =auxtrace_mmap__read (map, rec->itr, &rec->tool, record__process_auxtrace);if (ret <0 )return ret;
@@ -223,11 +223,11 @@ static int record__auxtrace_mmap_read(struct record *rec, }static int record__auxtrace_mmap_read_snapshot (struct record *rec, -struct auxtrace_mmap *mm) +struct perf_mmap *map) {int ret; - ret =auxtrace_mmap__read_snapshot (mm, rec->itr, &rec->tool, + ret =auxtrace_mmap__read_snapshot (map, rec->itr, &rec->tool, record__process_auxtrace, rec->opts.auxtrace_snapshot_size);if (ret <0 )
@@ -245,13 +245,12 @@ static int record__auxtrace_read_snapshot_all(struct record *rec)int rc =0 ;for (i =0 ; i < rec->evlist->nr_mmaps; i++) { -struct auxtrace_mmap *mm = - &rec->evlist->mmap[i].auxtrace_mmap; +struct perf_mmap *map = &rec->evlist->mmap[i]; -if (!mm->base) +if (!map->auxtrace_mmap.base)continue ; -if (record__auxtrace_mmap_read_snapshot (rec, mm) !=0 ) { +if (record__auxtrace_mmap_read_snapshot (rec, map) !=0 ) { rc =-1 ; goto out; }
@@ -295,7 +294,7 @@ static int record__auxtrace_init(struct record *rec)static inline int record__auxtrace_mmap_read (struct record *rec__maybe_unused , -struct auxtrace_mmap *mm__maybe_unused ) +struct perf_mmap *map__maybe_unused ) {return 0 ; }
@@ -529,17 +528,17 @@ static int record__mmap_read_evlist(struct record *rec, struct perf_evlist *evlireturn 0 ;for (i =0 ; i < evlist->nr_mmaps; i++) { -struct auxtrace_mmap *mm = &maps[i].auxtrace_mmap; +struct perf_mmap *map = &maps[i]; -if (maps[i].base) { -if (perf_mmap__push (&maps[i], rec, record__pushfn) !=0 ) { +if (map->base) { +if (perf_mmap__push (map, rec, record__pushfn) !=0 ) { rc =-1 ; goto out; } } -if (mm->base && !rec->opts.auxtrace_snapshot_mode && -record__auxtrace_mmap_read (rec, mm) !=0 ) { +if (map->auxtrace_mmap.base && !rec->opts.auxtrace_snapshot_mode && +record__auxtrace_mmap_read (rec, map) !=0 ) { rc =-1 ; goto out; }
tools/perf/util/auxtrace.c +6 -5
@@ -1193,11 +1193,12 @@ int perf_event__process_auxtrace_error(struct perf_session *session,return 0 ; } -static int __auxtrace_mmap__read (struct auxtrace_mmap *mm, +static int __auxtrace_mmap__read (struct perf_mmap *map,struct auxtrace_record *itr,struct perf_tool *tool,process_auxtrace_t fn,bool snapshot,size_t snapshot_size) { +struct auxtrace_mmap *mm = &map->auxtrace_mmap;u64 head, old = mm->prev, offset, ref;unsigned char *data = mm->base;size_t size, head_off, old_off, len1, len2, padding;
@@ -1303,18 +1304,18 @@ static int __auxtrace_mmap__read(struct auxtrace_mmap *mm,return 1 ; } -int auxtrace_mmap__read (struct auxtrace_mmap *mm,struct auxtrace_record *itr, +int auxtrace_mmap__read (struct perf_mmap *map,struct auxtrace_record *itr,struct perf_tool *tool,process_auxtrace_t fn) { -return __auxtrace_mmap__read (mm, itr, tool, fn, false,0 ); +return __auxtrace_mmap__read (map, itr, tool, fn, false,0 ); } -int auxtrace_mmap__read_snapshot (struct auxtrace_mmap *mm, +int auxtrace_mmap__read_snapshot (struct perf_mmap *map,struct auxtrace_record *itr,struct perf_tool *tool,process_auxtrace_t fn,size_t snapshot_size) { -return __auxtrace_mmap__read (mm, itr, tool, fn, true, snapshot_size); +return __auxtrace_mmap__read (map, itr, tool, fn, true, snapshot_size); }/**
tools/perf/util/auxtrace.h +3 -2
@@ -33,6 +33,7 @@ union perf_event;struct perf_session ;struct perf_evlist ;struct perf_tool ; +struct perf_mmap ;struct option ;struct record_opts ;struct auxtrace_info_event ;
@@ -437,10 +438,10 @@ typedef int (*process_auxtrace_t)(struct perf_tool *tool, union perf_event *event, void *data1, size_t len1, void *data2, size_t len2); -int auxtrace_mmap__read (struct auxtrace_mmap *mm,struct auxtrace_record *itr, +int auxtrace_mmap__read (struct perf_mmap *map,struct auxtrace_record *itr,struct perf_tool *tool,process_auxtrace_t fn); -int auxtrace_mmap__read_snapshot (struct auxtrace_mmap *mm, +int auxtrace_mmap__read_snapshot (struct perf_mmap *map,struct auxtrace_record *itr,struct perf_tool *tool,process_auxtrace_t fn,size_t snapshot_size);
Signature · 1 line
2.14.4
Arnaldo Carvalho de Melo
maintainerPATCH 10/13 perf tools: Add 'struct perf_mmap' arg to record__write()
In reply to Arnaldo Carvalho de MeloFrom: Jiri Olsa <[email protected]>
The struct perf_mmap map argument will hold the file pointer to write the data to.
--- tools/perf/builtin-record.c | 24 ++++++++++++++---------- tools/perf/util/auxtrace.c | 2 +- tools/perf/util/auxtrace.h | 1 + tools/perf/util/mmap.c | 6 +++--- tools/perf/util/mmap.h | 2 +- 5 files changed, 20 insertions(+), 15 deletions(-)
tools/perf/builtin-record.c +14 -10
@@ -106,9 +106,12 @@ static bool switch_output_time(struct record *rec)trigger_is_ready (&switch_output_trigger); } -static int record__write (struct record *rec,void *bf,size_t size) +static int record__write (struct record *rec,struct perf_mmap *map__maybe_unused , +void *bf,size_t size) { -if (perf_data__write (rec->session->data, bf, size) <0 ) { +struct perf_data_file *file = &rec->session->data->file; + +if (perf_data_file__write (file, bf, size) <0 ) {pr_err ("failed to write perf data, error: %m\n" );return -1 ; }
@@ -127,15 +130,15 @@ static int process_synthesized_event(struct perf_tool *tool, struct machine *machine __maybe_unused) { struct record *rec = container_of(tool, struct record, tool); -return record__write (rec, event, event->header.size); +return record__write (rec,NULL , event, event->header.size); } -static int record__pushfn (void *to,void *bf,size_t size) +static int record__pushfn (struct perf_mmap *map,void *to,void *bf,size_t size) {struct record *rec = to; rec->samples++; -return record__write (rec, bf, size); +return record__write (rec, map, bf, size); }static volatile int done;
@@ -170,6 +173,7 @@ static void record__sig_exit(void)#ifdef HAVE_AUXTRACE_SUPPORT static int record__process_auxtrace (struct perf_tool *tool, +struct perf_mmap *map,union perf_event *event,void *data1,size_t len1,void *data2,size_t len2) {
@@ -197,11 +201,11 @@ static int record__process_auxtrace(struct perf_tool *tool,if (padding) padding =8 - padding; -record__write (rec, event, event->header.size); -record__write (rec, data1, len1); +record__write (rec, map, event, event->header.size); +record__write (rec, map, data1, len1);if (len2) -record__write (rec, data2, len2); -record__write (rec, &pad, padding); +record__write (rec, map, data2, len2); +record__write (rec, map, &pad, padding);return 0 ; }
@@ -549,7 +553,7 @@ static int record__mmap_read_evlist(struct record *rec, struct perf_evlist *evli* at least one event. */ if (bytes_written != rec->bytes_written) - rc =record__write (rec, &finished_round_event,sizeof (finished_round_event)); + rc =record__write (rec,NULL , &finished_round_event,sizeof (finished_round_event));if (overwrite)perf_evlist__toggle_bkw_mmap (evlist,BKW_MMAP_EMPTY );
tools/perf/util/auxtrace.c +1 -1
@@ -1285,7 +1285,7 @@ static int __auxtrace_mmap__read(struct perf_mmap *map, ev.auxtrace.tid = mm->tid; ev.auxtrace.cpu = mm->cpu; -if (fn (tool, &ev, data1, len1, data2, len2)) +if (fn (tool, map, &ev, data1, len1, data2, len2))return -1 ; mm->prev = head;
tools/perf/util/auxtrace.h +1 -0
@@ -435,6 +435,7 @@ void auxtrace_mmap_params__set_idx(struct auxtrace_mmap_params *mp, bool per_cpu);typedef int (*process_auxtrace_t )(struct perf_tool *tool, +struct perf_mmap *map,union perf_event *event,void *data1,size_t len1,void *data2,size_t len2);
tools/perf/util/mmap.c +3 -3
@@ -281,7 +281,7 @@ int perf_mmap__read_init(struct perf_mmap *map) }int perf_mmap__push (struct perf_mmap *md,void *to, -int push (void *to,void *buf,size_t size)) +int push (struct perf_mmap *map,void *to,void *buf,size_t size)) {u64 head =perf_mmap__read_head (md);unsigned char *data = md->base + page_size;
@@ -300,7 +300,7 @@ int perf_mmap__push(struct perf_mmap *md, void *to, size = md->mask +1 - (md->start & md->mask); md->start += size; -if (push (to, buf, size) <0 ) { +if (push (md, to, buf, size) <0 ) { rc =-1 ; goto out; }
@@ -310,7 +310,7 @@ int perf_mmap__push(struct perf_mmap *md, void *to, size = md->end - md->start; md->start += size; -if (push (to, buf, size) <0 ) { +if (push (md, to, buf, size) <0 ) { rc =-1 ; goto out; }
tools/perf/util/mmap.h +1 -1
@@ -93,7 +93,7 @@ union perf_event *perf_mmap__read_forward(struct perf_mmap *map);union perf_event *perf_mmap__read_event (struct perf_mmap *map);int perf_mmap__push (struct perf_mmap *md,void *to, -int push (void *to,void *buf,size_t size)); +int push (struct perf_mmap *map,void *to,void *buf,size_t size));size_t perf_mmap__mmap_len (struct perf_mmap *map);
Signature · 1 line
2.14.4
Arnaldo Carvalho de Melo
maintainerPATCH 11/13 perf util: Make copyfile_offset() global
In reply to Arnaldo Carvalho de MeloFrom: Jiri Olsa <[email protected]>
It will be used outside of util object in following patches.
Committer note:
We need to have the header with the definition for loff_t in util.h since we now use it in the copyfile_offset() signature.
Also move that prototype closer to the other copyfile_ prefixed functions.
--- tools/perf/util/util.c | 2 +- tools/perf/util/util.h | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-)
tools/perf/util/util.c +1 -1
@@ -221,7 +221,7 @@ static int slow_copyfile(const char *from, const char *to, struct nsinfo *nsi)return err; } -static int copyfile_offset (int ifd,loff_t off_in,int ofd,loff_t off_out,u64 size) +int copyfile_offset (int ifd,loff_t off_in,int ofd,loff_t off_out,u64 size) {void *ptr;loff_t pgoff;
tools/perf/util/util.h +2 -0
@@ -6,6 +6,7 @@/* glibc 2.20 deprecates _BSD_SOURCE in favour of _DEFAULT_SOURCE */ #define _DEFAULT_SOURCE 1 +#include <fcntl.h> #include <stdbool.h> #include <stddef.h> #include <stdlib.h>
@@ -35,6 +36,7 @@ bool lsdir_no_dot_filter(const char *name, struct dirent *d);int copyfile (const char *from,const char *to);int copyfile_mode (const char *from,const char *to,mode_t mode);int copyfile_ns (const char *from,const char *to,struct nsinfo *nsi); +int copyfile_offset (int ifd,loff_t off_in,int ofd,loff_t off_out,u64 size);ssize_t readn (int fd,void *buf,size_t n);ssize_t writen (int fd,const void *buf,size_t n);
Signature · 1 line
2.14.4
Arnaldo Carvalho de Melo
maintainerPATCH 12/13 perf tools: Initialize perf_data_file fd field
In reply to Arnaldo Carvalho de MeloFrom: Jérémie Galarneau <[email protected]>
Building the perf CTF converter fails with gcc 4.8.4 on Ubuntu 14.04 with the following error:
error: missing initializer for field ‘fd’ of ‘struct perf_data_file’ [-Werror=missing-field-initializers]
Per 4b838b0db4e9 ("perf tools: Add compression id into 'struct kmod_path'") and the ensuing discussion on the mailing list, it appears that this affects other distributions and gcc versions.
--- tools/perf/util/data-convert-bt.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
tools/perf/util/data-convert-bt.c +1 -1
@@ -1578,7 +1578,7 @@ int bt_convert__perf2ctf(const char *input, const char *path, {struct perf_session *session;struct perf_data data = { - .file.path = input, + .file = { .path = input, .fd =-1 }, .mode =PERF_DATA_MODE_READ , .force = opts->force, };
Signature · 1 line
2.14.4
Arnaldo Carvalho de Melo
maintainerPATCH 13/13 perf python: Use -Wno-redundant-decls to build with PYTHON=python3
In reply to Arnaldo Carvalho de MeloFrom: Arnaldo Carvalho de Melo <[email protected]>
When building in ClearLinux using 'make PYTHON=python3' with gcc 8.2.1 it fails with:
GEN /tmp/build/perf/python/perf.so
In file included from /usr/include/python3.7m/Python.h:126,
from /git/linux/tools/perf/util/python.c:2:
/usr/include/python3.7m/import.h:58:24: error: redundant redeclaration of ‘_PyImport_AddModuleObject’ [-Werror=redundant-decls]
PyAPI_FUNC(PyObject *) _PyImport_AddModuleObject(PyObject *, PyObject *);
^~~~~~~~~~~~~~~~~~~~~~~~~
/usr/include/python3.7m/import.h:47:24: note: previous declaration of ‘_PyImport_AddModuleObject’ was here
PyAPI_FUNC(PyObject *) _PyImport_AddModuleObject(PyObject *name,
^~~~~~~~~~~~~~~~~~~~~~~~~ cc1: all warnings being treated as errors
error: command 'gcc' failed with exit status 1
And indeed there is a redundant declaration in that Python.h file, one with parameter names and the other without, so just add -Wno-error=redundant-decls to the python setup instructions.
Now perf builds with gcc in ClearLinux with the following Dockerfile:
# docker.io/acmel/linux-perf-tools-build-clearlinux:latest FROM docker.io/clearlinux:latest MAINTAINER Arnaldo Carvalho de Melo <[email protected]> RUN swupd update && \ swupd bundle-add sysadmin-basic-dev RUN mkdir -m 777 -p /git /tmp/build/perf /tmp/build/objtool /tmp/build/linux && \ groupadd -r perfbuilder && \ useradd -m -r -g perfbuilder perfbuilder && \ chown -R perfbuilder.perfbuilder /tmp/build/ /git/ USER perfbuilder COPY rx_and_build.sh / ENV EXTRA_MAKE_ARGS=PYTHON=python3 ENTRYPOINT ["/rx_and_build.sh"]
Now to figure out why the build fails with clang, that is present in the above container as detected by the rx_and_build.sh script:
clang version 6.0.1 (tags/RELEASE_601/final)
Target: x86_64-unknown-linux-gnu
Thread model: posix
InstalledDir: /usr/sbin
make: Entering directory '/git/linux/tools/perf'
BUILD: Doing 'make -j4' parallel build
HOSTCC /tmp/build/perf/fixdep.o
HOSTLD /tmp/build/perf/fixdep-in.o
LINK /tmp/build/perf/fixdep Auto-detecting system features:
... dwarf: [ OFF ]
... dwarf_getlocations: [ OFF ]
... glibc: [ OFF ]
... gtk2: [ OFF ]
... libaudit: [ OFF ]
... libbfd: [ OFF ]
... libelf: [ OFF ]
... libnuma: [ OFF ]
... numa_num_possible_cpus: [ OFF ]
... libperl: [ OFF ]
... libpython: [ OFF ]
... libslang: [ OFF ]
... libcrypto: [ OFF ]
... libunwind: [ OFF ]
... libdw-dwarf-unwind: [ OFF ]
... zlib: [ OFF ]
... lzma: [ OFF ]
... get_cpuid: [ OFF ]
... bpf: [ OFF ]
Makefile.config:331: *** No gnu/libc-version.h found, please install glibc-dev[el]. Stop. make[1]: *** [Makefile.perf:206: sub-make] Error 2
make: *** [Makefile:70: all] Error 2
make: Leaving directory '/git/linux/tools/perf'
--- tools/perf/util/setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
tools/perf/util/setup.py +1 -1
@@ -35,7 +35,7 @@ class install_lib(_install_lib): cflags = getenv('CFLAGS', '').split() # switch off several checks (need to be at the end of cflags list) -cflags += ['-fno-strict-aliasing', '-Wno-write-strings', '-Wno-unused-parameter' ] +cflags += ['-fno-strict-aliasing', '-Wno-write-strings', '-Wno-unused-parameter', '-Wno-redundant-decls' ] if cc != "clang": cflags += ['-Wno-cast-function-type' ]
Signature · 1 line
2.14.4
Quoted 104 lines · Arnaldo Carvalho de Melo
Hi Ingo,
Please consider pulling,
- Arnaldo
Test results at the end of this message, as usual.
The following changes since commit
7f16023bfcc4b1f2bbccf86219dc97473db6e0d6:Merge remote-tracking branch 'acme/perf/urgent' into perf/core (2018-09-18 17:20:41 -0300)
are available in the Git repository at:
git://git.kernel.org/pub/scm/linux/kernel/git/acme/linux.gittags/perf-core-for-mingo-4.20-20180919for you to fetch changes up to
24ef0fd0a1f389b156e6ef0edd71072728831bd9:perf python: Use -Wno-redundant-decls to build with PYTHON=python3 (2018-09-19 10:25:13 -0300)
----------------------------------------------------------------
perf/core improvements and fixes:perf test:
- Add watchpoint entry (Ravi Bangoria)
Build fixes:
- Initialize
perf_data_filefd field to fix building the CTF (trace format) converter with with gcc 4.8.4 on Ubuntu 14.04 (Jérémie Galarneau)- Use -Wno-redundant-decls to build with PYTHON=python3 to build the python binding, fixing the build in systems such as Clear Linux (Arnaldo Carvalho de Melo)
Hardware tracing:
- Suppress AUX/OVERWRITE records (Alexander Shishkin)
Infrastructure:
- Adopt
PTR_ERR_OR_ZEROfrom the kernel and use it in the bpf-loader instead of open coded equivalent (Ding Xiang)- Improve the event ordering code to make it clear and fix a bug related to freeing of events when using pipe mode from 'record' to 'inject' (Jiri Olsa)
- Some prep work to facilitate per-cpu threads to write record data to per-cpu files (Jiri Olsa)
Signed-off-by Arnaldo Carvalho de Melo <[email protected]>----------------------------------------------------------------
Alexander Shishkin (1):
perf: Suppress AUX/OVERWRITE recordsArnaldo Carvalho de Melo (1):
perf python: Use -Wno-redundant-decls to build with PYTHON=python3Ding Xiang (2):
tools include: AdoptPTR_ERR_OR_ZEROfrom the kernelerr.hheader perf bpf-loader: usePTR_ERR_OR_ZEROinetead of return codeJiri Olsa (7):
perfordered_events: Add 'structordered_events_buffer' layer perfordered_events: Prevent crossingmax_alloc_sizeperf tools: Removeperf_toolfromevent_op2
perf tools: Removeperf_toolfromevent_op3
perf auxtrace: Pass structperf_mmapinto mmap__read* functions perf tools: Add 'structperf_mmap' arg torecord__write()perf util: Makecopyfile_offset()globalJérémie Galarneau (1):
perf tools: Initializeperf_data_filefd fieldRavi Bangoria (1):
perf test: Add watchpoint testkernel/events/ring_buffer.c | 14 ++- tools/include/linux/err.h | 7 ++ tools/perf/builtin-annotate.c | 7 +- tools/perf/builtin-inject.c | 37 +++--- tools/perf/builtin-record.c | 51 +++++---- tools/perf/builtin-report.c | 9 +- tools/perf/builtin-script.c | 38 +++---- tools/perf/builtin-stat.c | 23 ++-- tools/perf/tests/Build | 1 + tools/perf/tests/builtin-test.c | 9 ++ tools/perf/tests/tests.h | 3 + tools/perf/tests/wp.c | 229 ++++++++++++++++++++++++++++++++++++++ tools/perf/util/auxtrace.c | 30 +++-- tools/perf/util/auxtrace.h | 21 ++-- tools/perf/util/bpf-loader.c | 2 +- tools/perf/util/data-convert-bt.c | 2 +- tools/perf/util/header.c | 16 ++- tools/perf/util/header.h | 15 +-- tools/perf/util/mmap.c | 6 +- tools/perf/util/mmap.h | 2 +- tools/perf/util/ordered-events.c | 87 ++++++++++++--- tools/perf/util/ordered-events.h | 37 +++--- tools/perf/util/session.c | 75 ++++++------- tools/perf/util/session.h | 5 +-
Quoted 8 lines
tools/perf/util/setup.py | 2 +- tools/perf/util/stat.c | 5 +- tools/perf/util/stat.h | 5 +- tools/perf/util/tool.h | 7 +- tools/perf/util/util.c | 2 +- tools/perf/util/util.h | 2 + 30 files changed, 519 insertions(+), 230 deletions(-) create mode 100644 tools/perf/tests/wp.c
Pulled, thanks a lot Arnaldo!
Ingo