perf/core improvements and fixes
Subsystems (3)
Arnaldo Carvalho de Melo
maintainerHi Ingo,
Please consider pulling, this has those 31 patches that were
blocked due to some problems (author not being the fist S-o-B, build broken on ppc), those issues should all be fixed and then we have 14 patches more, described in the signed tag.
Regards,
- Arnaldo
Test results at the end of this message, as usual.
The following changes since commit 10f354a36f9a9aa1b8bffe0abc1cd43822a85bcd:
perf test: Fix exit code for record+probe_libc_inet_pton.sh (2018-03-16 13:56:31 -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.17-20180319
for you to fetch changes up to 1cd618838b9703eabe4a75badf433382b12f6bef:
perf tests bp_account: Fix build with clang-6 (2018-03-19 13:51:54 -0300)
----------------------------------------------------------------
perf/core improvements and fixes:
- Fixes for problems experienced with new gcc 8 warnings, that treated as errors, broke the build, related to snprintf and casting issues. (Arnaldo Carvalho de Melo, Jiri Olsa, Josh Poinboeuf)
- Fix build of new breakpoint 'perf test' entry with clang < 6, noticed on fedora 25, 26 and 27 (Arnaldo Carvalho de Melo)
- Workaround problem with symbol resolution in 'perf annotate', using the symbol name already present in the objdump output (Arnaldo Carvalho de Melo)
- Document 'perf top --ignore-vmlinux' (Arnaldo Carvalho de Melo)
- Fix out of bounds access on array fd when cnt is 100 in one of the 'perf test' entries, detected using 'cpptest' (Colin Ian King)
- Add support for the forced leader feature, i.e. 'perf report --group' for a group of events not really grouped when scheduled (without using {} to enclose the list of events in the command line) in pipe mode, e.g.:
$ perf record -e cycles,instructions -o - kill | perf report --group -i -
- Use right type to access array elements in 'perf probe' (Masami Hiramatsu)
- Update POWER9 vendor events (those described in JSON format) (Sukadev Bhattiprolu)
- Discard head in overwrite_rb_find_range() (Yisheng Xie)
- Avoid setting 'quiet' to 'true' unnecessarily (Yisheng Xie)
----------------------------------------------------------------
Arnaldo Carvalho de Melo (4):
perf annotate: Use asprintf when formatting objdump command line perf top: Document --ignore-vmlinux
perf annotate: Use ops->target.name when available for unresolved call targets perf tests bp_account: Fix build with clang-6
Colin Ian King (1):
perf tests: Fix out of bounds access on array fd when cnt is 100
Jiri Olsa (4):
perf record: Synthesize features before events in pipe mode perf report: Support forced leader feature in pipe mode perf tools: Fix snprint warnings for gcc 8
perf tools: Fix python extension build for gcc 8
Josh Poimboeuf (1):
objtool, perf: Fix GCC 8 -Wrestrict error
Masami Hiramatsu (1):
perf probe: Use right type to access array elements
Sukadev Bhattiprolu (1):
perf vendor events: Update POWER9 events
Yisheng Xie (2):
perf mmap: Discard head in overwrite_rb_find_range() perf debug: Avoid setting 'quiet' to 'true' unnecessarily
tools/lib/str_error_r.c | 2 +- tools/perf/Documentation/perf-top.txt | 3 + tools/perf/builtin-record.c | 18 +- tools/perf/builtin-report.c | 57 +++-- tools/perf/builtin-script.c | 22 +- .../perf/pmu-events/arch/powerpc/power9/cache.json | 25 --- .../pmu-events/arch/powerpc/power9/frontend.json | 10 - .../pmu-events/arch/powerpc/power9/marked.json | 5 - .../pmu-events/arch/powerpc/power9/memory.json | 5 - .../perf/pmu-events/arch/powerpc/power9/other.json | 241 ++++++++++++++------- .../pmu-events/arch/powerpc/power9/pipeline.json | 50 ++--- tools/perf/pmu-events/arch/powerpc/power9/pmc.json | 5 - .../arch/powerpc/power9/translation.json | 10 +- tools/perf/tests/attr.c | 4 +- tools/perf/tests/bp_account.c | 10 +- tools/perf/tests/mem.c | 2 +- tools/perf/tests/pmu.c | 2 +- tools/perf/util/annotate.c | 20 +- tools/perf/util/cgroup.c | 2 +- tools/perf/util/debug.c | 1 - tools/perf/util/header.c | 11 +- tools/perf/util/mmap.c | 15 +- tools/perf/util/parse-events.c | 4 +- tools/perf/util/pmu.c | 2 +- tools/perf/util/probe-finder.c | 13 +- tools/perf/util/setup.py | 2 + 26 files changed, 298 insertions(+), 243 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.
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.
[root@jouet ~]# time 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:edge : Ok gcc (Alpine 6.4.0) 6.4.0 6 amazonlinux:1 : Ok gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-11) 7 amazonlinux:2 : Ok gcc (GCC) 7.2.1 20170915 (Red Hat 7.2.1-2) 8 android-ndk:r12b-arm : Ok arm-linux-androideabi-gcc (GCC) 4.9.x 20150123 (prerelease) 9 android-ndk:r15c-arm : Ok arm-linux-androideabi-gcc (GCC) 4.9.x 20150123 (prerelease) 10 centos:5 : Ok gcc (GCC) 4.1.2 20080704 (Red Hat 4.1.2-55) 11 centos:6 : Ok gcc (GCC) 4.4.7 20120313 (Red Hat 4.4.7-18) 12 centos:7 : Ok gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-16) 13 debian:7 : Ok gcc (Debian 4.7.2-5) 4.7.2 14 debian:8 : Ok gcc (Debian 4.9.2-10+deb8u1) 4.9.2 15 debian:9 : Ok gcc (Debian 6.3.0-18+deb9u1) 6.3.0 20170516 16 debian:experimental : Ok gcc (Debian 7.2.0-17) 7.2.1 20171205 17 debian:experimental-x-arm64 : Ok aarch64-linux-gnu-gcc (Debian 7.2.0-11) 7.2.0 18 debian:experimental-x-mips : Ok mips-linux-gnu-gcc (Debian 7.2.0-11) 7.2.0 19 debian:experimental-x-mips64 : Ok mips64-linux-gnuabi64-gcc (Debian 7.2.0-11) 7.2.0 20 debian:experimental-x-mipsel : Ok mipsel-linux-gnu-gcc (Debian 7.2.0-11) 7.2.0 21 fedora:20 : Ok gcc (GCC) 4.8.3 20140911 (Red Hat 4.8.3-7) 22 fedora:21 : Ok gcc (GCC) 4.9.2 20150212 (Red Hat 4.9.2-6) 23 fedora:22 : Ok gcc (GCC) 5.3.1 20160406 (Red Hat 5.3.1-6) 24 fedora:23 : Ok gcc (GCC) 5.3.1 20160406 (Red Hat 5.3.1-6) 25 fedora:24 : Ok gcc (GCC) 6.3.1 20161221 (Red Hat 6.3.1-1) 26 fedora:24-x-ARC-uClibc : Ok arc-linux-gcc (ARCompact ISA Linux uClibc toolchain 2017.09-rc2) 7.1.1 20170710 27 fedora:25 : Ok gcc (GCC) 6.4.1 20170727 (Red Hat 6.4.1-1) 28 fedora:26 : Ok gcc (GCC) 7.3.1 20180130 (Red Hat 7.3.1-2) 29 fedora:27 : Ok gcc (GCC) 7.3.1 20180303 (Red Hat 7.3.1-5) 30 fedora:rawhide : Ok gcc (GCC) 8.0.1 20180222 (Red Hat 8.0.1-0.16) 31 gentoo-stage3-amd64:latest : Ok gcc (Gentoo 6.4.0-r1 p1.3) 6.4.0 32 mageia:5 : Ok gcc (GCC) 4.9.2 33 mageia:6 : Ok gcc (Mageia 5.4.0-5.mga6) 5.4.0 34 opensuse:42.1 : Ok gcc (SUSE Linux) 4.8.5 35 opensuse:42.2 : Ok gcc (SUSE Linux) 4.8.5 36 opensuse:42.3 : Ok gcc (SUSE Linux) 4.8.5 37 opensuse:tumbleweed : Ok gcc (SUSE Linux) 7.3.0 38 oraclelinux:6 : Ok gcc (GCC) 4.4.7 20120313 (Red Hat 4.4.7-18) 39 oraclelinux:7 : Ok gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-16.0.3) 40 ubuntu:12.04.5 : Ok gcc (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3 41 ubuntu:14.04.4 : Ok gcc (Ubuntu 4.8.4-2ubuntu1~14.04.3) 4.8.4 42 ubuntu:14.04.4-x-linaro-arm64 : Ok aarch64-linux-gnu-gcc (Linaro GCC 5.4-2017.05) 5.4.1 20170404 43 ubuntu:15.04 : Ok gcc (Ubuntu 4.9.2-10ubuntu13) 4.9.2 44 ubuntu:16.04 : Ok gcc (Ubuntu 5.4.0-6ubuntu1~16.04.5) 5.4.0 20160609 45 ubuntu:16.04-x-arm : Ok arm-linux-gnueabihf-gcc (Ubuntu/Linaro 5.4.0-6ubuntu1~16.04.4) 5.4.0 20160609 46 ubuntu:16.04-x-arm64 : Ok aarch64-linux-gnu-gcc (Ubuntu/Linaro 5.4.0-6ubuntu1~16.04.4) 5.4.0 20160609 47 ubuntu:16.04-x-powerpc : Ok powerpc-linux-gnu-gcc (Ubuntu 5.4.0-6ubuntu1~16.04.4) 5.4.0 20160609 48 ubuntu:16.04-x-powerpc64 : Ok powerpc64-linux-gnu-gcc (Ubuntu/IBM 5.4.0-6ubuntu1~16.04.1) 5.4.0 20160609 49 ubuntu:16.04-x-powerpc64el : Ok powerpc64le-linux-gnu-gcc (Ubuntu/IBM 5.4.0-6ubuntu1~16.04.4) 5.4.0 20160609 50 ubuntu:16.04-x-s390 : Ok s390x-linux-gnu-gcc (Ubuntu 5.4.0-6ubuntu1~16.04.4) 5.4.0 20160609 51 ubuntu:16.10 : Ok gcc (Ubuntu 6.2.0-5ubuntu12) 6.2.0 20161005 52 ubuntu:17.04 : Ok gcc (Ubuntu 6.3.0-12ubuntu2) 6.3.0 20170406 53 ubuntu:17.10 : Ok gcc (Ubuntu 7.2.0-8ubuntu3) 7.2.0 54 ubuntu:18.04 : Ok gcc (Ubuntu 7.2.0-16ubuntu1) 7.2.0
# uname -a Linux jouet 4.16.0-rc5-00086-gdf09348f78dc #1 SMP Fri Mar 16 09:46:40 -03 2018 x86_64 x86_64 x86_64 GNU/Linux # 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 : Skip 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: Use vfs_getname probe to get syscall args filenames : Ok 63: Check open filename arg using perf trace + vfs_getname: Ok 64: probe libc's inet_pton & backtrace it with ping : 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_libelf_O: make NO_LIBELF=1
make_with_clangllvm_O: make LIBCLANGLLVM=1
make_install_prefix_slash_O: make install prefix=/tmp/krava/
make_no_libbpf_O: make NO_LIBBPF=1
make_no_backtrace_O: make NO_BACKTRACE=1
make_minimal_O: make NO_LIBPERL=1 NO_LIBPYTHON=1 NO_NEWT=1 NO_GTK2=1 NO_DEMANGLE=1 NO_LIBELF=1 NO_LIBUNWIND=1 NO_BACKTRACE=1 NO_LIBNUMA=1 NO_LIBAUDIT=1 NO_LIBBIONIC=1 NO_LIBDW_DWARF_UNWIND=1 NO_AUXTRACE=1 NO_LIBBPF=1 NO_LIBCRYPTO=1 NO_SDT=1 NO_JVMTI=1
make_no_slang_O: make NO_SLANG=1
make_no_libnuma_O: make NO_LIBNUMA=1
make_clean_all_O: make clean all
make_util_map_o_O: make util/map.o
make_no_demangle_O: make NO_DEMANGLE=1
make_no_auxtrace_O: make NO_AUXTRACE=1
make_pure_O: make
make_install_bin_O: make install-bin
make_install_O: make install
make_no_libdw_dwarf_unwind_O: make NO_LIBDW_DWARF_UNWIND=1
make_tags_O: make tags
make_install_prefix_O: make install prefix=/tmp/krava
make_no_ui_O: make NO_NEWT=1 NO_SLANG=1 NO_GTK2=1
make_no_libperl_O: make NO_LIBPERL=1
make_no_gtk2_O: make NO_GTK2=1
make_static_O: make LDFLAGS=-static
make_help_O: make help
make_no_newt_O: make NO_NEWT=1
make_debug_O: make DEBUG=1
make_no_libunwind_O: make NO_LIBUNWIND=1
make_with_babeltrace_O: make LIBBABELTRACE=1
make_no_libaudit_O: make NO_LIBAUDIT=1
make_perf_o_O: make perf.o
make_no_scripts_O: make NO_LIBPYTHON=1 NO_LIBPERL=1
make_util_pmu_bison_o_O: make util/pmu-bison.o
make_no_libpython_O: make NO_LIBPYTHON=1
make_doc_O: make doc
OK
make: Leaving directory '/home/acme/git/perf/tools/perf'
$Arnaldo Carvalho de Melo
maintainerPATCH 1/14 perf annotate: Use asprintf when formatting objdump command line
From: Arnaldo Carvalho de Melo <[email protected]>
We were using a local buffer with an arbitrary size, that would have to get increased to avoid truncation as warned by gcc 8:
util/annotate.c: In function 'symbol__disassemble':
util/annotate.c:1488:4: error: '%s' directive output may be truncated writing up to 4095 bytes into a region of size between 3966 and 8086 [-Werror=format-truncation=]
"%s %s%s --start-address=0x%016" PRIx64
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
util/annotate.c:1498:20:
symfs_filename, symfs_filename);
~~~~~~~~~~~~~~
util/annotate.c:1490:50: note: format string is defined here
" -l -d %s %s -C \"%s\" 2>/dev/null|grep -v \"%s:\"|expand",
^~
In file included from /usr/include/stdio.h:861,
from util/color.h:5,
from util/sort.h:8,
from util/annotate.c:14:
/usr/include/bits/stdio2.h:67:10: note: '__builtin___snprintf_chk' output 116 or more bytes (assuming 8331) into a destination of size 8192
return __builtin___snprintf_chk (__s, __n, __USE_FORTIFY_LEVEL - 1,
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
__bos (__s), __fmt, __va_arg_pack ());
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~So switch to asprintf, that will make sure enough space is available.
--- tools/perf/util/annotate.c | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-)
tools/perf/util/annotate.c +12 -5
@@ -1427,7 +1427,7 @@ static int symbol__disassemble(struct symbol *sym, struct annotate_args *args) {struct map *map = args->map;struct dso *dso = map->dso; -char command[PATH_MAX *2 ]; +char *command;FILE *file;char symfs_filename[PATH_MAX ];struct kcore_extract kce;
@@ -1468,7 +1468,7 @@ static int symbol__disassemble(struct symbol *sym, struct annotate_args *args)strcpy (symfs_filename, tmp); } - snprintf(command, sizeof(command), + err = asprintf(&command, "%s %s%s --start-address=0x%016" PRIx64 " --stop-address=0x%016" PRIx64 " -l -d %s %s -C \"%s\" 2>/dev/null|grep -v \"%s:\"|expand",
@@ -1481,12 +1481,17 @@ static int symbol__disassemble(struct symbol *sym, struct annotate_args *args) symbol_conf.annotate_src ?"-S" :"" , symfs_filename, symfs_filename); +if (err <0 ) { +pr_err ("Failure allocating memory for the command to run\n" ); + goto out_remove_tmp; + } +pr_debug ("Executing: %s\n" , command); err =-1 ;if (pipe (stdout_fd) <0 ) {pr_err ("Failure creating the pipe to run %s\n" , command); - goto out_remove_tmp; + goto out_free_command; } pid =fork ();
@@ -1513,7 +1518,7 @@ static int symbol__disassemble(struct symbol *sym, struct annotate_args *args)* If we were using debug info should retry with * original binary. */ - goto out_remove_tmp; + goto out_free_command; } nline =0 ;
@@ -1541,6 +1546,8 @@ static int symbol__disassemble(struct symbol *sym, struct annotate_args *args)fclose (file); err =0 ; +out_free_command: +free (command); out_remove_tmp:close (stdout_fd[0 ]);
@@ -1554,7 +1561,7 @@ static int symbol__disassemble(struct symbol *sym, struct annotate_args *args) out_close_stdout:close (stdout_fd[1 ]); - goto out_remove_tmp; + goto out_free_command; } static void calc_percent(struct sym_hist *hist,
Signature · 1 line
2.14.3
Arnaldo Carvalho de Melo
maintainerPATCH 2/14 perf tests: Fix out of bounds access on array fd when cnt is 100
In reply to Arnaldo Carvalho de MeloFrom: Colin Ian King <[email protected]>
Currently when cnt is 100 an array bounds overflow occurs on the assignment of fd[cnt]. Fix this by performing the bounds check on cnt before writing to fd.
Detected by cppcheck:
tools/perf/tests/bp_account.c:115: (warning) Either the condition 'cnt=100' is redundant or the array 'fd[100]' is accessed at index 100, which is out of bounds.
--- tools/perf/tests/bp_account.c | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-)
tools/perf/tests/bp_account.c +3 -5
@@ -107,16 +107,14 @@ static int detect_cnt(bool is_x)int fd[100 ], cnt =0 , i;while (1 ) { - fd[cnt] =__event (is_x, addr, &attr); - -if (fd[cnt] <0 ) -break ; -if (cnt =100 ) {pr_debug ("way too many debug registers, fix the test\n" );return 0 ; } + fd[cnt] =__event (is_x, addr, &attr); +if (fd[cnt] <0 ) +break ; cnt++; }
Signature · 1 line
2.14.3
Arnaldo Carvalho de Melo
maintainerPATCH 3/14 perf record: Synthesize features before events in pipe mode
In reply to Arnaldo Carvalho de MeloFrom: Jiri Olsa <[email protected]>
We need to synthesize events first, because some features works on top of them (on report side).
--- tools/perf/builtin-record.c | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-)
tools/perf/builtin-record.c +11 -7
@@ -754,13 +754,10 @@ static int record__synthesize(struct record *rec, bool tail)return 0 ;if (data->is_pipe) { - err =perf_event__synthesize_features ( - tool, session, rec->evlist, process_synthesized_event); -if (err <0 ) { -pr_err ("Couldn't synthesize features.\n" ); -return err; - } - +/* +* We need to synthesize events first, because some +* features works on top of them (on report side). +*/ err =perf_event__synthesize_attrs (tool, session, process_synthesized_event);if (err <0 ) {
@@ -768,6 +765,13 @@ static int record__synthesize(struct record *rec, bool tail) goto out; } + err =perf_event__synthesize_features (tool, session, rec->evlist, + process_synthesized_event); +if (err <0 ) { +pr_err ("Couldn't synthesize features.\n" ); +return err; + } +if (have_tracepoints (&rec->evlist->entries)) {/* * FIXME err <= 0 here actually means that
Signature · 1 line
2.14.3
Arnaldo Carvalho de Melo
maintainerPATCH 4/14 perf report: Support forced leader feature in pipe mode
In reply to Arnaldo Carvalho de MeloFrom: Jiri Olsa <[email protected]>
Stephane reported a problem with forced leader in pipe mode, where report does not force the group output. The reason is that we don't force the leader in pipe mode.
This patch adds HEADER_LAST_FEATURE mark to have a point where we have all events and features received, and force the group if requested.
$ perf record --group -e '{cycles, instructions}' -o - kill | perf report -i - --groupSNIP
# Overhead Command Shared Object Symbol
# ................ ....... ................ .......................
#
28.36% 0.00% kill libc-2.25.so [.] __unregister_atfork
26.32% 0.00% kill libc-2.25.so [.] _dl_addr
26.10% 0.00% kill ld-2.25.so [.] _dl_relocate_object
17.32% 0.00% kill ld-2.25.so [.] __tunables_init
1.70% 0.01% kill [unknown] [k] 0xffffffffafa01a40
0.20% 0.00% kill ld-2.25.so [.] _start
0.00% 48.77% kill ld-2.25.so [.] do_lookup_x
0.00% 42.97% kill libc-2.25.so [.] _IO_getline
0.00% 6.35% kill ld-2.25.so [.] strcmp
0.00% 1.71% kill ld-2.25.so [.] _dl_sysdep_start
0.00% 0.19% kill ld-2.25.so [.] _dl_start--- tools/perf/builtin-report.c | 57 ++++++++++++++++++++++++++++++++++----------- tools/perf/util/header.c | 11 ++++++++- 2 files changed, 53 insertions(+), 15 deletions(-)
tools/perf/builtin-report.c +43 -14
@@ -68,6 +68,7 @@ struct report {bool header;bool header_only;bool nonany_branch_mode; +bool group_set;int max_stack;struct perf_read_values show_threads_values;const char *pretty_printing_style;
@@ -193,6 +194,45 @@ static int hist_iter__branch_callback(struct hist_entry_iter *iter,return err; } +/* +* Events in data file are not collect in groups, but we still want +* the group display. Set the artificial group and set the leader's +* forced_leader flag to notify the display code. +*/ +static void setup_forced_leader (struct report *report, +struct perf_evlist *evlist) +{ +if (report->group_set && !evlist->nr_groups) { +struct perf_evsel *leader =perf_evlist__first (evlist); + +perf_evlist__set_leader (evlist); + leader->forced_leader = true; + } +} + +static int process_feature_event (struct perf_tool *tool, +union perf_event *event, +struct perf_session *session__maybe_unused ) +{ + struct report *rep = container_of(tool, struct report, tool); + +if (event->feat.feat_id <HEADER_LAST_FEATURE ) +return perf_event__process_feature (tool, event, session); + +if (event->feat.feat_id !=HEADER_LAST_FEATURE ) { +pr_err ("failed: wrong feature ID: %" PRIu64"\n" , + event->feat.feat_id); +return -1 ; + } + +/* +* All features are received, we can force the +* group if needed. +*/ +setup_forced_leader (rep, session->evlist); +return 0 ; +} + static int process_sample_event(struct perf_tool *tool, union perf_event *event, struct perf_sample *sample,
@@ -940,7 +980,6 @@ int cmd_report(int argc, const char **argv)"perf report [<options>]" ,NULL }; -bool group_set = false;struct report report = { .tool = { .sample = process_sample_event,
@@ -958,7 +997,7 @@ int cmd_report(int argc, const char **argv) .id_index = perf_event__process_id_index, .auxtrace_info = perf_event__process_auxtrace_info, .auxtrace = perf_event__process_auxtrace, - .feature = perf_event__process_feature, + .feature = process_feature_event, .ordered_events = true, .ordering_requires_timestamps = true, },
@@ -1060,7 +1099,7 @@ int cmd_report(int argc, const char **argv) "Specify disassembler style (e.g. -M intel for intel syntax)"),OPT_BOOLEAN (0 ,"show-total-period" , &symbol_conf.show_total_period,"Show a column with the sum of periods" ), -OPT_BOOLEAN_SET (0 ,"group" , &symbol_conf.event_group, &group_set, +OPT_BOOLEAN_SET (0 ,"group" , &symbol_conf.event_group, &report.group_set,"Show event group information together" ), OPT_CALLBACK_NOOPT('b', "branch-stack", &branch_mode, "", "use branch records for per branch histogram filling",
@@ -1177,17 +1216,7 @@ int cmd_report(int argc, const char **argv) has_br_stack =perf_header__has_feat (&session->header,HEADER_BRANCH_STACK ); -/* -* Events in data file are not collect in groups, but we still want -* the group display. Set the artificial group and set the leader's -* forced_leader flag to notify the display code. -*/ -if (group_set && !session->evlist->nr_groups) { -struct perf_evsel *leader =perf_evlist__first (session->evlist); - -perf_evlist__set_leader (session->evlist); - leader->forced_leader = true; - } +setup_forced_leader (&report, session->evlist);if (itrace_synth_opts.last_branch) has_br_stack = true;
tools/perf/util/header.c +10 -1
@@ -3415,8 +3415,17 @@ int perf_event__synthesize_features(struct perf_tool *tool,return ret; } } + +/* Send HEADER_LAST_FEATURE mark. */ + fe = ff.buf; + fe->feat_id =HEADER_LAST_FEATURE ; + fe->header.type =PERF_RECORD_HEADER_FEATURE ; + fe->header.size =sizeof (*fe); + + ret =process (tool, ff.buf,NULL ,NULL ); +free (ff.buf); -return 0 ; +return ret; } int perf_event__process_feature(struct perf_tool *tool,
Signature · 1 line
2.14.3
Arnaldo Carvalho de Melo
maintainerPATCH 5/14 perf vendor events: Update POWER9 events
In reply to Arnaldo Carvalho de MeloFrom: Sukadev Bhattiprolu <[email protected]>
--- .../perf/pmu-events/arch/powerpc/power9/cache.json | 25 --- .../pmu-events/arch/powerpc/power9/frontend.json | 10 - .../pmu-events/arch/powerpc/power9/marked.json | 5 - .../pmu-events/arch/powerpc/power9/memory.json | 5 - .../perf/pmu-events/arch/powerpc/power9/other.json | 241 ++++++++++++++------- .../pmu-events/arch/powerpc/power9/pipeline.json | 50 ++--- tools/perf/pmu-events/arch/powerpc/power9/pmc.json | 5 - .../arch/powerpc/power9/translation.json | 10 +- 8 files changed, 178 insertions(+), 173 deletions(-)
tools/perf/pmu-events/arch/powerpc/power9/cache.json +0 -25
@@ -19,11 +19,6 @@ "EventName": "PM_CMPLU_STALL_FXU", "BriefDescription": "Finish stall due to a scalar fixed point or CR instruction in the execution pipeline. These instructions get routed to the ALU, ALU2, and DIV pipes" }, - {, - "EventCode": "0x1D15C", - "EventName": "PM_MRK_DTLB_MISS_1G", - "BriefDescription": "Marked Data TLB reload (after a miss) page size 2M. Implies radix translation was used" - }, {, "EventCode": "0x4D12A", "EventName": "PM_MRK_DATA_FROM_RL4_CYC",
@@ -79,21 +74,6 @@ "EventName": "PM_THRESH_EXC_4096", "BriefDescription": "Threshold counter exceed a count of 4096" }, - {, - "EventCode": "0x3D156", - "EventName": "PM_MRK_DTLB_MISS_64K", - "BriefDescription": "Marked Data TLB Miss page size 64K" - }, - {, - "EventCode": "0x4C15E", - "EventName": "PM_MRK_DTLB_MISS_16M", - "BriefDescription": "Marked Data TLB Miss page size 16M" - }, - {, - "EventCode": "0x2D15E", - "EventName": "PM_MRK_DTLB_MISS_16G", - "BriefDescription": "Marked Data TLB Miss page size 16G" - }, {, "EventCode": "0x3F14A", "EventName": "PM_MRK_DPTEG_FROM_RMEM",
@@ -123,10 +103,5 @@ "EventCode": "0x1002A", "EventName": "PM_CMPLU_STALL_LARX", "BriefDescription": "Finish stall because the NTF instruction was a larx waiting to be satisfied" - }, - {, - "EventCode": "0x1C058", - "EventName": "PM_DTLB_MISS_16G", - "BriefDescription": "Data TLB Miss page size 16G" } ]
tools/perf/pmu-events/arch/powerpc/power9/frontend.json +0 -10
@@ -154,11 +154,6 @@ "EventName": "PM_MRK_DATA_FROM_RL2L3_SHR_CYC", "BriefDescription": "Duration in cycles to reload with Shared (S) data from another chip's L2 or L3 on the same Node or Group (Remote), as this chip due to a marked load" }, - {, - "EventCode": "0x3C056", - "EventName": "PM_DTLB_MISS_64K", - "BriefDescription": "Data TLB Miss page size 64K" - }, {, "EventCode": "0x30060", "EventName": "PM_TM_TRANS_RUN_INST",
@@ -344,11 +339,6 @@ "EventName": "PM_MRK_LARX_FIN", "BriefDescription": "Larx finished" }, - {, - "EventCode": "0x4C056", - "EventName": "PM_DTLB_MISS_16M", - "BriefDescription": "Data TLB Miss page size 16M" - }, {, "EventCode": "0x1003A", "EventName": "PM_CMPLU_STALL_LSU_FIN",
tools/perf/pmu-events/arch/powerpc/power9/marked.json +0 -5
@@ -529,11 +529,6 @@ "EventName": "PM_L1_ICACHE_RELOADED_ALL", "BriefDescription": "Counts all Icache reloads includes demand, prefetch, prefetch turned into demand and demand turned into prefetch" }, - {, - "EventCode": "0x4003C", - "EventName": "PM_DISP_HELD_SYNC_HOLD", - "BriefDescription": "Cycles in which dispatch is held because of a synchronizing instruction in the pipeline" - }, {, "EventCode": "0x3003C", "EventName": "PM_CMPLU_STALL_NESTED_TEND",
tools/perf/pmu-events/arch/powerpc/power9/memory.json +0 -5
@@ -44,11 +44,6 @@ "EventName": "PM_LD_CMPL", "BriefDescription": "count of Loads completed" }, - {, - "EventCode": "0x2D156", - "EventName": "PM_MRK_DTLB_MISS_4K", - "BriefDescription": "Marked Data TLB Miss page size 4k" - }, {, "EventCode": "0x4C042", "EventName": "PM_DATA_FROM_L3",
tools/perf/pmu-events/arch/powerpc/power9/other.json +158 -83
618 lines not on this page · raw message
tools/perf/pmu-events/arch/powerpc/power9/pipeline.json +15 -35
110 lines not on this page · raw message
tools/perf/pmu-events/arch/powerpc/power9/pmc.json +0 -5
@@ -9,11 +9,6 @@ "EventName": "PM_MEM_LOC_THRESH_LSU_HIGH", "BriefDescription": "Local memory above threshold for LSU medium" }, - {, - "EventCode": "0x2C056", - "EventName": "PM_DTLB_MISS_4K", - "BriefDescription": "Data TLB Miss page size 4k" - }, {, "EventCode": "0x40118", "EventName": "PM_MRK_DCACHE_RELOAD_INTV",
tools/perf/pmu-events/arch/powerpc/power9/translation.json +5 -5
@@ -29,11 +29,6 @@ "EventName": "PM_ST_FIN", "BriefDescription": "Store finish count. Includes speculative activity" }, - {, - "EventCode": "0x44042", - "EventName": "PM_INST_FROM_L3", - "BriefDescription": "The processor's Instruction cache was reloaded from local core's L3 due to an instruction fetch (not prefetch)" - }, {, "EventCode": "0x1504A", "EventName": "PM_IPTEG_FROM_RL2L3_SHR",
@@ -124,6 +119,11 @@ "EventName": "PM_PMC1_SAVED", "BriefDescription": "PMC1 Rewind Value saved" }, + {, + "EventCode": "0x44042", + "EventName": "PM_INST_FROM_L3", + "BriefDescription": "The processor's Instruction cache was reloaded from local core's L3 due to an instruction fetch (not prefetch)" + }, {, "EventCode": "0x200FE", "EventName": "PM_DATA_FROM_L2MISS",
Signature · 1 line
2.14.3
Arnaldo Carvalho de Melo
maintainerPATCH 6/14 perf mmap: Discard head in overwrite_rb_find_range()
In reply to Arnaldo Carvalho de MeloFrom: Yisheng Xie <[email protected]>
In overwrite mode, start will be set to head in perf_mmap__read_init(). Therefore, there is no need to set the start one more time in overwrite_rb_find_range() and *start can be used as head instead of passing head to overwrite_rb_find_range().
--- tools/perf/util/mmap.c | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-)
tools/perf/util/mmap.c +7 -8
@@ -199,19 +199,18 @@ int perf_mmap__mmap(struct perf_mmap *map, struct mmap_params *mp, int fd)return 0 ; } -static int overwrite_rb_find_range (void *buf,int mask,u64 head,u64 *start,u64 *end) +static int overwrite_rb_find_range (void *buf,int mask,u64 *start,u64 *end) {struct perf_event_header *pheader; -u64 evt_head = head; +u64 evt_head = *start;int size = mask +1 ; -pr_debug2 ("overwrite_rb_find_range: buf=%p, head=%" PRIx64"\n" , buf, head); - pheader = (struct perf_event_header *)(buf + (head & mask)); - *start = head; +pr_debug2 ("%s: buf=%p, start=%" PRIx64"\n" , __func__, buf, *start); + pheader = (struct perf_event_header *)(buf + (*start & mask));while (true) { -if (evt_head - head >= (unsigned int )size) { +if (evt_head - *start >= (unsigned int )size) {pr_debug ("Finished reading overwrite ring buffer: rewind\n" ); -if (evt_head - head > (unsigned int )size) +if (evt_head - *start > (unsigned int )size) evt_head -= pheader->size; *end = evt_head;return 0 ;
@@ -262,7 +261,7 @@ int perf_mmap__read_init(struct perf_mmap *md)* Backward ring buffer is full. We still have a chance to read * most of data from it. */ -if (overwrite_rb_find_range (data, md->mask, head, &md->start, &md->end)) +if (overwrite_rb_find_range (data, md->mask, &md->start, &md->end))return -EINVAL ; }
Signature · 1 line
2.14.3
Arnaldo Carvalho de Melo
maintainerPATCH 7/14 perf debug: Avoid setting 'quiet' to 'true' unnecessarily
In reply to Arnaldo Carvalho de MeloFrom: Yisheng Xie <[email protected]>
When using --quiet to disable messages, we will set the 'quiet' variable to 'true' first, then check that variable to decide whether we need to call perf_quiet_option(), so no need to set 'quiet' to 'true' once more in perf_quiet_option().
--- tools/perf/util/debug.c | 1 - 1 file changed, 1 deletion(-)
tools/perf/util/debug.c +0 -1
@@ -232,7 +232,6 @@ int perf_quiet_option(void) var++; } - quiet = true;return 0 ; }
Signature · 1 line
2.14.3
Arnaldo Carvalho de Melo
maintainerPATCH 8/14 perf tools: Fix snprint warnings for gcc 8
In reply to Arnaldo Carvalho de MeloFrom: Jiri Olsa <[email protected]>
With gcc 8 we get new set of snprintf() warnings that breaks the compilation, one example:
tests/mem.c: In function ‘check’:
tests/mem.c:19:48: error: ‘%s’ directive output may be truncated writing \
up to 99 bytes into a region of size 89 [-Werror=format-truncation=]
snprintf(failure, sizeof failure, "unexpected %s", out);
The gcc docs says:
To avoid the warning either use a bigger buffer or handle the function's return value which indicates whether or not its output has been truncated.
Given that all these warnings are harmless, because the code either properly fails due to uncomplete file path or we don't care for truncated output at all, I'm changing all those snprintf() calls to scnprintf(), which actually 'checks' for the snprint return value so the gcc stays silent.
--- tools/perf/builtin-script.c | 22 +++++++++++----------- tools/perf/tests/attr.c | 4 ++-- tools/perf/tests/mem.c | 2 +- tools/perf/tests/pmu.c | 2 +- tools/perf/util/cgroup.c | 2 +- tools/perf/util/parse-events.c | 4 ++-- tools/perf/util/pmu.c | 2 +- 7 files changed, 19 insertions(+), 19 deletions(-)
tools/perf/builtin-script.c +11 -11
@@ -2674,8 +2674,8 @@ static int list_available_scripts(const struct option *opt __maybe_unused, }for_each_lang (scripts_path, scripts_dir, lang_dirent) { -snprintf (lang_path,MAXPATHLEN ,"%s/%s/bin" , scripts_path, - lang_dirent->d_name); +scnprintf (lang_path,MAXPATHLEN ,"%s/%s/bin" , scripts_path, + lang_dirent->d_name); lang_dir =opendir (lang_path);if (!lang_dir)continue ;
@@ -2684,8 +2684,8 @@ static int list_available_scripts(const struct option *opt __maybe_unused, script_root =get_script_root (script_dirent,REPORT_SUFFIX );if (script_root) { desc =script_desc__findnew (script_root); -snprintf (script_path,MAXPATHLEN ,"%s/%s" , - lang_path, script_dirent->d_name); +scnprintf (script_path,MAXPATHLEN ,"%s/%s" , + lang_path, script_dirent->d_name);read_script_info (desc, script_path);free (script_root); }
@@ -2721,7 +2721,7 @@ static int check_ev_match(char *dir_name, char *scriptname,int match, len;FILE *fp; -sprintf (filename,"%s/bin/%s-record" , dir_name, scriptname); +scnprintf (filename,MAXPATHLEN ,"%s/bin/%s-record" , dir_name, scriptname); fp =fopen (filename,"r" );if (!fp)
@@ -2799,8 +2799,8 @@ int find_scripts(char **scripts_array, char **scripts_path_array) }for_each_lang (scripts_path, scripts_dir, lang_dirent) { -snprintf (lang_path,MAXPATHLEN ,"%s/%s" , scripts_path, - lang_dirent->d_name); +scnprintf (lang_path,MAXPATHLEN ,"%s/%s" , scripts_path, + lang_dirent->d_name);#ifdef NO_LIBPERL if (strstr (lang_path,"perl" ))continue ;
@@ -2855,8 +2855,8 @@ static char *get_script_path(const char *script_root, const char *suffix)return NULL ;for_each_lang (scripts_path, scripts_dir, lang_dirent) { -snprintf (lang_path,MAXPATHLEN ,"%s/%s/bin" , scripts_path, - lang_dirent->d_name); +scnprintf (lang_path,MAXPATHLEN ,"%s/%s/bin" , scripts_path, + lang_dirent->d_name); lang_dir =opendir (lang_path);if (!lang_dir)continue ;
@@ -2867,8 +2867,8 @@ static char *get_script_path(const char *script_root, const char *suffix)free (__script_root);closedir (lang_dir);closedir (scripts_dir); -snprintf (script_path,MAXPATHLEN ,"%s/%s" , - lang_path, script_dirent->d_name); +scnprintf (script_path,MAXPATHLEN ,"%s/%s" , + lang_path, script_dirent->d_name);return strdup (script_path); }free (__script_root);
tools/perf/tests/attr.c +2 -2
@@ -170,8 +170,8 @@ static int run_dir(const char *d, const char *perf)if (verbose >0 ) vcnt++; -snprintf (cmd,3 *PATH_MAX ,PYTHON " %s/attr.py -d %s/attr/ -p %s %.*s" , - d, d, perf, vcnt, v); +scnprintf (cmd,3 *PATH_MAX ,PYTHON " %s/attr.py -d %s/attr/ -p %s %.*s" , + d, d, perf, vcnt, v);return system (cmd) ?TEST_FAIL :TEST_OK ; }
tools/perf/tests/mem.c +1 -1
@@ -16,7 +16,7 @@ static int check(union perf_mem_data_src data_src, n =perf_mem__snp_scnprintf (out,sizeof out, &mi); n +=perf_mem__lvl_scnprintf (out + n,sizeof out - n, &mi); -snprintf (failure,sizeof failure,"unexpected %s" , out); +scnprintf (failure,sizeof failure,"unexpected %s" , out);TEST_ASSERT_VAL (failure, !strcmp (string, out));return 0 ; }
tools/perf/tests/pmu.c +1 -1
@@ -98,7 +98,7 @@ static char *test_format_dir_get(void)struct test_format *format = &test_formats[i];FILE *file; -snprintf (name,PATH_MAX ,"%s/%s" , dir, format->name); +scnprintf (name,PATH_MAX ,"%s/%s" , dir, format->name); file =fopen (name,"w" );if (!file)
tools/perf/util/cgroup.c +1 -1
@@ -81,7 +81,7 @@ static int open_cgroup(const char *name)if (cgroupfs_find_mountpoint (mnt,PATH_MAX +1 ))return -1 ; -snprintf (path,PATH_MAX ,"%s/%s" , mnt, name); +scnprintf (path,PATH_MAX ,"%s/%s" , mnt, name); fd =open (path,O_RDONLY );if (fd ==-1 )
tools/perf/util/parse-events.c +2 -2
@@ -206,8 +206,8 @@ struct tracepoint_path *tracepoint_id_to_path(u64 config)for_each_event (sys_dirent, evt_dir, evt_dirent) { -snprintf (evt_path,MAXPATHLEN ,"%s/%s/id" , dir_path, - evt_dirent->d_name); +scnprintf (evt_path,MAXPATHLEN ,"%s/%s/id" , dir_path, + evt_dirent->d_name); fd =open (evt_path,O_RDONLY );if (fd <0 )continue ;
tools/perf/util/pmu.c +1 -1
@@ -351,7 +351,7 @@ static int pmu_aliases_parse(char *dir, struct list_head *head)if (pmu_alias_info_file (name))continue ; -snprintf (path,PATH_MAX ,"%s/%s" , dir, name); +scnprintf (path,PATH_MAX ,"%s/%s" , dir, name); file =fopen (path,"r" );if (!file) {
Signature · 1 line
2.14.3
Arnaldo Carvalho de Melo
maintainerPATCH 9/14 perf tools: Fix python extension build for gcc 8
In reply to Arnaldo Carvalho de MeloFrom: Jiri Olsa <[email protected]>
The gcc 8 compiler won't compile the python extension code with the following errors (one example):
python.c:830:15: error: cast between incompatible function types from \
‘PyObject * (*)(struct pyrf_evsel *, PyObject *, PyObject *)’ \
uct _object * (*)(struct pyrf_evsel *, struct _object *, struct _object *)’} to \
‘PyObject * (*)(PyObject *, PyObject *)’ {aka ‘struct _object * (*)(struct _objeuct \
_object *)’} [-Werror=cast-function-type]
.ml_meth = (PyCFunction)pyrf_evsel__open,The problem with the PyMethodDef::ml_meth callback is that its type is determined based on the PyMethodDef::ml_flags value, which we set as METH_VARARGS | METH_KEYWORDS.
That indicates that the callback is expecting an extra PyObject* arg, and is actually PyCFunctionWithKeywords type, but the base PyMethodDef::ml_meth type stays PyCFunction.
Previous gccs did not find this, gcc8 now does. Fixing this by silencing this warning for python.c build.
Commiter notes:
Do not do that for CC=clang, as it breaks the build in some clang versions, like the ones in fedora up to fedora27:
fedora:25:error: unknown warning option '-Wno-cast-function-type'; did you mean '-Wno-bad-function-cast'? [-Werror,-Wunknown-warning-option] fedora:26:error: unknown warning option '-Wno-cast-function-type'; did you mean '-Wno-bad-function-cast'? [-Werror,-Wunknown-warning-option] fedora:27:error: unknown warning option '-Wno-cast-function-type'; did you mean '-Wno-bad-function-cast'? [-Werror,-Wunknown-warning-option] #
those have:
clang version 3.9.1 (tags/RELEASE_391/final)
The one in rawhide accepts that:
clang version 6.0.0 (tags/RELEASE_600/final)
--- tools/perf/util/setup.py | 2 ++ 1 file changed, 2 insertions(+)
tools/perf/util/setup.py +2 -0
@@ -28,6 +28,8 @@ 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' ] +if cc != "clang": + cflags += ['-Wno-cast-function-type' ] src_perf = getenv('srctree') + '/tools/perf' build_lib = getenv('PYTHON_EXTBUILD_LIB')
Signature · 1 line
2.14.3
Arnaldo Carvalho de Melo
maintainerPATCH 10/14 perf top: Document --ignore-vmlinux
In reply to Arnaldo Carvalho de MeloFrom: Arnaldo Carvalho de Melo <[email protected]>
We've had this since 2013, document it.
--- tools/perf/Documentation/perf-top.txt | 3 +++ 1 file changed, 3 insertions(+)
tools/perf/Documentation/perf-top.txt +3 -0
@@ -67,6 +67,9 @@ Default is to monitor all CPUS. --vmlinux=<path>:: Path to vmlinux. Required for annotation functionality. +--ignore-vmlinux:: + Ignore vmlinux files. + -m <pages>:: --mmap-pages=<pages>:: Number of mmap data pages (must be a power of two) or size
Signature · 1 line
2.14.3
Arnaldo Carvalho de Melo
maintainerPATCH 11/14 perf annotate: Use ops->target.name when available for unresolved call targets
In reply to Arnaldo Carvalho de MeloFrom: Arnaldo Carvalho de Melo <[email protected]>
There is a bug where when using 'perf annotate timerqueue_add' the target for its only routine called with the 'callq' instruction, 'rb_insert_color', doesn't get resolved from its address when parsing that 'callq' instruction.
That symbol resolution works when using 'perf report --tui' and then doing annotation for 'timerqueue_add' from there, the vmlinux dso->symbols rb_tree somehow gets in a state that we can't find that address, that is a bug that has to be further investigated.
But since the objdump output has the function name, i.e. the raw objdump disassembled line looks like:
So, before:
# perf annotate timerqueue_add
│ mov %rbx,%rdi
│ mov %rbx,(%rdx)
│ → callq *ffffffff8184dc80
│ mov 0x8(%rbp),%rdx
│ test %rdx,%rdx
│ ↓ je 67# perf report
│ mov %rbx,%rdi
│ mov %rbx,(%rdx)
│ → callq rb_insert_color
│ mov 0x8(%rbp),%rdx
│ test %rdx,%rdx
│ ↓ je 67And after both look the same:
# perf annotate timerqueue_add
│ mov %rbx,%rdi
│ mov %rbx,(%rdx)
│ → callq rb_insert_color
│ mov 0x8(%rbp),%rdx
│ test %rdx,%rdx
│ ↓ je 67From 'perf report' one can annotate and navigate to that 'rb_insert_color' function, but not directly from 'perf annotate timerqueue_add', that remains to be investigated and fixed.
--- tools/perf/util/annotate.c | 3 +++ 1 file changed, 3 insertions(+)
tools/perf/util/annotate.c +3 -0
@@ -238,6 +238,9 @@ static int call__scnprintf(struct ins *ins, char *bf, size_t size,if (ops->target.addr ==0 )return ins__raw_scnprintf (ins, bf, size, ops); +if (ops->target.name) +return scnprintf (bf, size,"%-6s %s" , ins->name, ops->target.name); +return scnprintf (bf, size,"%-6s *%" PRIx64, ins->name, ops->target.addr); }
Signature · 1 line
2.14.3
Arnaldo Carvalho de Melo
maintainerPATCH 12/14 perf probe: Use right type to access array elements
In reply to Arnaldo Carvalho de MeloFrom: Masami Hiramatsu <[email protected]>
Current 'perf probe' converts the type of array-elements incorrectly. It always converts the types as a pointer of array. This passes the "array" type DIE to the type converter so that it can get correct "element of array" type DIE from it.
E.g.
====
$ cat hello.c #include <stdio.h>
void foo(int a[])
{
printf("%d\n", a[1]);}
void main()
{
int a[3] = {4, 5, 6};
printf("%d\n", a[0]);
foo(a);}
$ gcc -g hello.c -o hello $ perf probe -x ./hello -D "foo a[1]" ====
Without this fix, above outputs
====
p:probe_hello/foo /tmp/hello:0x4d3 a=+4(-8(%bp)):u64
====
The "u64" means "int *", but a[1] is "int".
With this,
====
p:probe_hello/foo /tmp/hello:0x4d3 a=+4(-8(%bp)):s32
====
So, "int" correctly converted to "s32"
--- tools/perf/util/probe-finder.c | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-)
tools/perf/util/probe-finder.c +5 -8
@@ -423,20 +423,20 @@ static int convert_variable_fields(Dwarf_Die *vr_die, const char *varname,pr_warning ("Failed to get the type of %s.\n" , varname);return -ENOENT ; } -pr_debug2 ("Var real type: (%x)\n" , (unsigned )dwarf_dieoffset (&type)); +pr_debug2 ("Var real type: %s (%x)\n" ,dwarf_diename (&type), + (unsigned )dwarf_dieoffset (&type)); tag =dwarf_tag (&type);if (field->name[0 ] =='[' && (tag == DW_TAG_array_type || tag == DW_TAG_pointer_type)) { -if (field->next) -/* Save original type for next field */ -memcpy (die_mem, &type,sizeof (*die_mem)); +/* Save original type for next field or type */ +memcpy (die_mem, &type,sizeof (*die_mem));/* Get the type of this array */ if (die_get_real_type (&type, &type) ==NULL ) {pr_warning ("Failed to get the type of %s.\n" , varname);return -ENOENT ; } -pr_debug2 ("Array real type: (%x)\n" , +pr_debug2 ("Array real type: %s (%x)\n" ,dwarf_diename (&type), (unsigned )dwarf_dieoffset (&type));if (tag == DW_TAG_pointer_type) { ref =zalloc (sizeof (struct probe_trace_arg_ref ));
@@ -448,9 +448,6 @@ static int convert_variable_fields(Dwarf_Die *vr_die, const char *varname, *ref_ptr = ref; } ref->offset +=dwarf_bytesize (&type) * field->index; -if (!field->next) -/* Save vr_die for converting types */ -memcpy (die_mem, vr_die,sizeof (*die_mem)); goto next; }else if (tag == DW_TAG_pointer_type) {/* Check the pointer and dereference */
Signature · 6 lines
2.14.3 -- To unsubscribe from this list: send the line "unsubscribe linux-kselftest" in the body of a message to majordomo at vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Arnaldo Carvalho de Melo
maintainerPATCH 13/14 objtool, perf: Fix GCC 8 -Wrestrict error
In reply to Arnaldo Carvalho de MeloFrom: Josh Poimboeuf <[email protected]>
Starting with recent GCC 8 builds, objtool and perf fail to build with the following error:
../str_error_r.c: In function ‘str_error_r’:
../str_error_r.c:25:3: error: passing argument 1 to restrict-qualified parameter aliases with argument 5 [-Werror=restrict]
snprintf(buf, buflen, "INTERNAL ERROR: strerror_r(%d, %p, %zd)=%d", errnum, buf, buflen, err);
The code seems harmless, but there's probably no benefit in printing the 'buf' pointer in this situation anyway, so just remove it to make GCC happy.
--- tools/lib/str_error_r.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
tools/lib/str_error_r.c +1 -1
@@ -22,6 +22,6 @@ char *str_error_r(int errnum, char *buf, size_t buflen) {int err =strerror_r (errnum, buf, buflen);if (err) -snprintf (buf, buflen,"INTERNAL ERROR: strerror_r(%d, %p, %zd)=%d" , errnum, buf, buflen, err); +snprintf (buf, buflen,"INTERNAL ERROR: strerror_r(%d, [buf], %zd)=%d" , errnum, buflen, err);return buf; }
Signature · 1 line
2.14.3
Arnaldo Carvalho de Melo
maintainerPATCH 14/14 perf tests bp_account: Fix build with clang-6
In reply to Arnaldo Carvalho de MeloFrom: Arnaldo Carvalho de Melo <[email protected]>
To shut up this compiler warning:
CC /tmp/build/perf/tests/bp_account.o
CC /tmp/build/perf/tests/task-exit.o
CC /tmp/build/perf/tests/sw-clock.o
tests/bp_account.c:106:20: error: pointer type mismatch ('int (*)(void)' and 'void *') [-Werror,-Wpointer-type-mismatch]
void *addr = is_x ? test_function : (void *) &the_var;
^ ~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~1 error generated.
Noticed with clang 6 on fedora rawhide.
[perfbuilder@44490f0e7241 perf]$ clang -v
clang version 6.0.0 (tags/RELEASE_600/final)
Target: x86_64-unknown-linux-gnu
Thread model: posix
InstalledDir: /usr/bin
Found candidate GCC installation: /usr/bin/../lib/gcc/x86_64-redhat-linux/8 Found candidate GCC installation: /usr/lib/gcc/x86_64-redhat-linux/8 Selected GCC installation: /usr/bin/../lib/gcc/x86_64-redhat-linux/8 Candidate multilib: .;@m64
Candidate multilib: 32;@m32
Selected multilib: .;@m64
[perfbuilder@44490f0e7241 perf]$
--- tools/perf/tests/bp_account.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
tools/perf/tests/bp_account.c +1 -1
@@ -103,7 +103,7 @@ static int bp_accounting(int wp_cnt, int share)static int detect_cnt (bool is_x) {struct perf_event_attr attr; -void *addr = is_x ? test_function : (void *) &the_var; +void *addr = is_x ? (void *)test_function : (void *)&the_var;int fd[100 ], cnt =0 , i;while (1 ) {
Signature · 1 line
2.14.3
Quoted 108 lines · Arnaldo Carvalho de Melo
Hi Ingo,
Please consider pulling, this has those 31 patches that were
blocked due to some problems (author not being the fist S-o-B, build broken on ppc), those issues should all be fixed and then we have 14 patches more, described in the signed tag.Regards,
- Arnaldo
Test results at the end of this message, as usual.
The following changes since commit
10f354a36f9a9aa1b8bffe0abc1cd43822a85bcd:perf test: Fix exit code for
record+probe_libc_inet_pton.sh(2018-03-16 13:56:31 -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.17-20180319for you to fetch changes up to
1cd618838b9703eabe4a75badf433382b12f6bef:perf tests
bp_account: Fix build with clang-6 (2018-03-19 13:51:54 -0300)----------------------------------------------------------------
perf/core improvements and fixes:- Fixes for problems experienced with new gcc 8 warnings, that treated as errors, broke the build, related to snprintf and casting issues. (Arnaldo Carvalho de Melo, Jiri Olsa, Josh Poinboeuf)
- Fix build of new breakpoint 'perf test' entry with clang < 6, noticed on fedora 25, 26 and 27 (Arnaldo Carvalho de Melo)
- Workaround problem with symbol resolution in 'perf annotate', using the symbol name already present in the objdump output (Arnaldo Carvalho de Melo)
- Document 'perf top --ignore-vmlinux' (Arnaldo Carvalho de Melo)
- Fix out of bounds access on array fd when cnt is 100 in one of the 'perf test' entries, detected using 'cpptest' (Colin Ian King)
- Add support for the forced leader feature, i.e. 'perf report --group' for a group of events not really grouped when scheduled (without using {} to enclose the list of events in the command line) in pipe mode, e.g.:
$ perf record -e cycles,instructions -o - kill | perf report --group -i -- Use right type to access array elements in 'perf probe' (Masami Hiramatsu)
- Update POWER9 vendor events (those described in JSON format) (Sukadev Bhattiprolu)
- Discard head in
overwrite_rb_find_range()(Yisheng Xie)- Avoid setting 'quiet' to 'true' unnecessarily (Yisheng Xie)
Signed-off-by Arnaldo Carvalho de Melo <[email protected]>----------------------------------------------------------------
Arnaldo Carvalho de Melo (4):
perf annotate: Use asprintf when formatting objdump command line perf top: Document --ignore-vmlinux
perf annotate: Useops->target.namewhen available for unresolved call targets perf testsbp_account: Fix build with clang-6Colin Ian King (1):
perf tests: Fix out of bounds access on array fd when cnt is 100Jiri Olsa (4):
perf record: Synthesize features before events in pipe mode perf report: Support forced leader feature in pipe mode perf tools: Fix snprint warnings for gcc 8
perf tools: Fix python extension build for gcc 8Josh Poimboeuf (1):
objtool, perf: Fix GCC 8 -Wrestrict errorMasami Hiramatsu (1):
perf probe: Use right type to access array elementsSukadev Bhattiprolu (1):
perf vendor events: Update POWER9 eventsYisheng Xie (2):
perf mmap: Discard head inoverwrite_rb_find_range()perf debug: Avoid setting 'quiet' to 'true' unnecessarilytools/lib/str_error_r.c | 2 +- tools/perf/Documentation/perf-top.txt | 3 + tools/perf/builtin-record.c | 18 +- tools/perf/builtin-report.c | 57 +++-- tools/perf/builtin-script.c | 22 +- .../perf/pmu-events/arch/powerpc/power9/cache.json | 25 --- .../pmu-events/arch/powerpc/power9/frontend.json | 10 - .../pmu-events/arch/powerpc/power9/marked.json | 5 - .../pmu-events/arch/powerpc/power9/memory.json | 5 - .../perf/pmu-events/arch/powerpc/power9/other.json | 241 ++++++++++++++------- .../pmu-events/arch/powerpc/power9/pipeline.json | 50 ++--- tools/perf/pmu-events/arch/powerpc/power9/pmc.json | 5 - .../arch/powerpc/power9/translation.json | 10 +- tools/perf/tests/attr.c | 4 +- tools/perf/tests/bp_account.c | 10 +- tools/perf/tests/mem.c | 2 +- tools/perf/tests/pmu.c | 2 +- tools/perf/util/annotate.c | 20 +- tools/perf/util/cgroup.c | 2 +-
Quoted 8 lines
tools/perf/util/debug.c | 1 - tools/perf/util/header.c | 11 +- tools/perf/util/mmap.c | 15 +- tools/perf/util/parse-events.c | 4 +- tools/perf/util/pmu.c | 2 +- tools/perf/util/probe-finder.c | 13 +- tools/perf/util/setup.py | 2 + 26 files changed, 298 insertions(+), 243 deletions(-)
Pulled, thanks a lot Arnaldo!
Ingo