perf/core improvements and fixes
Arnaldo Carvalho de Melo
maintainerHi Ingo,
Please consider pullimg,
- Arnaldo
Test results at the end of this message, as usual.
The following changes since commit 5804b11034a21e4287daaf017c5ad60ad7af8d67:
Merge tag 'perf-core-for-mingo-4.19-20180815' of git://git.kernel.org/pub/scm/linux/kernel/git/acme/linux into perf/urgent (2018-08-18 13:11:51 +0200)
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.19-20180820
for you to fetch changes up to 78303650e4cd873c6c4276c6fe3e768ff0b46d22:
tools arch: Update arch/x86/lib/memcpy_64.S copy used in 'perf bench mem memcpy' (2018-08-20 10:17:14 -0300)
----------------------------------------------------------------
perf/core improvements and fixes:
LLVM/clang/eBPF: (Arnaldo Carvalho de Melo)
- Allow passing options to llc in addition to to clang.
Hardware tracing: (Jack Henschel)
- Improve error message for PMU address filters, clarifying availability of that feature in hardware having hardware tracing such as Intel PT.
Python interface: (Jiri Olsa)
- Fix read_on_cpu() interface.
ELF/DWARF libraries: (Jiri Olsa)
- Fix handling of the combo compressed module file + decompressed associated debuginfo file.
Build (Rasmus Villemoes)
- Disable parallelism for 'make clean', avoiding multiple submakes deleting the same files and causing the build to fail on systems such as Yocto.
Kernel ABI copies: (Arnaldo Carvalho de Melo)
- Update tools's copy of x86's cpufeatures.h.
- Update arch/x86/lib/memcpy_64.S copy used in 'perf bench mem memcpy'.
Miscellaneous: (Steven Rostedt)
- Change libtraceevent to SPDX License format.
----------------------------------------------------------------
Arnaldo Carvalho de Melo (3):
perf llvm: Allow passing options to llc in addition to clang
tools arch x86: Update tools's copy of cpufeatures.h
tools arch: Update arch/x86/lib/memcpy_64.S copy used in 'perf bench mem memcpy'
Jack Henschel (1):
perf parser: Improve error message for PMU address filters
Jiri Olsa (15):
perf tools: Get rid of dso__needs_decompress() call in read_object_code() perf tools: Get rid of dso__needs_decompress() call in symbol__disassemble() perf tools: Get rid of dso__needs_decompress() call in __open_dso() perf tools: Make decompress_to_file() function static
perf tools: Make is_supported_compression() static
perf tools: Add compression id into 'struct kmod_path'
perf tools: Store compression id into struct dso
perf tools: Use compression id in decompress_kmodule()
perf tools: Move the temp file processing into decompress_kmodule perf tools: Add is_compressed callback to compressions array perf tools: Add lzma_is_compressed function
perf tools: Add gzip_is_compressed function
perf tools: Remove ext from struct kmod_path
perf mmap: Store real cpu number in 'struct perf_mmap'
perf python: Fix pyrf_evlist__read_on_cpu() interface
Rasmus Villemoes (1):
perf tools: Disable parallelism for 'make clean'
Steven Rostedt (VMware) (1):
tools lib traceevent: Change to SPDX License format
tools/arch/x86/include/asm/cpufeatures.h | 3 +- tools/arch/x86/lib/memcpy_64.S | 2 +- tools/lib/traceevent/event-parse.c | 16 +--- tools/lib/traceevent/event-plugin.c | 16 +--- tools/lib/traceevent/event-utils.h | 16 +--- tools/lib/traceevent/kbuffer-parse.c | 17 +--- tools/lib/traceevent/parse-filter.c | 16 +--- tools/lib/traceevent/parse-utils.c | 16 +--- tools/lib/traceevent/trace-seq.c | 16 +--- tools/perf/Makefile | 4 +- tools/perf/tests/code-reading.c | 4 +- tools/perf/tests/kmod-path.c | 136 +++++++++++++++---------------- tools/perf/util/annotate.c | 4 +- tools/perf/util/compress.h | 2 + tools/perf/util/dso.c | 111 ++++++++++++------------- tools/perf/util/dso.h | 13 ++- tools/perf/util/evlist.c | 2 +- tools/perf/util/llvm-utils.c | 31 ++++++- tools/perf/util/llvm-utils.h | 9 ++ tools/perf/util/lzma.c | 20 +++++ tools/perf/util/machine.c | 4 +- tools/perf/util/mmap.c | 3 +- tools/perf/util/mmap.h | 3 +- tools/perf/util/parse-events.c | 20 ++--- tools/perf/util/python.c | 20 ++++- tools/perf/util/zlib.c | 18 ++++ 26 files changed, 256 insertions(+), 266 deletions(-)
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.
# 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 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 debian:7 : Ok gcc (Debian 4.7.2-5) 4.7.2 15 debian:8 : Ok gcc (Debian 4.9.2-10+deb8u1) 4.9.2 16 debian:9 : Ok gcc (Debian 6.3.0-18+deb9u1) 6.3.0 20170516 17 debian:experimental : Ok gcc (Debian 8.2.0-4) 8.2.0 18 debian:experimental-x-arm64 : Ok aarch64-linux-gnu-gcc (Debian 8.1.0-12) 8.1.0 19 debian:experimental-x-mips : Ok mips-linux-gnu-gcc (Debian 8.1.0-12) 8.1.0 20 debian:experimental-x-mips64 : Ok mips64-linux-gnuabi64-gcc (Debian 8.1.0-12) 8.1.0 21 debian:experimental-x-mipsel : Ok mipsel-linux-gnu-gcc (Debian 8.1.0-12) 8.1.0 22 fedora:20 : Ok gcc (GCC) 4.8.3 20140911 (Red Hat 4.8.3-7) 23 fedora:21 : Ok gcc (GCC) 4.9.2 20150212 (Red Hat 4.9.2-6) 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 arc-linux-gcc (ARCompact ISA Linux uClibc toolchain 2017.09-rc2) 7.1.1 20170710 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.1.1 20180712 (Red Hat 8.1.1-5) 32 fedora:rawhide : Ok gcc (GCC) 8.0.1 20180324 (Red Hat 8.0.1-0.20) 33 gentoo-stage3-amd64:latest : Ok gcc (Gentoo 7.3.0-r3 p1.4) 7.3.0 34 mageia:5 : Ok gcc (GCC) 4.9.2 35 mageia:6 : Ok gcc (Mageia 5.5.0-1.mga6) 5.5.0 36 opensuse:13.2 : Ok gcc (SUSE Linux) 4.8.3 20140627 [gcc-4_8-branch revision 212064] 37 opensuse:42.1 : Ok gcc (SUSE Linux) 4.8.5 38 opensuse:42.2 : Ok gcc (SUSE Linux) 4.8.5 39 opensuse:42.3 : Ok gcc (SUSE Linux) 4.8.5 40 opensuse:tumbleweed : Ok gcc (SUSE Linux) 7.3.1 20180323 [gcc-7-branch revision 258812] 41 oraclelinux:6 : Ok gcc (GCC) 4.4.7 20120313 (Red Hat 4.4.7-23.0.1) 42 oraclelinux:7 : Ok gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-28.0.1) 43 ubuntu:12.04.5 : Ok gcc (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3 44 ubuntu:14.04.4 : Ok gcc (Ubuntu 4.8.4-2ubuntu1~14.04.3) 4.8.4 45 ubuntu:14.04.4-x-linaro-arm64 : Ok aarch64-linux-gnu-gcc (Linaro GCC 5.5-2017.10) 5.5.0 46 ubuntu:16.04 : Ok gcc (Ubuntu 5.4.0-6ubuntu1~16.04.10) 5.4.0 20160609 47 ubuntu:16.04-x-arm : Ok arm-linux-gnueabihf-gcc (Ubuntu/Linaro 5.4.0-6ubuntu1~16.04.9) 5.4.0 20160609 48 ubuntu:16.04-x-arm64 : Ok aarch64-linux-gnu-gcc (Ubuntu/Linaro 5.4.0-6ubuntu1~16.04.9) 5.4.0 20160609 49 ubuntu:16.04-x-powerpc : Ok powerpc-linux-gnu-gcc (Ubuntu 5.4.0-6ubuntu1~16.04.9) 5.4.0 20160609 50 ubuntu:16.04-x-powerpc64 : Ok powerpc64-linux-gnu-gcc (Ubuntu/IBM 5.4.0-6ubuntu1~16.04.9) 5.4.0 20160609 51 ubuntu:16.04-x-powerpc64el : Ok powerpc64le-linux-gnu-gcc (Ubuntu/IBM 5.4.0-6ubuntu1~16.04.9) 5.4.0 20160609 52 ubuntu:16.04-x-s390 : Ok s390x-linux-gnu-gcc (Ubuntu 5.4.0-6ubuntu1~16.04.9) 5.4.0 20160609 53 ubuntu:16.10 : Ok gcc (Ubuntu 6.2.0-5ubuntu12) 6.2.0 20161005 54 ubuntu:17.10 : Ok gcc (Ubuntu 7.2.0-8ubuntu3.2) 7.2.0 55 ubuntu:18.04 : Ok gcc (Ubuntu 7.3.0-16ubuntu3) 7.3.0 56 ubuntu:18.04-x-arm : Ok arm-linux-gnueabihf-gcc (Ubuntu/Linaro 7.3.0-16ubuntu3) 7.3.0 57 ubuntu:18.04-x-arm64 : Ok aarch64-linux-gnu-gcc (Ubuntu/Linaro 7.3.0-16ubuntu3) 7.3.0 58 ubuntu:18.04-x-m68k : Ok m68k-linux-gnu-gcc (Ubuntu 7.3.0-16ubuntu3) 7.3.0 59 ubuntu:18.04-x-powerpc : Ok powerpc-linux-gnu-gcc (Ubuntu 7.3.0-16ubuntu3) 7.3.0 60 ubuntu:18.04-x-powerpc64 : Ok powerpc64-linux-gnu-gcc (Ubuntu 7.3.0-16ubuntu3) 7.3.0 61 ubuntu:18.04-x-powerpc64el : Ok powerpc64le-linux-gnu-gcc (Ubuntu 7.3.0-16ubuntu3) 7.3.0 62 ubuntu:18.04-x-riscv64 : Ok riscv64-linux-gnu-gcc (Ubuntu 7.3.0-16ubuntu3) 7.3.0 63 ubuntu:18.04-x-s390 : Ok s390x-linux-gnu-gcc (Ubuntu 7.3.0-16ubuntu3) 7.3.0 64 ubuntu:18.04-x-sh4 : Ok sh4-linux-gnu-gcc (Ubuntu 7.3.0-16ubuntu3) 7.3.0 65 ubuntu:18.04-x-sparc64 : Ok sparc64-linux-gnu-gcc (Ubuntu 7.3.0-16ubuntu3) 7.3.0 66 ubuntu:18.10 : Ok gcc (Ubuntu 8.2.0-1ubuntu2) 8.2.0 #
# uname -a
Linux seventh 4.18.0-02978-g1eb46908b35d #1 SMP Wed Aug 15 16:55:17 -03 2018 x86_64 x86_64 x86_64 GNU/Linux
# git log --oneline -1
78303650e4cd (HEAD -> perf/core) tools arch: Update arch/x86/lib/memcpy_64.S copy used in 'perf bench mem memcpy'
# perf version --build-options
perf version 4.18.g783036
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: Number of exit events of a simple workload : Ok
23: Software clock events period values : Ok
24: Object code reading : Ok
25: Sample parsing : Ok
26: Use a dummy software event to keep tracking : Ok
27: Parse with no sample_id_all bit set : Ok
28: Filter hist entries : Ok
29: Lookup mmap thread : Ok
30: Share thread mg : Ok
31: Sort output of hist entries : Ok
32: Cumulate child hist entries : Ok
33: Track with sched_switch : Ok
34: Filter fds with revents mask in a fdarray : Ok
35: Add fd to a fdarray, making it autogrow : Ok
36: kmod_path__parse : Ok
37: Thread map : Ok
38: LLVM search and compile :
38.1: Basic BPF llvm compile : Ok
38.2: kbuild searching : Ok
38.3: Compile source for BPF prologue generation : Ok
38.4: Compile source for BPF relocation : Ok
39: Session topology : Ok
40: BPF filter :
40.1: Basic BPF filtering : Ok
40.2: BPF pinning : Ok
40.3: BPF prologue generation : Ok
40.4: BPF relocation checker : Ok
41: Synthesize thread map : Ok
42: Remove thread map : Ok
43: Synthesize cpu map : Ok
44: Synthesize stat config : Ok
45: Synthesize stat : Ok
46: Synthesize stat round : Ok
47: Synthesize attr update : Ok
48: Event times : Ok
49: Read backward ring buffer : Ok
50: Print cpu map : Ok
51: Probe SDT events : Ok
52: is_printable_array : Ok
53: Print bitmap : Ok
54: perf hooks : Ok
55: builtin clang support : Skip (not compiled in)
56: unit_number__scnprintf : Ok
57: mem2node : Ok
58: x86 rdpmc : Ok
59: Convert perf time to TSC : Ok
60: DWARF unwind : Ok
61: x86 instruction decoder - new instructions : Ok
62: probe libc's inet_pton & backtrace it with ping : Ok
63: Check open filename arg using perf trace + vfs_getname: Ok
64: Use vfs_getname probe to get syscall args filenames : Ok
65: Add vfs_getname probe to get syscall args filenames : Ok
# $ make -C tools/perf build-test
make: Entering directory '/home/acme/git/perf/tools/perf'
- tarpkg: ./tests/perf-targz-src-pkg .
make_no_libbionic_O: make NO_LIBBIONIC=1
make_no_libbpf_O: make NO_LIBBPF=1
make_install_prefix_slash_O: make install prefix=/tmp/krava/
make_no_demangle_O: make NO_DEMANGLE=1
make_no_slang_O: make NO_SLANG=1
make_no_ui_O: make NO_NEWT=1 NO_SLANG=1 NO_GTK2=1
make_help_O: make help
make_no_libaudit_O: make NO_LIBAUDIT=1
make_debug_O: make DEBUG=1
make_static_O: make LDFLAGS=-static
make_install_prefix_O: make install prefix=/tmp/krava
make_tags_O: make tags
make_install_bin_O: make install-bin
make_no_gtk2_O: make NO_GTK2=1
make_no_auxtrace_O: make NO_AUXTRACE=1
make_clean_all_O: make clean all
make_no_libpython_O: make NO_LIBPYTHON=1
make_perf_o_O: make perf.o
make_install_O: make install
make_no_backtrace_O: make NO_BACKTRACE=1
make_doc_O: make doc
make_no_libnuma_O: make NO_LIBNUMA=1
make_no_scripts_O: make NO_LIBPYTHON=1 NO_LIBPERL=1
make_util_pmu_bison_o_O: make util/pmu-bison.o
make_no_libunwind_O: make NO_LIBUNWIND=1
make_util_map_o_O: make util/map.o
make_pure_O: make
make_no_libperl_O: make NO_LIBPERL=1
make_no_libelf_O: make NO_LIBELF=1
make_with_clangllvm_O: make LIBCLANGLLVM=1
make_no_newt_O: make NO_NEWT=1
make_no_libdw_dwarf_unwind_O: make NO_LIBDW_DWARF_UNWIND=1
make_with_babeltrace_O: make LIBBABELTRACE=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
OK
make: Leaving directory '/home/acme/git/perf/tools/perf'
$Arnaldo Carvalho de Melo
maintainerPATCH 1/21 perf tools: Disable parallelism for 'make clean'
From: Rasmus Villemoes <[email protected]>
The Yocto build system does a 'make clean' when rebuilding due to changed dependencies, and that consistently fails for me (causing the whole BSP build to fail) with errors such as
| find: '[...]/perf/1.0-r9/perf-1.0/plugin_mac80211.so': No such file or directory | find: '[...]/perf/1.0-r9/perf-1.0/plugin_mac80211.so': No such file or directory | find: find: '[...]/perf/1.0-r9/perf-1.0/libtraceevent.a''[...]/perf/1.0-r9/perf-1.0/libtraceevent.a': No such file or directory: No such file or directory |
[...]
| find: cannot delete '/mnt/xfs/devel/pil/yocto/tmp-glibc/work/wandboard-oe-linux-gnueabi/perf/1.0-r9/perf-1.0/util/.pstack.o.cmd': No such file or directory
Apparently (despite the comment), 'make clean' ends up launching multiple sub-makes that all want to remove the same things - perhaps this only happens in combination with a O=... parameter. In any case, we don't lose much by explicitly disabling the parallelism for the clean target, and it makes automated builds much more reliable.
--- tools/perf/Makefile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
tools/perf/Makefile +2 -2
@@ -84,10 +84,10 @@ endif # has_clean endif # MAKECMDGOALS # -# The clean target is not really parallel, don't print the jobs info: +# Explicitly disable parallelism for the clean target. # clean: - $(make) + $(make) -j1 # # The build-test target is not really parallel, don't print the jobs info,
Signature · 1 line
2.14.4
Arnaldo Carvalho de Melo
maintainerPATCH 2/21 perf parser: Improve error message for PMU address filters
In reply to Arnaldo Carvalho de MeloFrom: Jack Henschel <[email protected]>
This is the second version of a patch that improves the error message of the perf events parser when the PMU hardware does not support address filters.
Previously, the perf returned the following error:
$ perf record -e intel_pt// --filter 'filter sys_write' --filter option should follow a -e tracepoint or HW tracer option
This implies there is some syntax error present in the command line, which is not true. Rather, notify the user that the CPU does not have support for this feature.
For example, Intel chips based on the Broadwell micro-archticture have the Intel PT PMU, but do not support address filtering.
Now, perf prints the following error message:
$ perf record -e intel_pt// --filter 'filter sys_write' This CPU does not support address filtering
--- tools/perf/util/parse-events.c | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-)
tools/perf/util/parse-events.c +10 -10
@@ -1991,8 +1991,11 @@ static int set_filter(struct perf_evsel *evsel, const void *arg)int nr_addr_filters =0 ;struct perf_pmu *pmu =NULL ; -if (evsel ==NULL ) - goto err; +if (evsel ==NULL ) { +fprintf (stderr, +"--filter option should follow a -e tracepoint or HW tracer option\n" ); +return -1 ; + }if (evsel->attr.type ==PERF_TYPE_TRACEPOINT ) {if (perf_evsel__append_tp_filter (evsel, str) <0 ) {
@@ -2014,8 +2017,11 @@ static int set_filter(struct perf_evsel *evsel, const void *arg)perf_pmu__scan_file (pmu,"nr_addr_filters" ,"%d" , &nr_addr_filters); -if (!nr_addr_filters) - goto err; +if (!nr_addr_filters) { +fprintf (stderr, +"This CPU does not support address filtering\n" ); +return -1 ; + }if (perf_evsel__append_addr_filter (evsel, str) <0 ) { fprintf(stderr,
@@ -2024,12 +2030,6 @@ static int set_filter(struct perf_evsel *evsel, const void *arg) }return 0 ; - -err: -fprintf (stderr, -"--filter option should follow a -e tracepoint or HW tracer option\n" ); - -return -1 ; } int parse_filter(const struct option *opt, const char *str,
Signature · 1 line
2.14.4
Arnaldo Carvalho de Melo
maintainerPATCH 3/21 perf llvm: Allow passing options to llc in addition to clang
In reply to Arnaldo Carvalho de MeloFrom: Arnaldo Carvalho de Melo <[email protected]>
The newly added 'llvm.opts' variable allows passing options directly to llc, like needed to get sane DWARF in BPF ELF debug sections:
With:
[root@seventh perf]# cat ~/.perfconfig [llvm]
dump-obj = true
clang-opt = -g
[root@seventh perf]#
We get:
[root@seventh perf]# perf trace -e tools/perf/examples/bpf/hello.c cat /etc/passwd > /dev/null
LLVM: dumping tools/perf/examples/bpf/hello.o
0.000 __bpf_stdout__:Hello, world
0.015 __bpf_stdout__:Hello, world
0.187 __bpf_stdout__:Hello, world
[root@seventh perf]# pahole tools/perf/examples/bpf/hello.o
struct clang version 8.0.0 (http://llvm.org/git/clang.git 8587270a739ee30c926a76d5657e65e85b560f6e) (http://llvm.org/git/llvm.git 0566eefef9c3777bd780ec4cbb9efa764633b76c) {
clang version 8.0.0 (http://llvm.org/git/clang.git 8587270a739ee30c926a76d5657e65e85b560f6e) (http://llvm.org/git/llvm.git 0566e.org clang version 8.0.0 (http://llvm.org/git/clang.git 8587270a739ee30c926a76d5657e65e85b560f6e) (http://llvm.org/git/llvm.git 0566eefef9c3777bd780ec4cbb9efa764633b76c); /* 0 4 */
clang version 8.0.0 (http://llvm.org/git/clang.git 8587270a739ee30c926a76d5657e65e85b560f6e) (http://llvm.org/git/llvm.git 0566e.org clang version 8.0.0 (http://llvm.org/git/clang.git 8587270a739ee30c926a76d5657e65e85b560f6e) (http://llvm.org/git/llvm.git 0566eefef9c3777bd780ec4cbb9efa764633b76c); /* 4 4 */
clang version 8.0.0 (http://llvm.org/git/clang.git 8587270a739ee30c926a76d5657e65e85b560f6e) (http://llvm.org/git/llvm.git 0566e.org clang version 8.0.0 (http://llvm.org/git/clang.git 8587270a739ee30c926a76d5657e65e85b560f6e) (http://llvm.org/git/llvm.git 0566eefef9c3777bd780ec4cbb9efa764633b76c); /* 8 4 */
clang version 8.0.0 (http://llvm.org/git/clang.git 8587270a739ee30c926a76d5657e65e85b560f6e) (http://llvm.org/git/llvm.git 0566e.org clang version 8.0.0 (http://llvm.org/git/clang.git 8587270a739ee30c926a76d5657e65e85b560f6e) (http://llvm.org/git/llvm.git 0566eefef9c3777bd780ec4cbb9efa764633b76c); /* 12 4 */
clang version 8.0.0 (http://llvm.org/git/clang.git 8587270a739ee30c926a76d5657e65e85b560f6e) (http://llvm.org/git/llvm.git 0566e.org clang version 8.0.0 (http://llvm.org/git/clang.git 8587270a739ee30c926a76d5657e65e85b560f6e) (http://llvm.org/git/llvm.git 0566eefef9c3777bd780ec4cbb9efa764633b76c); /* 16 4 */
clang version 8.0.0 (http://llvm.org/git/clang.git 8587270a739ee30c926a76d5657e65e85b560f6e) (http://llvm.org/git/llvm.git 0566e.org clang version 8.0.0 (http://llvm.org/git/clang.git 8587270a739ee30c926a76d5657e65e85b560f6e) (http://llvm.org/git/llvm.git 0566eefef9c3777bd780ec4cbb9efa764633b76c); /* 20 4 */
clang version 8.0.0 (http://llvm.org/git/clang.git 8587270a739ee30c926a76d5657e65e85b560f6e) (http://llvm.org/git/llvm.git 0566e.org clang version 8.0.0 (http://llvm.org/git/clang.git 8587270a739ee30c926a76d5657e65e85b560f6e) (http://llvm.org/git/llvm.git 0566eefef9c3777bd780ec4cbb9efa764633b76c); /* 24 4 */
/* size: 28, cachelines: 1, members: 7 */
/* last cacheline: 28 bytes */ };
[root@seventh perf]#
Adding these options to be passed to llvm's llc:
[root@seventh perf]# cat ~/.perfconfig [llvm]
dump-obj = true
clang-opt = -g
opts = -mattr=dwarfris
[root@seventh perf]#
We get sane output:
[root@seventh perf]# perf trace -e tools/perf/examples/bpf/hello.c cat /etc/passwd > /dev/null
LLVM: dumping tools/perf/examples/bpf/hello.o
0.000 __bpf_stdout__:Hello, world
0.015 __bpf_stdout__:Hello, world
0.185 __bpf_stdout__:Hello, world
[root@seventh perf]# pahole tools/perf/examples/bpf/hello.o
struct bpf_map {
unsigned int type; /* 0 4 */
unsigned int key_size; /* 4 4 */
unsigned int value_size; /* 8 4 */
unsigned int max_entries; /* 12 4 */
unsigned int map_flags; /* 16 4 */
unsigned int inner_map_idx; /* 20 4 */
unsigned int numa_node; /* 24 4 *//* size: 28, cachelines: 1, members: 7 */ /* last cacheline: 28 bytes */
};
[root@seventh perf]#
--- tools/perf/util/llvm-utils.c | 31 +++++++++++++++++++++++++++++-- tools/perf/util/llvm-utils.h | 9 +++++++++ 2 files changed, 38 insertions(+), 2 deletions(-)
tools/perf/util/llvm-utils.c +29 -2
@@ -22,12 +22,14 @@"$CLANG_OPTIONS $KERNEL_INC_OPTIONS $PERF_BPF_INC_OPTIONS " \"-Wno-unused-value -Wno-pointer-sign " \"-working-directory $WORKING_DIR " \ -"-c \"$CLANG_SOURCE\" -target bpf -O2 -o -" +"-c \"$CLANG_SOURCE\" -target bpf $CLANG_EMIT_LLVM -O2 -o - $LLVM_OPTIONS_PIPE" struct llvm_param llvm_param = { .clang_path = "clang", + .llc_path = "llc", .clang_bpf_cmd_template = CLANG_BPF_CMD_DEFAULT_TEMPLATE, .clang_opt = NULL, + .opts = NULL, .kbuild_dir = NULL, .kbuild_opts = NULL, .user_set_param = false,
@@ -51,6 +53,8 @@ int perf_llvm_config(const char *var, const char *value) llvm_param.kbuild_opts =strdup (value); else if (!strcmp(var, "dump-obj")) llvm_param.dump_obj = !!perf_config_bool (var, value); + else if (!strcmp(var, "opts")) + llvm_param.opts =strdup (value); else {pr_debug ("Invalid LLVM config option: %s\n" , value);return -1 ;
@@ -430,11 +434,13 @@ int llvm__compile_bpf(const char *path, void **p_obj_buf,unsigned int kernel_version;char linux_version_code_str[64 ];const char *clang_opt = llvm_param.clang_opt; -char clang_path[PATH_MAX ], abspath[PATH_MAX ], nr_cpus_avail_str[64 ]; +char clang_path[PATH_MAX ], llc_path[PATH_MAX ], abspath[PATH_MAX ], nr_cpus_avail_str[64 ];char serr[STRERR_BUFSIZE ];char *kbuild_dir =NULL , *kbuild_include_opts =NULL , *perf_bpf_include_opts =NULL ;const char *template = llvm_param.clang_bpf_cmd_template; +char *pipe_template =NULL ; +const char *opts = llvm_param.opts;char *command_echo =NULL , *command_out;char *perf_include_dir =system_path (PERF_INCLUDE_DIR );
@@ -484,6 +490,26 @@ int llvm__compile_bpf(const char *path, void **p_obj_buf,force_set_env ("PERF_BPF_INC_OPTIONS" , perf_bpf_include_opts);force_set_env ("WORKING_DIR" , kbuild_dir ? :"." ); +if (opts) { + err =search_program (llvm_param.llc_path,"llc" , llc_path); +if (err) { +pr_err ("ERROR:\tunable to find llc.\n" +"Hint:\tTry to install latest clang/llvm to support BPF. Check your $PATH\n" +" \tand 'llc-path' option in [llvm] section of ~/.perfconfig.\n" ); +version_notice (); + goto errout; + } + +if (asprintf (&pipe_template,"%s -emit-llvm | %s -march=bpf %s -filetype=obj -o -" , + template, llc_path, opts) <0 ) { +pr_err ("ERROR:\tnot enough memory to setup command line\n" ); + goto errout; + } + + template = pipe_template; + + } +/* * Since we may reset clang's working dir, path of source file * should be transferred into absolute path, except we want
@@ -535,6 +561,7 @@ int llvm__compile_bpf(const char *path, void **p_obj_buf,free (obj_buf);free (perf_bpf_include_opts);free (perf_include_dir); +free (pipe_template);if (p_obj_buf) *p_obj_buf =NULL ;if (p_obj_buf_sz)
tools/perf/util/llvm-utils.h +9 -0
@@ -11,6 +11,8 @@struct llvm_param {/* Path of clang executable */ const char *clang_path; +/* Path of llc executable */ +const char *llc_path;/* * Template of clang bpf compiling. 5 env variables * can be used:
@@ -23,6 +25,13 @@ struct llvm_param {const char *clang_bpf_cmd_template;/* Will be filled in $CLANG_OPTIONS */ const char *clang_opt; +/* +* If present it'll add -emit-llvm to $CLANG_OPTIONS to pipe +* the clang output to llc, useful for new llvm options not +* yet selectable via 'clang -mllvm option', such as -mattr=dwarfris +* in clang 6.0/llvm 7 +*/ +const char *opts;/* Where to find kbuild system */ const char *kbuild_dir;/*
Signature · 1 line
2.14.4
Arnaldo Carvalho de Melo
maintainerPATCH 4/21 tools lib traceevent: Change to SPDX License format
In reply to Arnaldo Carvalho de MeloFrom: "Steven Rostedt (VMware)" <[email protected]>
Replace the GPL text with SPDX tags in the tools/lib/traceevent files.
--- tools/lib/traceevent/event-parse.c | 16 +--------------- tools/lib/traceevent/event-plugin.c | 16 +--------------- tools/lib/traceevent/event-utils.h | 16 +--------------- tools/lib/traceevent/kbuffer-parse.c | 17 +---------------- tools/lib/traceevent/parse-filter.c | 16 +--------------- tools/lib/traceevent/parse-utils.c | 16 +--------------- tools/lib/traceevent/trace-seq.c | 16 +--------------- 7 files changed, 7 insertions(+), 106 deletions(-)
tools/lib/traceevent/event-parse.c +1 -15
@@ -1,21 +1,7 @@ +// SPDX-License-Identifier: LGPL-2.1 /* * Copyright (C) 2009, 2010 Red Hat Inc, Steven Rostedt <[email protected]> * -* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -* This program is free software; you can redistribute it and/or -* modify it under the terms of the GNU Lesser General Public -* License as published by the Free Software Foundation; -* version 2.1 of the License (not later!) -* -* This program is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU Lesser General Public License for more details. -* -* You should have received a copy of the GNU Lesser General Public -* License along with this program; if not, see <http://www.gnu.org/licenses> -* -* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * * The parts for function graph printing was taken and modified from the * Linux Kernel that were written by
tools/lib/traceevent/event-plugin.c +1 -15
@@ -1,21 +1,7 @@ +// SPDX-License-Identifier: LGPL-2.1 /* * Copyright (C) 2009, 2010 Red Hat Inc, Steven Rostedt <[email protected]> * -* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -* This program is free software; you can redistribute it and/or -* modify it under the terms of the GNU Lesser General Public -* License as published by the Free Software Foundation; -* version 2.1 of the License (not later!) -* -* This program is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU Lesser General Public License for more details. -* -* You should have received a copy of the GNU Lesser General Public -* License along with this program; if not, see <http://www.gnu.org/licenses> -* -* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ #include <ctype.h>
tools/lib/traceevent/event-utils.h +1 -15
@@ -1,21 +1,7 @@ +/* SPDX-License-Identifier: LGPL-2.1 */ /* * Copyright (C) 2010 Red Hat Inc, Steven Rostedt <[email protected]> * -* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -* This program is free software; you can redistribute it and/or -* modify it under the terms of the GNU Lesser General Public -* License as published by the Free Software Foundation; -* version 2.1 of the License (not later!) -* -* This program is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU Lesser General Public License for more details. -* -* You should have received a copy of the GNU Lesser General Public -* License along with this program; if not, see <http://www.gnu.org/licenses> -* -* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ #ifndef __UTIL_H#define __UTIL_H
tools/lib/traceevent/kbuffer-parse.c +1 -16
@@ -1,22 +1,7 @@ +// SPDX-License-Identifier: LGPL-2.1 /* * Copyright (C) 2009, 2010 Red Hat Inc, Steven Rostedt <[email protected]> * -* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -* This program is free software; you can redistribute it and/or -* modify it under the terms of the GNU Lesser General Public -* License as published by the Free Software Foundation; -* version 2.1 of the License (not later!) -* -* This program is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU Lesser General Public License for more details. -* -* You should have received a copy of the GNU Lesser General Public -* License along with this program; if not, write to the Free Software -* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -* -* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ #include <stdio.h> #include <stdlib.h>
tools/lib/traceevent/parse-filter.c +1 -15
@@ -1,21 +1,7 @@ +// SPDX-License-Identifier: LGPL-2.1 /* * Copyright (C) 2010 Red Hat Inc, Steven Rostedt <[email protected]> * -* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -* This program is free software; you can redistribute it and/or -* modify it under the terms of the GNU Lesser General Public -* License as published by the Free Software Foundation; -* version 2.1 of the License (not later!) -* -* This program is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU Lesser General Public License for more details. -* -* You should have received a copy of the GNU Lesser General Public -* License along with this program; if not, see <http://www.gnu.org/licenses> -* -* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ #include <stdio.h> #include <stdlib.h>
tools/lib/traceevent/parse-utils.c +1 -15
@@ -1,21 +1,7 @@ +// SPDX-License-Identifier: LGPL-2.1 /* * Copyright (C) 2010 Red Hat Inc, Steven Rostedt <[email protected]> * -* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -* This program is free software; you can redistribute it and/or -* modify it under the terms of the GNU Lesser General Public -* License as published by the Free Software Foundation; -* version 2.1 of the License (not later!) -* -* This program is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU Lesser General Public License for more details. -* -* You should have received a copy of the GNU Lesser General Public -* License along with this program; if not, see <http://www.gnu.org/licenses> -* -* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ #include <stdio.h> #include <stdlib.h>
tools/lib/traceevent/trace-seq.c +1 -15
@@ -1,21 +1,7 @@ +// SPDX-License-Identifier: LGPL-2.1 /* * Copyright (C) 2009 Red Hat Inc, Steven Rostedt <[email protected]> * -* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -* This program is free software; you can redistribute it and/or -* modify it under the terms of the GNU Lesser General Public -* License as published by the Free Software Foundation; -* version 2.1 of the License (not later!) -* -* This program is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU Lesser General Public License for more details. -* -* You should have received a copy of the GNU Lesser General Public -* License along with this program; if not, see <http://www.gnu.org/licenses> -* -* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ #include <stdio.h> #include <stdlib.h>
Signature · 1 line
2.14.4
Arnaldo Carvalho de Melo
maintainerPATCH 5/21 perf tools: Get rid of dso__needs_decompress() call in read_object_code()
In reply to Arnaldo Carvalho de MeloFrom: Jiri Olsa <[email protected]>
There's no need to call dso__needs_decompress() twice in the function.
--- tools/perf/tests/code-reading.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
tools/perf/tests/code-reading.c +3 -1
@@ -232,6 +232,7 @@ static int read_object_code(u64 addr, size_t len, u8 cpumode,u64 objdump_addr;const char *objdump_name;char decomp_name[KMOD_DECOMP_LEN ]; +bool decomp = false;int ret;pr_debug ("Reading object code for memory address: %#" PRIx64"\n" , addr);
@@ -305,6 +306,7 @@ static int read_object_code(u64 addr, size_t len, u8 cpumode,return -1 ; } + decomp = true; objdump_name = decomp_name; }
@@ -312,7 +314,7 @@ static int read_object_code(u64 addr, size_t len, u8 cpumode, objdump_addr =map__rip_2objdump (al.map, al.addr); ret =read_via_objdump (objdump_name, objdump_addr, buf2, len); -if (dso__needs_decompress (al.map->dso)) +if (decomp)unlink (objdump_name);if (ret >0 ) {
Signature · 1 line
2.14.4
Arnaldo Carvalho de Melo
maintainerPATCH 6/21 perf tools: Get rid of dso__needs_decompress() call in symbol__disassemble()
In reply to Arnaldo Carvalho de MeloFrom: Jiri Olsa <[email protected]>
There's no need to call dso__needs_decompress() twice in the function.
--- tools/perf/util/annotate.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
tools/perf/util/annotate.c +3 -1
@@ -1629,6 +1629,7 @@ static int symbol__disassemble(struct symbol *sym, struct annotate_args *args)char symfs_filename[PATH_MAX ];struct kcore_extract kce;bool delete_extract = false; +bool decomp = false;int stdout_fd[2 ];int lineno =0 ;int nline;
@@ -1662,6 +1663,7 @@ static int symbol__disassemble(struct symbol *sym, struct annotate_args *args) tmp, sizeof(tmp)) < 0) goto out; + decomp = true;strcpy (symfs_filename, tmp); }
@@ -1748,7 +1750,7 @@ static int symbol__disassemble(struct symbol *sym, struct annotate_args *args) out_remove_tmp:close (stdout_fd[0 ]); -if (dso__needs_decompress (dso)) +if (decomp)unlink (symfs_filename);if (delete_extract)
Signature · 1 line
2.14.4
Arnaldo Carvalho de Melo
maintainerPATCH 7/21 perf tools: Get rid of dso__needs_decompress() call in __open_dso()
In reply to Arnaldo Carvalho de MeloFrom: Jiri Olsa <[email protected]>
There's no need to call dso__needs_decompress() twice in the function.
--- tools/perf/util/dso.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
tools/perf/util/dso.c +3 -1
@@ -468,6 +468,7 @@ static int __open_dso(struct dso *dso, struct machine *machine)int fd = -EINVAL ;char *root_dir = (char *)"" ;char *name =malloc (PATH_MAX ); +bool decomp = false;if (!name)return -ENOMEM ;
@@ -491,12 +492,13 @@ static int __open_dso(struct dso *dso, struct machine *machine) goto out; } + decomp = true;strcpy (name, newpath); } fd =do_open (name); -if (dso__needs_decompress (dso)) +if (decomp)unlink (name); out:
Signature · 1 line
2.14.4
Arnaldo Carvalho de Melo
maintainerPATCH 8/21 perf tools: Make decompress_to_file() function static
In reply to Arnaldo Carvalho de MeloFrom: Jiri Olsa <[email protected]>
There's no outside user of it.
--- tools/perf/util/dso.c | 2 +- tools/perf/util/dso.h | 1 - 2 files changed, 1 insertion(+), 2 deletions(-)
tools/perf/util/dso.c +1 -1
@@ -239,7 +239,7 @@ bool is_kernel_module(const char *pathname, int cpumode)return m.kmod; } -bool decompress_to_file (const char *ext,const char *filename,int output_fd) +static bool decompress_to_file (const char *ext,const char *filename,int output_fd) {unsigned i;
tools/perf/util/dso.h +0 -1
@@ -252,7 +252,6 @@ int dso__read_binary_type_filename(const struct dso *dso, enum dso_binary_type t char *root_dir, char *filename, size_t size);bool is_supported_compression (const char *ext);bool is_kernel_module (const char *pathname,int cpumode); -bool decompress_to_file (const char *ext,const char *filename,int output_fd);bool dso__needs_decompress (struct dso *dso);int dso__decompress_kmodule_fd (struct dso *dso,const char *name); int dso__decompress_kmodule_path(struct dso *dso, const char *name,
Signature · 1 line
2.14.4
Arnaldo Carvalho de Melo
maintainerPATCH 9/21 perf tools: Make is_supported_compression() static
In reply to Arnaldo Carvalho de MeloFrom: Jiri Olsa <[email protected]>
There's no outside user of it.
--- tools/perf/util/dso.c | 2 +- tools/perf/util/dso.h | 1 - 2 files changed, 1 insertion(+), 2 deletions(-)
tools/perf/util/dso.c +1 -1
@@ -202,7 +202,7 @@ static const struct { { NULL, NULL }, }; -bool is_supported_compression (const char *ext) +static bool is_supported_compression (const char *ext) {unsigned i;
tools/perf/util/dso.h +0 -1
@@ -250,7 +250,6 @@ int dso__kernel_module_get_build_id(struct dso *dso, const char *root_dir);char dso__symtab_origin (const struct dso *dso);int dso__read_binary_type_filename (const struct dso *dso,enum dso_binary_type type,char *root_dir,char *filename,size_t size); -bool is_supported_compression (const char *ext);bool is_kernel_module (const char *pathname,int cpumode);bool dso__needs_decompress (struct dso *dso);int dso__decompress_kmodule_fd (struct dso *dso,const char *name);
Signature · 1 line
2.14.4
Arnaldo Carvalho de Melo
maintainerPATCH 10/21 perf tools: Add compression id into 'struct kmod_path'
In reply to Arnaldo Carvalho de MeloFrom: Jiri Olsa <[email protected]>
Store a decompression ID in 'struct kmod_path', so it can be later stored in 'struct dso'.
Switch 'struct kmod_path's 'comp' from 'bool' to 'int' to return the compressions array index. Add 0 index item into compressions array, so that the comp usage stays as it was: 0 - no compression, != 0 compression index.
Update the kmod_path tests.
Committer notes:
Use a designated initializer + terminating comma, e.g. { .fmt = NULL, }, to fix the build in several distros:
centos:6: util/dso.c:201: error: missing initializer centos:6: util/dso.c:201: error: (near initialization for 'compressions[0].decompress') debian:9: util/dso.c:201:24: error: missing field 'decompress' initializer [-Werror,-Wmissing-field-initializers] fedora:25: util/dso.c:201:24: error: missing field 'decompress' initializer [-Werror,-Wmissing-field-initializers] fedora:26: util/dso.c:201:24: error: missing field 'decompress' initializer [-Werror,-Wmissing-field-initializers] fedora:27: util/dso.c:201:24: error: missing field 'decompress' initializer [-Werror,-Wmissing-field-initializers] oraclelinux:6: util/dso.c:201: error: missing initializer oraclelinux:6: util/dso.c:201: error: (near initialization for 'compressions[0].decompress') ubuntu:12.04.5: util/dso.c:201:2: error: missing initializer [-Werror=missing-field-initializers] ubuntu:12.04.5: util/dso.c:201:2: error: (near initialization for 'compressions[0].decompress') [-Werror=missing-field-initializers] ubuntu:16.04: util/dso.c:201:24: error: missing field 'decompress' initializer [-Werror,-Wmissing-field-initializers] ubuntu:16.10: util/dso.c:201:24: error: missing field 'decompress' initializer [-Werror,-Wmissing-field-initializers] ubuntu:16.10: util/dso.c:201:24: error: missing field 'decompress' initializer [-Werror,-Wmissing-field-initializers] ubuntu:17.10: util/dso.c:201:24: error: missing field 'decompress' initializer [-Werror,-Wmissing-field-initializers]
--- tools/perf/tests/kmod-path.c | 42 +++++++++++++++++++++--------------------- tools/perf/util/dso.c | 18 +++++++++++------- tools/perf/util/dso.h | 2 +- 3 files changed, 33 insertions(+), 29 deletions(-)
tools/perf/tests/kmod-path.c +21 -21
@@ -6,7 +6,7 @@#include "debug.h" static int test (const char *path,bool alloc_name,bool alloc_ext, -bool kmod,bool comp,const char *name,const char *ext) +bool kmod,int comp,const char *name,const char *ext) {struct kmod_path m;
@@ -54,47 +54,47 @@ static int test_is_kernel_module(const char *path, int cpumode, bool expect)int test__kmod_path__parse (struct test *t__maybe_unused ,int subtest__maybe_unused ) {/* path alloc_name alloc_ext kmod comp name ext */ -T ("/xxxx/xxxx/x-x.ko" , true , true , true, false,"[x_x]" ,NULL ); -T ("/xxxx/xxxx/x-x.ko" , false , true , true, false,NULL ,NULL ); -T ("/xxxx/xxxx/x-x.ko" , true , false , true, false,"[x_x]" ,NULL ); -T ("/xxxx/xxxx/x-x.ko" , false , false , true, false,NULL ,NULL ); +T ("/xxxx/xxxx/x-x.ko" , true , true , true,0 ,"[x_x]" ,NULL ); +T ("/xxxx/xxxx/x-x.ko" , false , true , true,0 ,NULL ,NULL ); +T ("/xxxx/xxxx/x-x.ko" , true , false , true,0 ,"[x_x]" ,NULL ); +T ("/xxxx/xxxx/x-x.ko" , false , false , true,0 ,NULL ,NULL );M ("/xxxx/xxxx/x-x.ko" ,PERF_RECORD_MISC_CPUMODE_UNKNOWN , true);M ("/xxxx/xxxx/x-x.ko" ,PERF_RECORD_MISC_KERNEL , true);M ("/xxxx/xxxx/x-x.ko" ,PERF_RECORD_MISC_USER , false);#ifdef HAVE_ZLIB_SUPPORT /* path alloc_name alloc_ext kmod comp name ext */ -T ("/xxxx/xxxx/x.ko.gz" , true , true , true, true,"[x]" ,"gz" ); -T ("/xxxx/xxxx/x.ko.gz" , false , true , true, true,NULL ,"gz" ); -T ("/xxxx/xxxx/x.ko.gz" , true , false , true, true,"[x]" ,NULL ); -T ("/xxxx/xxxx/x.ko.gz" , false , false , true, true,NULL ,NULL ); +T ("/xxxx/xxxx/x.ko.gz" , true , true , true,1 ,"[x]" ,"gz" ); +T ("/xxxx/xxxx/x.ko.gz" , false , true , true,1 ,NULL ,"gz" ); +T ("/xxxx/xxxx/x.ko.gz" , true , false , true,1 ,"[x]" ,NULL ); +T ("/xxxx/xxxx/x.ko.gz" , false , false , true,1 ,NULL ,NULL );M ("/xxxx/xxxx/x.ko.gz" ,PERF_RECORD_MISC_CPUMODE_UNKNOWN , true);M ("/xxxx/xxxx/x.ko.gz" ,PERF_RECORD_MISC_KERNEL , true);M ("/xxxx/xxxx/x.ko.gz" ,PERF_RECORD_MISC_USER , false);/* path alloc_name alloc_ext kmod comp name ext */ -T ("/xxxx/xxxx/x.gz" , true , true , false, true,"x.gz" ,"gz" ); -T ("/xxxx/xxxx/x.gz" , false , true , false, true,NULL ,"gz" ); -T ("/xxxx/xxxx/x.gz" , true , false , false, true,"x.gz" ,NULL ); -T ("/xxxx/xxxx/x.gz" , false , false , false, true,NULL ,NULL ); +T ("/xxxx/xxxx/x.gz" , true , true , false,1 ,"x.gz" ,"gz" ); +T ("/xxxx/xxxx/x.gz" , false , true , false,1 ,NULL ,"gz" ); +T ("/xxxx/xxxx/x.gz" , true , false , false,1 ,"x.gz" ,NULL ); +T ("/xxxx/xxxx/x.gz" , false , false , false,1 ,NULL ,NULL );M ("/xxxx/xxxx/x.gz" ,PERF_RECORD_MISC_CPUMODE_UNKNOWN , false);M ("/xxxx/xxxx/x.gz" ,PERF_RECORD_MISC_KERNEL , false);M ("/xxxx/xxxx/x.gz" ,PERF_RECORD_MISC_USER , false);/* path alloc_name alloc_ext kmod comp name ext */ -T ("x.gz" , true , true , false, true,"x.gz" ,"gz" ); -T ("x.gz" , false , true , false, true,NULL ,"gz" ); -T ("x.gz" , true , false , false, true,"x.gz" ,NULL ); -T ("x.gz" , false , false , false, true,NULL ,NULL ); +T ("x.gz" , true , true , false,1 ,"x.gz" ,"gz" ); +T ("x.gz" , false , true , false,1 ,NULL ,"gz" ); +T ("x.gz" , true , false , false,1 ,"x.gz" ,NULL ); +T ("x.gz" , false , false , false,1 ,NULL ,NULL );M ("x.gz" ,PERF_RECORD_MISC_CPUMODE_UNKNOWN , false);M ("x.gz" ,PERF_RECORD_MISC_KERNEL , false);M ("x.gz" ,PERF_RECORD_MISC_USER , false);/* path alloc_name alloc_ext kmod comp name ext */ -T ("x.ko.gz" , true , true , true, true,"[x]" ,"gz" ); -T ("x.ko.gz" , false , true , true, true,NULL ,"gz" ); -T ("x.ko.gz" , true , false , true, true,"[x]" ,NULL ); -T ("x.ko.gz" , false , false , true, true,NULL ,NULL ); +T ("x.ko.gz" , true , true , true,1 ,"[x]" ,"gz" ); +T ("x.ko.gz" , false , true , true,1 ,NULL ,"gz" ); +T ("x.ko.gz" , true , false , true,1 ,"[x]" ,NULL ); +T ("x.ko.gz" , false , false , true,1 ,NULL ,NULL );M ("x.ko.gz" ,PERF_RECORD_MISC_CPUMODE_UNKNOWN , true);M ("x.ko.gz" ,PERF_RECORD_MISC_KERNEL , true);M ("x.ko.gz" ,PERF_RECORD_MISC_USER , false);
tools/perf/util/dso.c +11 -7
@@ -189,10 +189,15 @@ int dso__read_binary_type_filename(const struct dso *dso,return ret; } +enum { +COMP_ID__NONE =0 , +}; +static const struct {const char *fmt;int (*decompress)(const char *input,int output); } compressions[] = { + [COMP_ID__NONE ] = { .fmt =NULL , }, #ifdef HAVE_ZLIB_SUPPORT {"gz" , gzip_decompress_to_file }, #endif
@@ -202,15 +207,15 @@ static const struct { { NULL, NULL }, }; -static bool is_supported_compression (const char *ext) +static int is_supported_compression (const char *ext) {unsigned i; -for (i =0 ; compressions[i].fmt; i++) { +for (i =1 ; compressions[i].fmt; i++) {if (!strcmp (ext, compressions[i].fmt)) -return true; +return i; } -return false; +return COMP_ID__NONE ; }bool is_kernel_module (const char *pathname,int cpumode)
@@ -372,10 +377,9 @@ int __kmod_path__parse(struct kmod_path *m, const char *path,return 0 ; } -if (is_supported_compression (ext +1 )) { - m->comp = true; + m->comp =is_supported_compression (ext +1 ); +if (m->comp >COMP_ID__NONE ) ext -=3 ; - }/* Check .ko extension only if there's enough name left. */ if (ext > name)
tools/perf/util/dso.h +1 -1
@@ -262,7 +262,7 @@ int dso__decompress_kmodule_path(struct dso *dso, const char *name,struct kmod_path {char *name;char *ext; -bool comp; +int comp;bool kmod; };
Signature · 1 line
2.14.4
Arnaldo Carvalho de Melo
maintainerPATCH 11/21 perf tools: Store compression id into struct dso
In reply to Arnaldo Carvalho de MeloFrom: Jiri Olsa <[email protected]>
Add comp to 'struct dso' to hold the compression index. It will be used in the following patches.
--- tools/perf/util/dso.c | 5 ++++- tools/perf/util/dso.h | 1 + tools/perf/util/machine.c | 4 +++- 3 files changed, 8 insertions(+), 2 deletions(-)
tools/perf/util/dso.c +4 -1
@@ -417,8 +417,10 @@ void dso__set_module_info(struct dso *dso, struct kmod_path *m, dso->symtab_type =DSO_BINARY_TYPE__GUEST_KMODULE ;/* _KMODULE_COMP should be next to _KMODULE */ -if (m->kmod && m->comp) +if (m->kmod && m->comp) { dso->symtab_type++; + dso->comp = m->comp; + }dso__set_short_name (dso,strdup (m->name), true); }
@@ -1224,6 +1226,7 @@ struct dso *dso__new(const char *name) dso->a2l_fails =1 ; dso->kernel =DSO_TYPE_USER ; dso->needs_swap =DSO_SWAP__UNSET ; + dso->comp =COMP_ID__NONE ;RB_CLEAR_NODE (&dso->rb_node); dso->root =NULL ;INIT_LIST_HEAD (&dso->node);
tools/perf/util/dso.h +1 -0
@@ -175,6 +175,7 @@ struct dso {u16 short_name_len;void *dwfl;/* DWARF debug info */ struct auxtrace_cache *auxtrace_cache; +int comp;/* dso data file */ struct {
tools/perf/util/machine.c +3 -1
@@ -1212,8 +1212,10 @@ static int map_groups__set_module_path(struct map_groups *mg, const char *path,* Full name could reveal us kmod compression, so * we need to update the symtab_type if needed. */ -if (m->comp &&is_kmod_dso (map->dso)) +if (m->comp &&is_kmod_dso (map->dso)) { map->dso->symtab_type++; + map->dso->comp = m->comp; + }return 0 ; }
Signature · 1 line
2.14.4
Arnaldo Carvalho de Melo
maintainerPATCH 12/21 perf tools: Use compression id in decompress_kmodule()
In reply to Arnaldo Carvalho de MeloFrom: Jiri Olsa <[email protected]>
Once we parsed out the compression ID, we dont need to iterate all available compressions and we can call it directly.
--- tools/perf/util/dso.c | 24 +++--------------------- 1 file changed, 3 insertions(+), 21 deletions(-)
tools/perf/util/dso.c +3 -21
@@ -244,18 +244,6 @@ bool is_kernel_module(const char *pathname, int cpumode)return m.kmod; } -static bool decompress_to_file (const char *ext,const char *filename,int output_fd) -{ -unsigned i; - -for (i =0 ; compressions[i].fmt; i++) { -if (!strcmp (ext, compressions[i].fmt)) -return !compressions[i].decompress (filename, - output_fd); - } -return false; -} -bool dso__needs_decompress (struct dso *dso) { return dso->symtab_type == DSO_BINARY_TYPE__SYSTEM_PATH_KMODULE_COMP ||
@@ -265,31 +253,25 @@ bool dso__needs_decompress(struct dso *dso)static int decompress_kmodule (struct dso *dso,const char *name,char *tmpbuf) {int fd =-1 ; -struct kmod_path m;if (!dso__needs_decompress (dso))return -1 ; -if (kmod_path__parse_ext (&m, dso->long_name)) +if (dso->comp ==COMP_ID__NONE )return -1 ; -if (!m.comp) - goto out; - fd =mkstemp (tmpbuf);if (fd <0 ) { dso->load_errno = errno; - goto out; +return -1 ; } -if (!decompress_to_file (m.ext, name, fd)) { +if (compressions[dso->comp].decompress (name, fd)) { dso->load_errno =DSO_LOAD_ERRNO__DECOMPRESSION_FAILURE ;close (fd); fd =-1 ; } -out: -free (m.ext);return fd; }
Signature · 1 line
2.14.4
Arnaldo Carvalho de Melo
maintainerPATCH 13/21 perf tools: Move the temp file processing into decompress_kmodule
In reply to Arnaldo Carvalho de MeloFrom: Jiri Olsa <[email protected]>
We will add a compression check in the following patch and it makes it easier if the file processing is done in a single place. It also makes the current code simpler.
The decompress_kmodule function now returns the fd of the uncompressed file and the file name in the pathname arg, if it's provided.
--- tools/perf/util/dso.c | 29 ++++++++++++----------------- 1 file changed, 12 insertions(+), 17 deletions(-)
tools/perf/util/dso.c +12 -17
@@ -250,8 +250,10 @@ bool dso__needs_decompress(struct dso *dso) dso->symtab_type ==DSO_BINARY_TYPE__GUEST_KMODULE_COMP ; } -static int decompress_kmodule (struct dso *dso,const char *name,char *tmpbuf) +static int decompress_kmodule (struct dso *dso,const char *name, +char *pathname,size_t len) { +char tmpbuf[] =KMOD_DECOMP_NAME ;int fd =-1 ;if (!dso__needs_decompress (dso))
@@ -272,34 +274,27 @@ static int decompress_kmodule(struct dso *dso, const char *name, char *tmpbuf) fd =-1 ; } +if (!pathname || (fd <0 )) +unlink (tmpbuf); + +if (pathname && (fd >=0 )) +strncpy (pathname, tmpbuf, len); +return fd; }int dso__decompress_kmodule_fd (struct dso *dso,const char *name) { -char tmpbuf[] =KMOD_DECOMP_NAME ; -int fd; - - fd =decompress_kmodule (dso, name, tmpbuf); -unlink (tmpbuf); -return fd; +return decompress_kmodule (dso, name,NULL ,0 ); }int dso__decompress_kmodule_path (struct dso *dso,const char *name,char *pathname,size_t len) { -char tmpbuf[] =KMOD_DECOMP_NAME ; -int fd; - - fd =decompress_kmodule (dso, name, tmpbuf); -if (fd <0 ) { -unlink (tmpbuf); -return -1 ; - } +int fd =decompress_kmodule (dso, name, pathname, len); -strncpy (pathname, tmpbuf, len);close (fd); -return 0 ; +return fd >=0 ?0 :-1 ; }/*
Signature · 1 line
2.14.4
Arnaldo Carvalho de Melo
maintainerPATCH 14/21 perf tools: Add is_compressed callback to compressions array
In reply to Arnaldo Carvalho de MeloFrom: Jiri Olsa <[email protected]>
Add is_compressed callback to the compressions array, that returns 0 if the file is compressed or != 0 if not.
The new callback is used to recognize the situation when we have a 'compressed' object, like:
/lib/modules/.../drivers/net/ethernet/intel/igb/igb.ko.xz
but we need to read its debug data from debuginfo files, which might not be compressed, like:
/root/.debug/.build-id/d6/...c4b301f/debug
So even for a 'compressed' object we read debug data from a plain uncompressed object. To keep this transparent, we detect this in decompress_kmodule() and return the file descriptor to the uncompressed file.
--- tools/perf/util/compress.h | 2 ++ tools/perf/util/dso.c | 23 ++++++++++++++++++++--- tools/perf/util/lzma.c | 5 +++++ tools/perf/util/zlib.c | 6 ++++++ 4 files changed, 33 insertions(+), 3 deletions(-)
tools/perf/util/compress.h +2 -0
@@ -4,10 +4,12 @@#ifdef HAVE_ZLIB_SUPPORT int gzip_decompress_to_file (const char *input,int output_fd); +bool gzip_is_compressed (const char *input);#endif #ifdef HAVE_LZMA_SUPPORT int lzma_decompress_to_file (const char *input,int output_fd); +bool lzma_is_compressed (const char *input);#endif #endif /* PERF_COMPRESS_H */
tools/perf/util/dso.c +20 -3
@@ -196,15 +196,16 @@ enum {static const struct {const char *fmt;int (*decompress)(const char *input,int output); +bool (*is_compressed)(const char *input); } compressions[] = { [COMP_ID__NONE ] = { .fmt =NULL , }, #ifdef HAVE_ZLIB_SUPPORT - {"gz" , gzip_decompress_to_file }, + {"gz" , gzip_decompress_to_file, gzip_is_compressed }, #endif #ifdef HAVE_LZMA_SUPPORT - {"xz" , lzma_decompress_to_file }, + {"xz" , lzma_decompress_to_file, lzma_is_compressed }, #endif - {NULL ,NULL }, + {NULL ,NULL ,NULL }, };static int is_supported_compression (const char *ext)
@@ -262,6 +263,22 @@ static int decompress_kmodule(struct dso *dso, const char *name,if (dso->comp ==COMP_ID__NONE )return -1 ; +/* +* We have proper compression id for DSO and yet the file +* behind the 'name' can still be plain uncompressed object. +* +* The reason is behind the logic we open the DSO object files, +* when we try all possible 'debug' objects until we find the +* data. So even if the DSO is represented by 'krava.xz' module, +* we can end up here opening ~/.debug/....23432432/debug' file +* which is not compressed. +* +* To keep this transparent, we detect this and return the file +* descriptor to the uncompressed file. +*/ +if (!compressions[dso->comp].is_compressed (name)) +return open (name,O_RDONLY ); + fd =mkstemp (tmpbuf);if (fd <0 ) { dso->load_errno = errno;
tools/perf/util/lzma.c +5 -0
@@ -99,3 +99,8 @@ int lzma_decompress_to_file(const char *input, int output_fd)fclose (infile);return err; } + +bool lzma_is_compressed (const char *input__maybe_unused ) +{ +return true; +}
tools/perf/util/zlib.c +6 -0
@@ -5,6 +5,7 @@#include <sys/stat.h> #include <sys/mman.h> #include <zlib.h> +#include <linux/compiler.h> #include "util/compress.h" #include "util/util.h"
@@ -79,3 +80,8 @@ int gzip_decompress_to_file(const char *input, int output_fd)return ret ==Z_STREAM_END ?0 :-1 ; } + +bool gzip_is_compressed (const char *input__maybe_unused ) +{ +return true; +}
Signature · 1 line
2.14.4
Arnaldo Carvalho de Melo
maintainerPATCH 15/21 perf tools: Add lzma_is_compressed function
In reply to Arnaldo Carvalho de MeloFrom: Jiri Olsa <[email protected]>
Add implementation of the is_compressed callback for lzma.
--- tools/perf/util/lzma.c | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-)
tools/perf/util/lzma.c +17 -2
@@ -3,9 +3,13 @@#include <lzma.h> #include <stdio.h> #include <linux/compiler.h> +#include <sys/types.h> +#include <sys/stat.h> +#include <fcntl.h> #include "compress.h" #include "util.h" #include "debug.h" +#include <unistd.h> #define BUFSIZE 8192
@@ -100,7 +104,18 @@ int lzma_decompress_to_file(const char *input, int output_fd)return err; } -bool lzma_is_compressed (const char *input__maybe_unused ) +bool lzma_is_compressed (const char *input) { -return true; +int fd =open (input,O_RDONLY ); +const uint8_t magic[6 ] = {0xFD ,'7' ,'z' ,'X' ,'Z' ,0x00 }; +char buf[6 ] = {0 }; +ssize_t rc; + +if (fd <0 ) +return -1 ; + + rc =read (fd, buf,sizeof (buf)); +close (fd); +return rc ==sizeof (buf) ? +memcmp (buf, magic,sizeof (buf)) ==0 : false; }
Signature · 1 line
2.14.4
Arnaldo Carvalho de Melo
maintainerPATCH 16/21 perf tools: Add gzip_is_compressed function
In reply to Arnaldo Carvalho de MeloFrom: Jiri Olsa <[email protected]>
Add implementation of the is_compressed callback for gzip.
--- tools/perf/util/zlib.c | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-)
tools/perf/util/zlib.c +14 -2
@@ -6,6 +6,7 @@#include <sys/mman.h> #include <zlib.h> #include <linux/compiler.h> +#include <unistd.h> #include "util/compress.h" #include "util/util.h"
@@ -81,7 +82,18 @@ int gzip_decompress_to_file(const char *input, int output_fd)return ret ==Z_STREAM_END ?0 :-1 ; } -bool gzip_is_compressed (const char *input__maybe_unused ) +bool gzip_is_compressed (const char *input) { -return true; +int fd =open (input,O_RDONLY ); +const uint8_t magic[2 ] = {0x1f ,0x8b }; +char buf[2 ] = {0 }; +ssize_t rc; + +if (fd <0 ) +return -1 ; + + rc =read (fd, buf,sizeof (buf)); +close (fd); +return rc ==sizeof (buf) ? +memcmp (buf, magic,sizeof (buf)) ==0 : false; }
Signature · 1 line
2.14.4
Arnaldo Carvalho de Melo
maintainerPATCH 17/21 perf tools: Remove ext from struct kmod_path
In reply to Arnaldo Carvalho de MeloFrom: Jiri Olsa <[email protected]>
Having comp carrying the compression ID, we no longer need return the extension. Removing it and updating the automated test.
--- tools/perf/tests/kmod-path.c | 136 +++++++++++++++++++++---------------------- tools/perf/util/dso.c | 10 +--- tools/perf/util/dso.h | 8 +-- 3 files changed, 69 insertions(+), 85 deletions(-)
tools/perf/tests/kmod-path.c +65 -71
@@ -5,34 +5,28 @@#include "dso.h" #include "debug.h" -static int test (const char *path,bool alloc_name,bool alloc_ext, -bool kmod,int comp,const char *name,const char *ext) +static int test (const char *path,bool alloc_name,bool kmod, +int comp,const char *name) {struct kmod_path m;memset (&m,0x0 ,sizeof (m));TEST_ASSERT_VAL ("kmod_path__parse" , - !__kmod_path__parse (&m, path, alloc_name, alloc_ext)); + !__kmod_path__parse (&m, path, alloc_name)); -pr_debug ("%s - alloc name %d, alloc ext %d, kmod %d, comp %d, name '%s', ext '%s'\n" , - path, alloc_name, alloc_ext, m.kmod, m.comp, m.name, m.ext); +pr_debug ("%s - alloc name %d, kmod %d, comp %d, name '%s'\n" , + path, alloc_name, m.kmod, m.comp, m.name);TEST_ASSERT_VAL ("wrong kmod" , m.kmod == kmod);TEST_ASSERT_VAL ("wrong comp" , m.comp == comp); -if (ext) -TEST_ASSERT_VAL ("wrong ext" , m.ext && !strcmp (ext, m.ext)); -else -TEST_ASSERT_VAL ("wrong ext" , !m.ext); -if (name)TEST_ASSERT_VAL ("wrong name" , m.name && !strcmp (name, m.name));else TEST_ASSERT_VAL ("wrong name" , !m.name);free (m.name); -free (m.ext);return 0 ; }
@@ -45,118 +39,118 @@ static int test_is_kernel_module(const char *path, int cpumode, bool expect)return 0 ; } -#define T (path, an, ae, k, c, n, e) \ - TEST_ASSERT_VAL("failed", !test(path, an, ae, k, c, n, e)) +#define T (path, an, k, c, n) \ + TEST_ASSERT_VAL("failed", !test(path, an, k, c, n))#define M (path, c, e) \ TEST_ASSERT_VAL("failed", !test_is_kernel_module(path, c, e))int test__kmod_path__parse (struct test *t__maybe_unused ,int subtest__maybe_unused ) { -/* path alloc_name alloc_ext kmod comp name ext */ -T ("/xxxx/xxxx/x-x.ko" , true , true , true,0 ,"[x_x]" ,NULL ); -T ("/xxxx/xxxx/x-x.ko" , false , true , true,0 ,NULL ,NULL ); -T ("/xxxx/xxxx/x-x.ko" , true , false , true,0 ,"[x_x]" ,NULL ); -T ("/xxxx/xxxx/x-x.ko" , false , false , true,0 ,NULL ,NULL ); +/* path alloc_name kmod comp name */ +T ("/xxxx/xxxx/x-x.ko" , true , true,0 ,"[x_x]" ); +T ("/xxxx/xxxx/x-x.ko" , false , true,0 ,NULL ); +T ("/xxxx/xxxx/x-x.ko" , true , true,0 ,"[x_x]" ); +T ("/xxxx/xxxx/x-x.ko" , false , true,0 ,NULL );M ("/xxxx/xxxx/x-x.ko" ,PERF_RECORD_MISC_CPUMODE_UNKNOWN , true);M ("/xxxx/xxxx/x-x.ko" ,PERF_RECORD_MISC_KERNEL , true);M ("/xxxx/xxxx/x-x.ko" ,PERF_RECORD_MISC_USER , false);#ifdef HAVE_ZLIB_SUPPORT -/* path alloc_name alloc_ext kmod comp name ext */ -T ("/xxxx/xxxx/x.ko.gz" , true , true , true,1 ,"[x]" ,"gz" ); -T ("/xxxx/xxxx/x.ko.gz" , false , true , true,1 ,NULL ,"gz" ); -T ("/xxxx/xxxx/x.ko.gz" , true , false , true,1 ,"[x]" ,NULL ); -T ("/xxxx/xxxx/x.ko.gz" , false , false , true,1 ,NULL ,NULL ); +/* path alloc_name kmod comp name */ +T ("/xxxx/xxxx/x.ko.gz" , true , true,1 ,"[x]" ); +T ("/xxxx/xxxx/x.ko.gz" , false , true,1 ,NULL ); +T ("/xxxx/xxxx/x.ko.gz" , true , true,1 ,"[x]" ); +T ("/xxxx/xxxx/x.ko.gz" , false , true,1 ,NULL );M ("/xxxx/xxxx/x.ko.gz" ,PERF_RECORD_MISC_CPUMODE_UNKNOWN , true);M ("/xxxx/xxxx/x.ko.gz" ,PERF_RECORD_MISC_KERNEL , true);M ("/xxxx/xxxx/x.ko.gz" ,PERF_RECORD_MISC_USER , false); -/* path alloc_name alloc_ext kmod comp name ext */ -T ("/xxxx/xxxx/x.gz" , true , true , false,1 ,"x.gz" ,"gz" ); -T ("/xxxx/xxxx/x.gz" , false , true , false,1 ,NULL ,"gz" ); -T ("/xxxx/xxxx/x.gz" , true , false , false,1 ,"x.gz" ,NULL ); -T ("/xxxx/xxxx/x.gz" , false , false , false,1 ,NULL ,NULL ); +/* path alloc_name kmod comp name */ +T ("/xxxx/xxxx/x.gz" , true , false,1 ,"x.gz" ); +T ("/xxxx/xxxx/x.gz" , false , false,1 ,NULL ); +T ("/xxxx/xxxx/x.gz" , true , false,1 ,"x.gz" ); +T ("/xxxx/xxxx/x.gz" , false , false,1 ,NULL );M ("/xxxx/xxxx/x.gz" ,PERF_RECORD_MISC_CPUMODE_UNKNOWN , false);M ("/xxxx/xxxx/x.gz" ,PERF_RECORD_MISC_KERNEL , false);M ("/xxxx/xxxx/x.gz" ,PERF_RECORD_MISC_USER , false); -/* path alloc_name alloc_ext kmod comp name ext */ -T ("x.gz" , true , true , false,1 ,"x.gz" ,"gz" ); -T ("x.gz" , false , true , false,1 ,NULL ,"gz" ); -T ("x.gz" , true , false , false,1 ,"x.gz" ,NULL ); -T ("x.gz" , false , false , false,1 ,NULL ,NULL ); +/* path alloc_name kmod comp name */ +T ("x.gz" , true , false,1 ,"x.gz" ); +T ("x.gz" , false , false,1 ,NULL ); +T ("x.gz" , true , false,1 ,"x.gz" ); +T ("x.gz" , false , false,1 ,NULL );M ("x.gz" ,PERF_RECORD_MISC_CPUMODE_UNKNOWN , false);M ("x.gz" ,PERF_RECORD_MISC_KERNEL , false);M ("x.gz" ,PERF_RECORD_MISC_USER , false); -/* path alloc_name alloc_ext kmod comp name ext */ -T ("x.ko.gz" , true , true , true,1 ,"[x]" ,"gz" ); -T ("x.ko.gz" , false , true , true,1 ,NULL ,"gz" ); -T ("x.ko.gz" , true , false , true,1 ,"[x]" ,NULL ); -T ("x.ko.gz" , false , false , true,1 ,NULL ,NULL ); +/* path alloc_name kmod comp name */ +T ("x.ko.gz" , true , true,1 ,"[x]" ); +T ("x.ko.gz" , false , true,1 ,NULL ); +T ("x.ko.gz" , true , true,1 ,"[x]" ); +T ("x.ko.gz" , false , true,1 ,NULL );M ("x.ko.gz" ,PERF_RECORD_MISC_CPUMODE_UNKNOWN , true);M ("x.ko.gz" ,PERF_RECORD_MISC_KERNEL , true);M ("x.ko.gz" ,PERF_RECORD_MISC_USER , false);#endif -/* path alloc_name alloc_ext kmod comp name ext */ -T ("[test_module]" , true , true , true, false,"[test_module]" ,NULL ); -T ("[test_module]" , false , true , true, false,NULL ,NULL ); -T ("[test_module]" , true , false , true, false,"[test_module]" ,NULL ); -T ("[test_module]" , false , false , true, false,NULL ,NULL ); +/* path alloc_name kmod comp name */ +T ("[test_module]" , true , true, false,"[test_module]" ); +T ("[test_module]" , false , true, false,NULL ); +T ("[test_module]" , true , true, false,"[test_module]" ); +T ("[test_module]" , false , true, false,NULL );M ("[test_module]" ,PERF_RECORD_MISC_CPUMODE_UNKNOWN , true);M ("[test_module]" ,PERF_RECORD_MISC_KERNEL , true);M ("[test_module]" ,PERF_RECORD_MISC_USER , false); -/* path alloc_name alloc_ext kmod comp name ext */ -T ("[test.module]" , true , true , true, false,"[test.module]" ,NULL ); -T ("[test.module]" , false , true , true, false,NULL ,NULL ); -T ("[test.module]" , true , false , true, false,"[test.module]" ,NULL ); -T ("[test.module]" , false , false , true, false,NULL ,NULL ); +/* path alloc_name kmod comp name */ +T ("[test.module]" , true , true, false,"[test.module]" ); +T ("[test.module]" , false , true, false,NULL ); +T ("[test.module]" , true , true, false,"[test.module]" ); +T ("[test.module]" , false , true, false,NULL );M ("[test.module]" ,PERF_RECORD_MISC_CPUMODE_UNKNOWN , true);M ("[test.module]" ,PERF_RECORD_MISC_KERNEL , true);M ("[test.module]" ,PERF_RECORD_MISC_USER , false); -/* path alloc_name alloc_ext kmod comp name ext */ -T ("[vdso]" , true , true , false, false,"[vdso]" ,NULL ); -T ("[vdso]" , false , true , false, false,NULL ,NULL ); -T ("[vdso]" , true , false , false, false,"[vdso]" ,NULL ); -T ("[vdso]" , false , false , false, false,NULL ,NULL ); +/* path alloc_name kmod comp name */ +T ("[vdso]" , true , false, false,"[vdso]" ); +T ("[vdso]" , false , false, false,NULL ); +T ("[vdso]" , true , false, false,"[vdso]" ); +T ("[vdso]" , false , false, false,NULL );M ("[vdso]" ,PERF_RECORD_MISC_CPUMODE_UNKNOWN , false);M ("[vdso]" ,PERF_RECORD_MISC_KERNEL , false);M ("[vdso]" ,PERF_RECORD_MISC_USER , false); -T ("[vdso32]" , true , true , false, false,"[vdso32]" ,NULL ); -T ("[vdso32]" , false , true , false, false,NULL ,NULL ); -T ("[vdso32]" , true , false , false, false,"[vdso32]" ,NULL ); -T ("[vdso32]" , false , false , false, false,NULL ,NULL ); +T ("[vdso32]" , true , false, false,"[vdso32]" ); +T ("[vdso32]" , false , false, false,NULL ); +T ("[vdso32]" , true , false, false,"[vdso32]" ); +T ("[vdso32]" , false , false, false,NULL );M ("[vdso32]" ,PERF_RECORD_MISC_CPUMODE_UNKNOWN , false);M ("[vdso32]" ,PERF_RECORD_MISC_KERNEL , false);M ("[vdso32]" ,PERF_RECORD_MISC_USER , false); -T ("[vdsox32]" , true , true , false, false,"[vdsox32]" ,NULL ); -T ("[vdsox32]" , false , true , false, false,NULL ,NULL ); -T ("[vdsox32]" , true , false , false, false,"[vdsox32]" ,NULL ); -T ("[vdsox32]" , false , false , false, false,NULL ,NULL ); +T ("[vdsox32]" , true , false, false,"[vdsox32]" ); +T ("[vdsox32]" , false , false, false,NULL ); +T ("[vdsox32]" , true , false, false,"[vdsox32]" ); +T ("[vdsox32]" , false , false, false,NULL );M ("[vdsox32]" ,PERF_RECORD_MISC_CPUMODE_UNKNOWN , false);M ("[vdsox32]" ,PERF_RECORD_MISC_KERNEL , false);M ("[vdsox32]" ,PERF_RECORD_MISC_USER , false); -/* path alloc_name alloc_ext kmod comp name ext */ -T ("[vsyscall]" , true , true , false, false,"[vsyscall]" ,NULL ); -T ("[vsyscall]" , false , true , false, false,NULL ,NULL ); -T ("[vsyscall]" , true , false , false, false,"[vsyscall]" ,NULL ); -T ("[vsyscall]" , false , false , false, false,NULL ,NULL ); +/* path alloc_name kmod comp name */ +T ("[vsyscall]" , true , false, false,"[vsyscall]" ); +T ("[vsyscall]" , false , false, false,NULL ); +T ("[vsyscall]" , true , false, false,"[vsyscall]" ); +T ("[vsyscall]" , false , false, false,NULL );M ("[vsyscall]" ,PERF_RECORD_MISC_CPUMODE_UNKNOWN , false);M ("[vsyscall]" ,PERF_RECORD_MISC_KERNEL , false);M ("[vsyscall]" ,PERF_RECORD_MISC_USER , false); -/* path alloc_name alloc_ext kmod comp name ext */ -T ("[kernel.kallsyms]" , true , true , false, false,"[kernel.kallsyms]" ,NULL ); -T ("[kernel.kallsyms]" , false , true , false, false,NULL ,NULL ); -T ("[kernel.kallsyms]" , true , false , false, false,"[kernel.kallsyms]" ,NULL ); -T ("[kernel.kallsyms]" , false , false , false, false,NULL ,NULL ); +/* path alloc_name kmod comp name */ +T ("[kernel.kallsyms]" , true , false, false,"[kernel.kallsyms]" ); +T ("[kernel.kallsyms]" , false , false, false,NULL ); +T ("[kernel.kallsyms]" , true , false, false,"[kernel.kallsyms]" ); +T ("[kernel.kallsyms]" , false , false, false,NULL );M ("[kernel.kallsyms]" ,PERF_RECORD_MISC_CPUMODE_UNKNOWN , false);M ("[kernel.kallsyms]" ,PERF_RECORD_MISC_KERNEL , false);M ("[kernel.kallsyms]" ,PERF_RECORD_MISC_USER , false);
tools/perf/util/dso.c +1 -9
@@ -331,7 +331,7 @@ int dso__decompress_kmodule_path(struct dso *dso, const char *name,* Returns 0 if there's no strdup error, -ENOMEM otherwise. */ int __kmod_path__parse (struct kmod_path *m,const char *path, -bool alloc_name,bool alloc_ext) +bool alloc_name) {const char *name =strrchr (path,'/' );const char *ext =strrchr (path,'.' );
@@ -391,14 +391,6 @@ int __kmod_path__parse(struct kmod_path *m, const char *path,strxfrchar (m->name,'-' ,'_' ); } -if (alloc_ext && m->comp) { - m->ext =strdup (ext +4 ); -if (!m->ext) { -free ((void *) m->name); -return -ENOMEM ; - } - } -return 0 ; }
tools/perf/util/dso.h +3 -5
@@ -262,17 +262,15 @@ int dso__decompress_kmodule_path(struct dso *dso, const char *name,struct kmod_path {char *name; -char *ext;int comp;bool kmod; };int __kmod_path__parse (struct kmod_path *m,const char *path, -bool alloc_name,bool alloc_ext); +bool alloc_name); -#define kmod_path__parse (__m, __p) __kmod_path__parse(__m, __p, false, false) -#define kmod_path__parse_name (__m, __p) __kmod_path__parse(__m, __p, true , false) -#define kmod_path__parse_ext (__m, __p) __kmod_path__parse(__m, __p, false, true) +#define kmod_path__parse (__m, __p) __kmod_path__parse(__m, __p, false) +#define kmod_path__parse_name (__m, __p) __kmod_path__parse(__m, __p, true)void dso__set_module_info (struct dso *dso,struct kmod_path *m,struct machine *machine);
Signature · 1 line
2.14.4
Arnaldo Carvalho de Melo
maintainerPATCH 18/21 perf mmap: Store real cpu number in 'struct perf_mmap'
In reply to Arnaldo Carvalho de MeloFrom: Jiri Olsa <[email protected]>
Store the real cpu number in 'struct perf_mmap', which will be used by python interface that allows user to read a particular memory map for given cpu.
--- tools/perf/util/evlist.c | 2 +- tools/perf/util/mmap.c | 3 ++- tools/perf/util/mmap.h | 3 ++- 3 files changed, 5 insertions(+), 3 deletions(-)
tools/perf/util/evlist.c +1 -1
@@ -803,7 +803,7 @@ static int perf_evlist__mmap_per_evsel(struct perf_evlist *evlist, int idx,if (*output ==-1 ) { *output = fd; -if (perf_mmap__mmap (&maps[idx], mp, *output) <0 ) +if (perf_mmap__mmap (&maps[idx], mp, *output, evlist_cpu) <0 )return -1 ; }else {if (ioctl (fd,PERF_EVENT_IOC_SET_OUTPUT , *output) !=0 )
tools/perf/util/mmap.c +2 -1
@@ -164,7 +164,7 @@ void perf_mmap__munmap(struct perf_mmap *map)auxtrace_mmap__munmap (&map->auxtrace_mmap); } -int perf_mmap__mmap (struct perf_mmap *map,struct mmap_params *mp,int fd) +int perf_mmap__mmap (struct perf_mmap *map,struct mmap_params *mp,int fd,int cpu) {/* * The last one will be done at perf_mmap__consume(), so that we
@@ -191,6 +191,7 @@ int perf_mmap__mmap(struct perf_mmap *map, struct mmap_params *mp, int fd)return -1 ; } map->fd = fd; + map->cpu = cpu;if (auxtrace_mmap__mmap (&map->auxtrace_mmap, &mp->auxtrace_mp, map->base, fd))
tools/perf/util/mmap.h +2 -1
@@ -18,6 +18,7 @@ struct perf_mmap {void *base;int mask;int fd; +int cpu;refcount_t refcnt;u64 prev;u64 start;
@@ -60,7 +61,7 @@ struct mmap_params {struct auxtrace_mmap_params auxtrace_mp; }; -int perf_mmap__mmap (struct perf_mmap *map,struct mmap_params *mp,int fd); +int perf_mmap__mmap (struct perf_mmap *map,struct mmap_params *mp,int fd,int cpu);void perf_mmap__munmap (struct perf_mmap *map);void perf_mmap__get (struct perf_mmap *map);
Signature · 1 line
2.14.4
Arnaldo Carvalho de Melo
maintainerPATCH 19/21 perf python: Fix pyrf_evlist__read_on_cpu() interface
In reply to Arnaldo Carvalho de MeloFrom: Jiri Olsa <[email protected]>
Jaroslav reported errors from valgrind over perf python script:
# echo 0 > /sys/devices/system/cpu/cpu4/online # valgrind ./test.py ==7524== Memcheck, a memory error detector ... ==7524== Command: ./test.py ==7524== pid 7526 exited ==7524== Invalid read of size 8 ==7524== at 0xCC2C2B3: perf_mmap__read_forward (evlist.c:780) ==7524== by 0xCC2A681: pyrf_evlist__read_on_cpu (python.c:959) ... ==7524== Address 0x65c4868 is 16 bytes after a block of size 459,36.. ==7524== at 0x4C2B955: calloc (vg_replace_malloc.c:711) ==7524== by 0xCC2F484: zalloc (util.h:35) ==7524== by 0xCC2F484: perf_evlist__alloc_mmap (evlist.c:978) ...
The reason for this is in the python interface, that allows a script to pass arbitrary cpu number, which is then used to access struct perf_evlist::mmap array. That's obviously wrong and works only when if all cpus are available and fails if some cpu is missing, like in the example above.
This patch makes pyrf_evlist__read_on_cpu() search the evlist's maps array for the proper map to access.
It's linear search at the moment. Based on the way how is the read_on_cpu used, I don't think we need to be fast in here. But we could add some hash in the middle to make it fast/er.
We don't allow python interface to set write_backward event attribute, so it's safe to check only evlist's mmaps.
--- tools/perf/util/python.c | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-)
tools/perf/util/python.c +19 -1
@@ -11,6 +11,7 @@#include "cpumap.h" #include "print_binary.h" #include "thread_map.h" +#include "mmap.h" #if PY_MAJOR_VERSION <3 #define _PyUnicode_FromString (arg) \
@@ -976,6 +977,20 @@ static PyObject *pyrf_evlist__add(struct pyrf_evlist *pevlist,return Py_BuildValue ("i" , evlist->nr_entries); } +static struct perf_mmap *get_md (struct perf_evlist *evlist,int cpu) +{ +int i; + +for (i =0 ; i < evlist->nr_mmaps; i++) { +struct perf_mmap *md = &evlist->mmap[i]; + +if (md->cpu == cpu) +return md; + } + +return NULL ; +} +static PyObject *pyrf_evlist__read_on_cpu (struct pyrf_evlist *pevlist,PyObject *args,PyObject *kwargs) {
@@ -990,7 +1005,10 @@ static PyObject *pyrf_evlist__read_on_cpu(struct pyrf_evlist *pevlist, &cpu, &sample_id_all))return NULL ; - md = &evlist->mmap[cpu]; + md =get_md (evlist, cpu); +if (!md) +return NULL ; +if (perf_mmap__read_init (md) <0 ) goto end;
Signature · 1 line
2.14.4
Arnaldo Carvalho de Melo
maintainerPATCH 20/21 tools arch x86: Update tools's copy of cpufeatures.h
In reply to Arnaldo Carvalho de MeloFrom: Arnaldo Carvalho de Melo <[email protected]>
To get the changes in the following csets:
301d328a6f8b ("x86/cpufeatures: Add EPT_AD feature bit") 706d51681d63 ("x86/speculation: Support Enhanced IBRS on future CPUs")
No tools were affected, copy it to silence this perf tool build warning:
Warning: Kernel ABI header at 'tools/arch/x86/include/asm/cpufeatures.h' differs from latest version at 'arch/x86/include/asm/cpufeatures.h' diff -u tools/arch/x86/include/asm/cpufeatures.h arch/x86/include/asm/cpufeatures.h
--- tools/arch/x86/include/asm/cpufeatures.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
tools/arch/x86/include/asm/cpufeatures.h +2 -1
@@ -219,6 +219,7 @@#define X86_FEATURE_IBPB ( 7*32+26)/* Indirect Branch Prediction Barrier */ #define X86_FEATURE_STIBP ( 7*32+27)/* Single Thread Indirect Branch Predictors */ #define X86_FEATURE_ZEN ( 7*32+28)/* "" CPU is AMD family 0x17 (Zen) */ +#define X86_FEATURE_IBRS_ENHANCED ( 7*32+29)/* Enhanced IBRS */ /* Virtualization flags: Linux defined, word 8 */ #define X86_FEATURE_TPR_SHADOW ( 8*32+ 0)/* Intel TPR Shadow */
@@ -229,7 +230,7 @@#define X86_FEATURE_VMMCALL ( 8*32+15)/* Prefer VMMCALL to VMCALL */ #define X86_FEATURE_XENPV ( 8*32+16)/* "" Xen paravirtual guest */ - +#define X86_FEATURE_EPT_AD ( 8*32+17)/* Intel Extended Page Table access-dirty bit */ /* Intel-defined CPU features, CPUID level 0x00000007:0 (EBX), word 9 */ #define X86_FEATURE_FSGSBASE ( 9*32+ 0)/* RDFSBASE, WRFSBASE, RDGSBASE, WRGSBASE instructions*/
Signature · 1 line
2.14.4
Arnaldo Carvalho de Melo
maintainerPATCH 21/21 tools arch: Update arch/x86/lib/memcpy_64.S copy used in 'perf bench mem memcpy'
In reply to Arnaldo Carvalho de MeloFrom: Arnaldo Carvalho de Melo <[email protected]>
To bring in the change made in this cset:
CC /tmp/build/perf/bench/mem-memcpy-x86-64-asm.o LD /tmp/build/perf/bench/perf-in.o LD /tmp/build/perf/perf-in.o LINK /tmp/build/perf/perf
Silencing this perf build warning:
Warning: Kernel ABI header at 'tools/arch/x86/lib/memcpy_64.S' differs from latest version at 'arch/x86/lib/memcpy_64.S' diff -u tools/arch/x86/lib/memcpy_64.S arch/x86/lib/memcpy_64.S
--- tools/arch/x86/lib/memcpy_64.S | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
tools/arch/x86/lib/memcpy_64.S +1 -1
@@ -256,7 +256,7 @@ ENTRY(__memcpy_mcsafe) /* Copy successful. Return zero */ .L_done_memcpy_trap: - xorq %rax, %rax + xorl %eax, %eax ret ENDPROC(__memcpy_mcsafe) EXPORT_SYMBOL_GPL(__memcpy_mcsafe)
Signature · 1 line
2.14.4
Quoted 110 lines · Arnaldo Carvalho de Melo
Hi Ingo,
Please consider pullimg,
- Arnaldo
Test results at the end of this message, as usual.
The following changes since commit
5804b11034a21e4287daaf017c5ad60ad7af8d67:Merge tag 'perf-core-for-mingo-4.19-20180815' of
git://git.kernel.org/pub/scm/linux/kernel/git/acme/linuxinto perf/urgent (2018-08-18 13:11:51 +0200)are available in the Git repository at:
git://git.kernel.org/pub/scm/linux/kernel/git/acme/linux.gittags/perf-core-for-mingo-4.19-20180820for you to fetch changes up to
78303650e4cd873c6c4276c6fe3e768ff0b46d22:tools arch: Update
arch/x86/lib/memcpy_64.Scopy used in 'perf bench mem memcpy' (2018-08-20 10:17:14 -0300)----------------------------------------------------------------
perf/core improvements and fixes:LLVM/clang/eBPF: (Arnaldo Carvalho de Melo)
- Allow passing options to llc in addition to to clang.
Hardware tracing: (Jack Henschel)
- Improve error message for PMU address filters, clarifying availability of that feature in hardware having hardware tracing such as Intel PT.
Python interface: (Jiri Olsa)
- Fix
read_on_cpu()interface.ELF/DWARF libraries: (Jiri Olsa)
- Fix handling of the combo compressed module file + decompressed associated debuginfo file.
Build (Rasmus Villemoes)
- Disable parallelism for 'make clean', avoiding multiple submakes deleting the same files and causing the build to fail on systems such as Yocto.
Kernel ABI copies: (Arnaldo Carvalho de Melo)
- Update tools's copy of x86's
cpufeatures.h.- Update
arch/x86/lib/memcpy_64.Scopy used in 'perf bench mem memcpy'.Miscellaneous: (Steven Rostedt)
- Change libtraceevent to SPDX License format.
Signed-off-by Arnaldo Carvalho de Melo <[email protected]>----------------------------------------------------------------
Arnaldo Carvalho de Melo (3):
perf llvm: Allow passing options to llc in addition to clang
tools arch x86: Update tools's copy ofcpufeatures.h
tools arch: Updatearch/x86/lib/memcpy_64.Scopy used in 'perf bench mem memcpy'Jack Henschel (1):
perf parser: Improve error message for PMU address filtersJiri Olsa (15):
perf tools: Get rid ofdso__needs_decompress()call inread_object_code()perf tools: Get rid ofdso__needs_decompress()call insymbol__disassemble()perf tools: Get rid ofdso__needs_decompress()call in__open_dso()perf tools: Makedecompress_to_file()function static
perf tools: Makeis_supported_compression()static
perf tools: Add compression id into 'structkmod_path'
perf tools: Store compression id into struct dso
perf tools: Use compression id indecompress_kmodule()
perf tools: Move the temp file processing intodecompress_kmoduleperf tools: Addis_compressedcallback to compressions array perf tools: Addlzma_is_compressedfunction
perf tools: Addgzip_is_compressedfunction
perf tools: Remove ext from structkmod_path
perf mmap: Store real cpu number in 'structperf_mmap'
perf python: Fixpyrf_evlist__read_on_cpu()interfaceRasmus Villemoes (1):
perf tools: Disable parallelism for 'make clean'Steven Rostedt (VMware) (1):
tools lib traceevent: Change to SPDX License formattools/arch/x86/include/asm/cpufeatures.h | 3 +- tools/arch/x86/lib/memcpy_64.S | 2 +- tools/lib/traceevent/event-parse.c | 16 +--- tools/lib/traceevent/event-plugin.c | 16 +--- tools/lib/traceevent/event-utils.h | 16 +--- tools/lib/traceevent/kbuffer-parse.c | 17 +--- tools/lib/traceevent/parse-filter.c | 16 +--- tools/lib/traceevent/parse-utils.c | 16 +--- tools/lib/traceevent/trace-seq.c | 16 +--- tools/perf/Makefile | 4 +- tools/perf/tests/code-reading.c | 4 +- tools/perf/tests/kmod-path.c | 136 +++++++++++++++---------------- tools/perf/util/annotate.c | 4 +- tools/perf/util/compress.h | 2 + tools/perf/util/dso.c | 111 ++++++++++++------------- tools/perf/util/dso.h | 13 ++- tools/perf/util/evlist.c | 2 +- tools/perf/util/llvm-utils.c | 31 ++++++- tools/perf/util/llvm-utils.h | 9 ++
Quoted 8 lines
tools/perf/util/lzma.c | 20 +++++ tools/perf/util/machine.c | 4 +- tools/perf/util/mmap.c | 3 +- tools/perf/util/mmap.h | 3 +- tools/perf/util/parse-events.c | 20 ++--- tools/perf/util/python.c | 20 ++++- tools/perf/util/zlib.c | 18 ++++ 26 files changed, 256 insertions(+), 266 deletions(-)
Pulled, thanks a lot Arnaldo!
Ingo