perf/core improvements and fixes
Subsystems (2)
Arnaldo Carvalho de Melo
maintainerHi Ingo,
Please consider pulling,
- Arnaldo
Test results at the end of this message, as usual.
The following changes since commit 33ea4b24277b06dbc55d7f5772a46f029600255e:
perf/core: Implement the 'perf_uprobe' PMU (2018-02-06 11:29:28 +0100)
are available in the Git repository at:
git://git.kernel.org/pub/scm/linux/kernel/git/acme/linux.git tags/perf-core-for-mingo-4.17-20180206
for you to fetch changes up to 52a37001d51a320c1019269fb3ba473a1363650d:
perf test: Fix test trace+probe_libc_inet_pton.sh for s390x (2018-02-06 10:46:58 -0300)
----------------------------------------------------------------
perf/core improvements and fixes:
- perf_mmap overwrite mode overhaul, prep work to get 'perf top' using it, making it bearable to use it in large core count systems such as Knights Landing/Mill Intel systems (Kan Liang)
- Add perf vendor JSON metrics for ARM Cortex-A53 Processor (William Cohen)
- Use strtoull() instead of home grown function (Andy Shevchenko)
- Document missing 'perf data --force' option (Sangwon Hong)
----------------------------------------------------------------
Andy Shevchenko (1):
perf tools: Substitute yet another strtoull()
Arnaldo Carvalho de Melo (1):
perf evsel: Expose the perf_missing_features struct
Kan Liang (16):
perf evlist: Remove stale mmap read for backward
perf mmap: Recalculate size for overwrite mode
perf mmap: Cleanup perf_mmap__push()
perf mmap: Introduce perf_mmap__read_init()
perf mmap: Add new return value logic for perf_mmap__read_init() perf mmap: Discard 'prev' in perf_mmap__read()
perf mmap: Introduce perf_mmap__read_done()
perf mmap: Introduce perf_mmap__read_event()
perf test: Update mmap read functions for backward-ring-buffer test perf mmap: Discard legacy interface for mmap read
perf top: Check per-event overwrite term
perf top: Add overwrite fall back
perf hists browser: Add parameter to disable lost event warning perf top: Remove lost events checking
perf top: Switch default mode to overwrite mode
perf top: Check the latency of perf_top__mmap_read()
Sangwon Hong (1):
perf data: Document missing --force option
Thomas Richter (1):
perf test: Fix test trace+probe_libc_inet_pton.sh for s390x
William Cohen (1):
perf vendor events aarch64: Add JSON metrics for ARM Cortex-A53 Processor
tools/perf/Documentation/perf-data.txt | 4 + tools/perf/builtin-c2c.c | 4 +- tools/perf/builtin-report.c | 3 +- tools/perf/builtin-top.c | 150 ++++++++++++++++++++- .../pmu-events/arch/arm64/cortex-a53/branch.json | 27 ++++ .../perf/pmu-events/arch/arm64/cortex-a53/bus.json | 22 +++ .../pmu-events/arch/arm64/cortex-a53/cache.json | 27 ++++ .../pmu-events/arch/arm64/cortex-a53/memory.json | 22 +++ .../pmu-events/arch/arm64/cortex-a53/other.json | 32 +++++ .../pmu-events/arch/arm64/cortex-a53/pipeline.json | 52 +++++++ tools/perf/pmu-events/arch/arm64/mapfile.csv | 1 + tools/perf/tests/backward-ring-buffer.c | 7 +- .../perf/tests/shell/trace+probe_libc_inet_pton.sh | 23 +++- tools/perf/ui/browsers/hists.c | 38 ++++-- tools/perf/ui/browsers/hists.h | 3 +- tools/perf/util/evlist.c | 17 --- tools/perf/util/evlist.h | 4 - tools/perf/util/evsel.c | 12 +- tools/perf/util/evsel.h | 14 ++ tools/perf/util/hist.h | 6 +- tools/perf/util/mmap.c | 141 ++++++++++--------- tools/perf/util/mmap.h | 10 +- tools/perf/util/util.c | 24 +--- 23 files changed, 492 insertions(+), 151 deletions(-) create mode 100644 tools/perf/pmu-events/arch/arm64/cortex-a53/branch.json create mode 100644 tools/perf/pmu-events/arch/arm64/cortex-a53/bus.json create mode 100644 tools/perf/pmu-events/arch/arm64/cortex-a53/cache.json create mode 100644 tools/perf/pmu-events/arch/arm64/cortex-a53/memory.json create mode 100644 tools/perf/pmu-events/arch/arm64/cortex-a53/other.json create mode 100644 tools/perf/pmu-events/arch/arm64/cortex-a53/pipeline.json
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.
# 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:edge : Ok gcc (Alpine 6.4.0) 6.4.0 5 amazonlinux:1 : Ok gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-11) 6 amazonlinux:2 : Ok gcc (GCC) 7.2.1 20170915 (Red Hat 7.2.1-2) 7 android-ndk:r12b-arm : Ok arm-linux-androideabi-gcc (GCC) 4.9.x 20150123 (prerelease) 8 android-ndk:r15c-arm : Ok arm-linux-androideabi-gcc (GCC) 4.9.x 20150123 (prerelease) 9 centos:5 : Ok gcc (GCC) 4.1.2 20080704 (Red Hat 4.1.2-55) 10 centos:6 : Ok gcc (GCC) 4.4.7 20120313 (Red Hat 4.4.7-18) 11 centos:7 : Ok gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-16) 12 debian:7 : Ok gcc (Debian 4.7.2-5) 4.7.2 13 debian:8 : Ok gcc (Debian 4.9.2-10) 4.9.2 14 debian:9 : Ok gcc (Debian 6.3.0-18) 6.3.0 20170516 15 debian:experimental : Ok gcc (Debian 7.2.0-17) 7.2.1 20171205 16 debian:experimental-x-arm64 : Ok aarch64-linux-gnu-gcc (Debian 7.2.0-11) 7.2.0 17 debian:experimental-x-mips : Ok mips-linux-gnu-gcc (Debian 7.2.0-11) 7.2.0 18 debian:experimental-x-mips64 : Ok mips64-linux-gnuabi64-gcc (Debian 7.2.0-11) 7.2.0 19 debian:experimental-x-mipsel : Ok mipsel-linux-gnu-gcc (Debian 7.2.0-11) 7.2.0 20 fedora:20 : Ok gcc (GCC) 4.8.3 20140911 (Red Hat 4.8.3-7) 21 fedora:21 : Ok gcc (GCC) 4.9.2 20150212 (Red Hat 4.9.2-6) 22 fedora:22 : Ok gcc (GCC) 5.3.1 20160406 (Red Hat 5.3.1-6) 23 fedora:23 : Ok gcc (GCC) 5.3.1 20160406 (Red Hat 5.3.1-6) 24 fedora:24 : Ok gcc (GCC) 6.3.1 20161221 (Red Hat 6.3.1-1) 25 fedora:24-x-ARC-uClibc : Ok arc-linux-gcc (ARCompact ISA Linux uClibc toolchain 2017.09-rc2) 7.1.1 20170710 26 fedora:25 : Ok gcc (GCC) 6.4.1 20170727 (Red Hat 6.4.1-1) 27 fedora:26 : Ok gcc (GCC) 7.2.1 20170915 (Red Hat 7.2.1-2) 28 fedora:27 : Ok gcc (GCC) 7.2.1 20170915 (Red Hat 7.2.1-2) 29 fedora:rawhide : Ok gcc (GCC) 7.2.1 20170829 (Red Hat 7.2.1-1) 30 gentoo-stage3-amd64:latest : Ok gcc (Gentoo 6.4.0-r1 p1.3) 6.4.0 31 mageia:5 : Ok gcc (GCC) 4.9.2 32 mageia:6 : Ok gcc (Mageia 5.4.0-5.mga6) 5.4.0 33 opensuse:42.1 : Ok gcc (SUSE Linux) 4.8.5 34 opensuse:42.2 : Ok gcc (SUSE Linux) 4.8.5 35 opensuse:42.3 : Ok gcc (SUSE Linux) 4.8.5 36 opensuse:tumbleweed : Ok gcc (SUSE Linux) 7.3.0 37 oraclelinux:6 : Ok gcc (GCC) 4.4.7 20120313 (Red Hat 4.4.7-18) 38 oraclelinux:7 : Ok gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-16) 39 ubuntu:12.04.5 : Ok gcc (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3 40 ubuntu:14.04.4 : Ok gcc (Ubuntu 4.8.4-2ubuntu1~14.04.3) 4.8.4 41 ubuntu:14.04.4-x-linaro-arm64 : Ok aarch64-linux-gnu-gcc (Linaro GCC 5.4-2017.05) 5.4.1 20170404 42 ubuntu:15.04 : Ok gcc (Ubuntu 4.9.2-10ubuntu13) 4.9.2 43 ubuntu:16.04 : Ok gcc (Ubuntu 5.4.0-6ubuntu1~16.04.5) 5.4.0 20160609 44 ubuntu:16.04-x-arm : Ok arm-linux-gnueabihf-gcc (Ubuntu/Linaro 5.4.0-6ubuntu1~16.04.4) 5.4.0 20160609 45 ubuntu:16.04-x-arm64 : Ok aarch64-linux-gnu-gcc (Ubuntu/Linaro 5.4.0-6ubuntu1~16.04.4) 5.4.0 20160609 46 ubuntu:16.04-x-powerpc : Ok powerpc-linux-gnu-gcc (Ubuntu 5.4.0-6ubuntu1~16.04.4) 5.4.0 20160609 47 ubuntu:16.04-x-powerpc64 : Ok powerpc64-linux-gnu-gcc (Ubuntu/IBM 5.4.0-6ubuntu1~16.04.1) 5.4.0 20160609 48 ubuntu:16.04-x-powerpc64el : Ok powerpc64le-linux-gnu-gcc (Ubuntu/IBM 5.4.0-6ubuntu1~16.04.4) 5.4.0 20160609 49 ubuntu:16.04-x-s390 : Ok s390x-linux-gnu-gcc (Ubuntu 5.4.0-6ubuntu1~16.04.4) 5.4.0 20160609 50 ubuntu:16.10 : Ok gcc (Ubuntu 6.2.0-5ubuntu12) 6.2.0 20161005 51 ubuntu:17.04 : Ok gcc (Ubuntu 6.3.0-12ubuntu2) 6.3.0 20170406 52 ubuntu:17.10 : Ok gcc (Ubuntu 7.2.0-8ubuntu3) 7.2.0 53 ubuntu:18.04 : Ok gcc (Ubuntu 7.2.0-16ubuntu1) 7.2.0
# uname -a Linux jouet 4.15.0-rc9+ #7 SMP Mon Jan 22 18:16:36 -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: Number of exit events of a simple workload : Ok 22: Software clock events period values : Ok 23: Object code reading : Ok 24: Sample parsing : Ok 25: Use a dummy software event to keep tracking : Ok 26: Parse with no sample_id_all bit set : Ok 27: Filter hist entries : Ok 28: Lookup mmap thread : Ok 29: Share thread mg : Ok 30: Sort output of hist entries : Ok 31: Cumulate child hist entries : Ok 32: Track with sched_switch : Ok 33: Filter fds with revents mask in a fdarray : Ok 34: Add fd to a fdarray, making it autogrow : Ok 35: kmod_path__parse : Ok 36: Thread map : Ok 37: LLVM search and compile : 37.1: Basic BPF llvm compile : Ok 37.2: kbuild searching : Ok 37.3: Compile source for BPF prologue generation : Ok 37.4: Compile source for BPF relocation : Ok 38: Session topology : Ok 39: BPF filter : 39.1: Basic BPF filtering : Ok 39.2: BPF pinning : Ok 39.3: BPF prologue generation : Ok 39.4: BPF relocation checker : Ok 40: Synthesize thread map : Ok 41: Remove thread map : Ok 42: Synthesize cpu map : Ok 43: Synthesize stat config : Ok 44: Synthesize stat : Ok 45: Synthesize stat round : Ok 46: Synthesize attr update : Ok 47: Event times : Ok 48: Read backward ring buffer : Ok 49: Print cpu map : Ok 50: Probe SDT events : Ok 51: is_printable_array : Ok 52: Print bitmap : Ok 53: perf hooks : Ok 54: builtin clang support : Skip (not compiled in) 55: unit_number__scnprintf : Ok 56: x86 rdpmc : Ok 57: Convert perf time to TSC : Ok 58: DWARF unwind : Ok 59: x86 instruction decoder - new instructions : Ok 60: Use vfs_getname probe to get syscall args filenames : Ok 61: probe libc's inet_pton & backtrace it with ping : Ok 62: Check open filename arg using perf trace + vfs_getname: Ok 63: 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_perf_o_O: make perf.o
make_no_auxtrace_O: make NO_AUXTRACE=1
make_no_newt_O: make NO_NEWT=1
make_no_libbpf_O: make NO_LIBBPF=1
make_with_clangllvm_O: make LIBCLANGLLVM=1
make_install_O: make install
make_no_slang_O: make NO_SLANG=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_debug_O: make DEBUG=1
make_static_O: make LDFLAGS=-static
make_with_babeltrace_O: make LIBBABELTRACE=1
make_install_bin_O: make install-bin
make_no_demangle_O: make NO_DEMANGLE=1
make_doc_O: make doc
make_install_prefix_O: make install prefix=/tmp/krava
make_help_O: make help
make_no_libaudit_O: make NO_LIBAUDIT=1
make_no_libbionic_O: make NO_LIBBIONIC=1
make_no_ui_O: make NO_NEWT=1 NO_SLANG=1 NO_GTK2=1
make_no_libperl_O: make NO_LIBPERL=1
make_clean_all_O: make clean all
make_no_libdw_dwarf_unwind_O: make NO_LIBDW_DWARF_UNWIND=1
make_install_prefix_slash_O: make install prefix=/tmp/krava/
make_no_libpython_O: make NO_LIBPYTHON=1
make_no_scripts_O: make NO_LIBPYTHON=1 NO_LIBPERL=1
make_no_libnuma_O: make NO_LIBNUMA=1
make_tags_O: make tags
make_pure_O: make
make_no_gtk2_O: make NO_GTK2=1
make_no_libelf_O: make NO_LIBELF=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
OK
make: Leaving directory '/home/acme/git/perf/tools/perf'
$Arnaldo Carvalho de Melo
maintainerPATCH 1/21 perf vendor events aarch64: Add JSON metrics for ARM Cortex-A53 Processor
From: William Cohen <[email protected]>
Add JSON metrics for ARM Cortex-A53 Processor.
Unlike the Intel processors there isn't a script that automatically generated these files. The patch was manually generated from the documentation and the previous oprofile ARM Cortex ac53 event file patch I made.
The relevant documentation is in the "12.9 Events" section of the ARM Cortex A53 MPCore Processor Revision: r0p4 Technical Reference Manual.
The ARM Cortex A53 manual is available at:
http://infocenter.arm.com/help/topic/com.arm.doc.ddi0500g/DDI0500G_cortex_a53_trm.pdf
Use that to look for additional information about the events.
--- .../pmu-events/arch/arm64/cortex-a53/branch.json | 27 +++++++++++ .../perf/pmu-events/arch/arm64/cortex-a53/bus.json | 22 +++++++++ .../pmu-events/arch/arm64/cortex-a53/cache.json | 27 +++++++++++ .../pmu-events/arch/arm64/cortex-a53/memory.json | 22 +++++++++ .../pmu-events/arch/arm64/cortex-a53/other.json | 32 +++++++++++++ .../pmu-events/arch/arm64/cortex-a53/pipeline.json | 52 ++++++++++++++++++++++ tools/perf/pmu-events/arch/arm64/mapfile.csv | 1 + 7 files changed, 183 insertions(+) create mode 100644 tools/perf/pmu-events/arch/arm64/cortex-a53/branch.json create mode 100644 tools/perf/pmu-events/arch/arm64/cortex-a53/bus.json create mode 100644 tools/perf/pmu-events/arch/arm64/cortex-a53/cache.json create mode 100644 tools/perf/pmu-events/arch/arm64/cortex-a53/memory.json create mode 100644 tools/perf/pmu-events/arch/arm64/cortex-a53/other.json create mode 100644 tools/perf/pmu-events/arch/arm64/cortex-a53/pipeline.json
tools/perf/pmu-events/arch/arm64/cortex-a53/branch.json new file +27 -0
@@ -0,0 +1,27 @@ +[ + {, + "EventCode": "0x7A", + "EventName": "BR_INDIRECT_SPEC", + "BriefDescription": "Branch speculatively executed - Indirect branch" + }, + {, + "EventCode": "0xC9", + "EventName": "BR_COND", + "BriefDescription": "Conditional branch executed" + }, + {, + "EventCode": "0xCA", + "EventName": "BR_INDIRECT_MISPRED", + "BriefDescription": "Indirect branch mispredicted" + }, + {, + "EventCode": "0xCB", + "EventName": "BR_INDIRECT_MISPRED_ADDR", + "BriefDescription": "Indirect branch mispredicted because of address miscompare" + }, + {, + "EventCode": "0xCC", + "EventName": "BR_COND_MISPRED", + "BriefDescription": "Conditional branch mispredicted" + } +]
tools/perf/pmu-events/arch/arm64/cortex-a53/bus.json new file +22 -0
@@ -0,0 +1,22 @@ +[ + {, + "EventCode": "0x60", + "EventName": "BUS_ACCESS_LD", + "BriefDescription": "Bus access - Read" + }, + {, + "EventCode": "0x61", + "EventName": "BUS_ACCESS_ST", + "BriefDescription": "Bus access - Write" + }, + {, + "EventCode": "0xC0", + "EventName": "EXT_MEM_REQ", + "BriefDescription": "External memory request" + }, + {, + "EventCode": "0xC1", + "EventName": "EXT_MEM_REQ_NC", + "BriefDescription": "Non-cacheable external memory request" + } +]
tools/perf/pmu-events/arch/arm64/cortex-a53/cache.json new file +27 -0
@@ -0,0 +1,27 @@ +[ + {, + "EventCode": "0xC2", + "EventName": "PREFETCH_LINEFILL", + "BriefDescription": "Linefill because of prefetch" + }, + {, + "EventCode": "0xC3", + "EventName": "PREFETCH_LINEFILL_DROP", + "BriefDescription": "Instruction Cache Throttle occurred" + }, + {, + "EventCode": "0xC4", + "EventName": "READ_ALLOC_ENTER", + "BriefDescription": "Entering read allocate mode" + }, + {, + "EventCode": "0xC5", + "EventName": "READ_ALLOC", + "BriefDescription": "Read allocate mode" + }, + {, + "EventCode": "0xC8", + "EventName": "EXT_SNOOP", + "BriefDescription": "SCU Snooped data from another CPU for this CPU" + } +]
tools/perf/pmu-events/arch/arm64/cortex-a53/memory.json new file +22 -0
@@ -0,0 +1,22 @@ +[ + {, + "EventCode": "0x60", + "EventName": "BUS_ACCESS_LD", + "BriefDescription": "Bus access - Read" + }, + {, + "EventCode": "0x61", + "EventName": "BUS_ACCESS_ST", + "BriefDescription": "Bus access - Write" + }, + {, + "EventCode": "0xC0", + "EventName": "EXT_MEM_REQ", + "BriefDescription": "External memory request" + }, + {, + "EventCode": "0xC1", + "EventName": "EXT_MEM_REQ_NC", + "BriefDescription": "Non-cacheable external memory request" + } +]
tools/perf/pmu-events/arch/arm64/cortex-a53/other.json new file +32 -0
@@ -0,0 +1,32 @@ +[ + {, + "EventCode": "0x86", + "EventName": "EXC_IRQ", + "BriefDescription": "Exception taken, IRQ" + }, + {, + "EventCode": "0x87", + "EventName": "EXC_FIQ", + "BriefDescription": "Exception taken, FIQ" + }, + {, + "EventCode": "0xC6", + "EventName": "PRE_DECODE_ERR", + "BriefDescription": "Pre-decode error" + }, + {, + "EventCode": "0xD0", + "EventName": "L1I_CACHE_ERR", + "BriefDescription": "L1 Instruction Cache (data or tag) memory error" + }, + {, + "EventCode": "0xD1", + "EventName": "L1D_CACHE_ERR", + "BriefDescription": "L1 Data Cache (data, tag or dirty) memory error, correctable or non-correctable" + }, + {, + "EventCode": "0xD2", + "EventName": "TLB_ERR", + "BriefDescription": "TLB memory error" + } +]
tools/perf/pmu-events/arch/arm64/cortex-a53/pipeline.json new file +52 -0
52 lines not on this page · raw message
tools/perf/pmu-events/arch/arm64/mapfile.csv +1 -0
@@ -13,3 +13,4 @@ # #Family-model,Version,Filename,EventType 0x00000000420f5160,v1,cavium,core +0x00000000410fd03[[:xdigit:]],v1,cortex-a53,core
Signature · 1 line
2.14.3
Arnaldo Carvalho de Melo
maintainerPATCH 2/21 perf evlist: Remove stale mmap read for backward
In reply to Arnaldo Carvalho de MeloFrom: Kan Liang <[email protected]>
perf_evlist__mmap_read_catchup() and perf_evlist__mmap_read_backward() are only for overwrite mode.
But they read the evlist->mmap buffer which is for non-overwrite mode.
It did not bring any serious problem yet, because there is no one use it.
Remove the unused interfaces.
--- tools/perf/util/evlist.c | 17 ----------------- tools/perf/util/evlist.h | 4 ---- 2 files changed, 21 deletions(-)
tools/perf/util/evlist.c +0 -17
@@ -715,28 +715,11 @@ union perf_event *perf_evlist__mmap_read_forward(struct perf_evlist *evlist, intreturn perf_mmap__read_forward (md); } -union perf_event *perf_evlist__mmap_read_backward (struct perf_evlist *evlist,int idx) -{ -struct perf_mmap *md = &evlist->mmap[idx]; - -/* -* No need to check messup for backward ring buffer: -* We can always read arbitrary long data from a backward -* ring buffer unless we forget to pause it before reading. -*/ -return perf_mmap__read_backward (md); -} -union perf_event *perf_evlist__mmap_read (struct perf_evlist *evlist,int idx) {return perf_evlist__mmap_read_forward (evlist, idx); } -void perf_evlist__mmap_read_catchup (struct perf_evlist *evlist,int idx) -{ -perf_mmap__read_catchup (&evlist->mmap[idx]); -} -void perf_evlist__mmap_consume (struct perf_evlist *evlist,int idx) {perf_mmap__consume (&evlist->mmap[idx], false);
tools/perf/util/evlist.h +0 -4
@@ -133,10 +133,6 @@ union perf_event *perf_evlist__mmap_read(struct perf_evlist *evlist, int idx);union perf_event *perf_evlist__mmap_read_forward (struct perf_evlist *evlist,int idx); -union perf_event *perf_evlist__mmap_read_backward (struct perf_evlist *evlist, -int idx); -void perf_evlist__mmap_read_catchup (struct perf_evlist *evlist,int idx); -void perf_evlist__mmap_consume (struct perf_evlist *evlist,int idx);int perf_evlist__open (struct perf_evlist *evlist);
Signature · 1 line
2.14.3
Arnaldo Carvalho de Melo
maintainerPATCH 3/21 perf mmap: Recalculate size for overwrite mode
In reply to Arnaldo Carvalho de MeloFrom: Kan Liang <[email protected]>
In perf_mmap__push(), the 'size' need to be recalculated, otherwise the invalid data might be pushed to the record in overwrite mode.
The issue is introduced by commit 7fb4b407a124 ("perf mmap: Don't discard prev in backward mode").
When the ring buffer is full in overwrite mode, backward_rb_find_range() will be called to recalculate the 'start' and 'end'. The 'size' needs to be recalculated accordingly.
Unconditionally recalculate the 'size', not just for full ring buffer in overwrite mode. Because:
- There is no harmful to recalculate the 'size' for other cases.
- The code of calculating 'start' and 'end' will be factored out later. The new function does not need to return 'size'.
--- tools/perf/util/mmap.c | 2 ++ 1 file changed, 2 insertions(+)
tools/perf/util/mmap.c +2 -0
@@ -302,6 +302,8 @@ int perf_mmap__push(struct perf_mmap *md, bool overwrite,return -1 ; } + size = end - start; +if ((start & md->mask) + size != (end & md->mask)) { buf = &data[start & md->mask]; size = md->mask +1 - (start & md->mask);
Signature · 1 line
2.14.3
Arnaldo Carvalho de Melo
maintainerPATCH 4/21 perf mmap: Cleanup perf_mmap__push()
In reply to Arnaldo Carvalho de MeloFrom: Kan Liang <[email protected]>
The first assignment for 'start' and 'end' is redundant.
--- tools/perf/util/mmap.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
tools/perf/util/mmap.c +1 -1
@@ -272,7 +272,7 @@ int perf_mmap__push(struct perf_mmap *md, bool overwrite, {u64 head =perf_mmap__read_head (md);u64 old = md->prev; -u64 end = head, start = old; +u64 end, start;unsigned char *data = md->base + page_size;unsigned long size;void *buf;
Signature · 1 line
2.14.3
Arnaldo Carvalho de Melo
maintainerPATCH 5/21 perf mmap: Introduce perf_mmap__read_init()
In reply to Arnaldo Carvalho de MeloFrom: Kan Liang <[email protected]>
The new function perf_mmap__read_init() is factored out from perf_mmap__push().
It is to calculate the 'start' and 'end' of the available data in ringbuffer.
No functional change.
--- tools/perf/util/mmap.c | 37 +++++++++++++++++++++++++++---------- tools/perf/util/mmap.h | 2 ++ 2 files changed, 29 insertions(+), 10 deletions(-)
tools/perf/util/mmap.c +27 -10
@@ -267,24 +267,24 @@ static int overwrite_rb_find_range(void *buf, int mask, u64 head, u64 *start, u6return -1 ; } -int perf_mmap__push (struct perf_mmap *md,bool overwrite, -void *to,int push (void *to,void *buf,size_t size)) +/* +* Report the start and end of the available data in ringbuffer +*/ +int perf_mmap__read_init (struct perf_mmap *md,bool overwrite, +u64 *startp,u64 *endp) {u64 head =perf_mmap__read_head (md);u64 old = md->prev; -u64 end, start;unsigned char *data = md->base + page_size;unsigned long size; -void *buf; -int rc =0 ; - start = overwrite ? head : old; - end = overwrite ? old : head; + *startp = overwrite ? head : old; + *endp = overwrite ? old : head; -if (start == end) +if (*startp == *endp)return 0 ; - size = end - start; + size = *endp - *startp;if (size > (unsigned long )(md->mask) +1 ) {if (!overwrite) {WARN_ONCE (1 ,"failed to keep up with mmap data. (warn only once)\n" );
@@ -298,10 +298,27 @@ int perf_mmap__push(struct perf_mmap *md, bool overwrite,* 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, &start, &end)) +if (overwrite_rb_find_range (data, md->mask, head, startp, endp))return -1 ; } +return 1 ; +} + +int perf_mmap__push (struct perf_mmap *md,bool overwrite, +void *to,int push (void *to,void *buf,size_t size)) +{ +u64 head =perf_mmap__read_head (md); +u64 end, start; +unsigned char *data = md->base + page_size; +unsigned long size; +void *buf; +int rc =0 ; + + rc =perf_mmap__read_init (md, overwrite, &start, &end); +if (rc <1 ) +return rc; + size = end - start;if ((start & md->mask) + size != (end & md->mask)) {
tools/perf/util/mmap.h +2 -0
@@ -94,4 +94,6 @@ int perf_mmap__push(struct perf_mmap *md, bool backward,size_t perf_mmap__mmap_len (struct perf_mmap *map); +int perf_mmap__read_init (struct perf_mmap *md,bool overwrite, +u64 *startp,u64 *endp);#endif /*__PERF_MMAP_H */
Signature · 1 line
2.14.3
Arnaldo Carvalho de Melo
maintainerPATCH 6/21 perf mmap: Add new return value logic for perf_mmap__read_init()
In reply to Arnaldo Carvalho de MeloFrom: Kan Liang <[email protected]>
Improve the readability by using meaningful enum (-EAGAIN, -EINVAL and
0) to replace the three returning states (0, -1 and 1).
--- tools/perf/util/mmap.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-)
tools/perf/util/mmap.c +6 -6
@@ -282,7 +282,7 @@ int perf_mmap__read_init(struct perf_mmap *md, bool overwrite, *endp = overwrite ? old : head;if (*startp == *endp) -return 0 ; +return -EAGAIN ; size = *endp - *startp;if (size > (unsigned long )(md->mask) +1 ) {
@@ -291,7 +291,7 @@ int perf_mmap__read_init(struct perf_mmap *md, bool overwrite, md->prev = head;perf_mmap__consume (md, overwrite); -return 0 ; +return -EAGAIN ; }/*
@@ -299,10 +299,10 @@ int perf_mmap__read_init(struct perf_mmap *md, bool overwrite,* most of data from it. */ if (overwrite_rb_find_range (data, md->mask, head, startp, endp)) -return -1 ; +return -EINVAL ; } -return 1 ; +return 0 ; } int perf_mmap__push(struct perf_mmap *md, bool overwrite,
@@ -316,8 +316,8 @@ int perf_mmap__push(struct perf_mmap *md, bool overwrite,int rc =0 ; rc =perf_mmap__read_init (md, overwrite, &start, &end); -if (rc <1 ) -return rc; +if (rc <0 ) +return (rc == -EAGAIN ) ?0 :-1 ; size = end - start;
Signature · 1 line
2.14.3
Arnaldo Carvalho de Melo
maintainerPATCH 7/21 perf mmap: Discard 'prev' in perf_mmap__read()
In reply to Arnaldo Carvalho de MeloFrom: Kan Liang <[email protected]>
The 'start' and 'prev' variables are duplicates in perf_mmap__read().
Use 'map->prev' to replace 'start' in perf_mmap__read_*().
--- tools/perf/util/mmap.c | 28 ++++++++++------------------ 1 file changed, 10 insertions(+), 18 deletions(-)
tools/perf/util/mmap.c +10 -18
@@ -22,29 +22,27 @@ size_t perf_mmap__mmap_len(struct perf_mmap *map)/* When check_messup is true, 'end' must points to a good entry */ static union perf_event *perf_mmap__read (struct perf_mmap *map, -u64 start,u64 end,u64 *prev) +u64 *startp,u64 end) {unsigned char *data = map->base + page_size;union perf_event *event =NULL ; -int diff = end - start; +int diff = end - *startp;if (diff >= (int )sizeof (event->header)) {size_t size; - event = (union perf_event *)&data[start & map->mask]; + event = (union perf_event *)&data[*startp & map->mask]; size = event->header.size; -if (size <sizeof (event->header) || diff < (int )size) { - event =NULL ; - goto broken_event; - } +if (size <sizeof (event->header) || diff < (int )size) +return NULL ;/* * Event straddles the mmap boundary -- header should always * be inside due to u64 alignment of output. */ -if ((start & map->mask) + size != ((start + size) & map->mask)) { -unsigned int offset = start; +if ((*startp & map->mask) + size != ((*startp + size) & map->mask)) { +unsigned int offset = *startp;unsigned int len =min (sizeof (*event), size), cpy;void *dst = map->event_copy;
@@ -59,20 +57,15 @@ static union perf_event *perf_mmap__read(struct perf_mmap *map, event = (union perf_event *)map->event_copy; } - start += size; + *startp += size; } -broken_event: -if (prev) - *prev = start; -return event; }union perf_event *perf_mmap__read_forward (struct perf_mmap *map) {u64 head; -u64 old = map->prev;/* * Check if event was unmapped due to a POLLHUP/POLLERR.
@@ -82,13 +75,12 @@ union perf_event *perf_mmap__read_forward(struct perf_mmap *map) head =perf_mmap__read_head (map); -return perf_mmap__read (map, old, head, &map->prev); +return perf_mmap__read (map, &map->prev, head); }union perf_event *perf_mmap__read_backward (struct perf_mmap *map) {u64 head, end; -u64 start = map->prev;/* * Check if event was unmapped due to a POLLHUP/POLLERR.
@@ -118,7 +110,7 @@ union perf_event *perf_mmap__read_backward(struct perf_mmap *map)else end = head + map->mask +1 ; -return perf_mmap__read (map, start, end, &map->prev); +return perf_mmap__read (map, &map->prev, end); }void perf_mmap__read_catchup (struct perf_mmap *map)
Signature · 1 line
2.14.3
Arnaldo Carvalho de Melo
maintainerPATCH 8/21 perf mmap: Introduce perf_mmap__read_done()
In reply to Arnaldo Carvalho de MeloFrom: Kan Liang <[email protected]>
The direction of overwrite mode is backward. The last perf_mmap__read() will set tail to map->prev. Need to correct the map->prev to head which is the end of next read.
It will be used later.
--- tools/perf/util/mmap.c | 11 +++++++++++ tools/perf/util/mmap.h | 1 + 2 files changed, 12 insertions(+)
tools/perf/util/mmap.c +11 -0
@@ -338,3 +338,14 @@ int perf_mmap__push(struct perf_mmap *md, bool overwrite, out:return rc; } + +/* +* Mandatory for overwrite mode +* The direction of overwrite mode is backward. +* The last perf_mmap__read() will set tail to map->prev. +* Need to correct the map->prev to head which is the end of next read. +*/ +void perf_mmap__read_done (struct perf_mmap *map) +{ + map->prev =perf_mmap__read_head (map); +}
tools/perf/util/mmap.h +1 -0
@@ -96,4 +96,5 @@ size_t perf_mmap__mmap_len(struct perf_mmap *map);int perf_mmap__read_init (struct perf_mmap *md,bool overwrite,u64 *startp,u64 *endp); +void perf_mmap__read_done (struct perf_mmap *map);#endif /*__PERF_MMAP_H */
Signature · 1 line
2.14.3
Arnaldo Carvalho de Melo
maintainerPATCH 9/21 perf mmap: Introduce perf_mmap__read_event()
In reply to Arnaldo Carvalho de MeloFrom: Kan Liang <[email protected]>
Except for 'perf record', the other perf tools read events one by one from the ring buffer using perf_mmap__read_forward(). But it only supports non-overwrite mode.
Introduce perf_mmap__read_event() to support both non-overwrite and overwrite mode.
Usage:perf_mmap__read_init()
while(event = perf_mmap__read_event()) {
//process the event
perf_mmap__consume()
}perf_mmap__read_done()
It cannot use perf_mmap__read_backward(). Because it always reads the stale buffer which is already processed. Furthermore, the forward and backward concepts have been removed. The perf_mmap__read_backward() will be replaced and discarded later.
--- tools/perf/util/mmap.c | 39 +++++++++++++++++++++++++++++++++++++++ tools/perf/util/mmap.h | 4 ++++ 2 files changed, 43 insertions(+)
tools/perf/util/mmap.c +39 -0
@@ -113,6 +113,45 @@ union perf_event *perf_mmap__read_backward(struct perf_mmap *map)return perf_mmap__read (map, &map->prev, end); } +/* +* Read event from ring buffer one by one. +* Return one event for each call. +* +* Usage: +* perf_mmap__read_init() +* while(event = perf_mmap__read_event()) { +* //process the event +* perf_mmap__consume() +* } +* perf_mmap__read_done() +*/ +union perf_event *perf_mmap__read_event (struct perf_mmap *map, +bool overwrite, +u64 *startp,u64 end) +{ +union perf_event *event; + +/* +* Check if event was unmapped due to a POLLHUP/POLLERR. +*/ +if (!refcount_read (&map->refcnt)) +return NULL ; + +if (startp ==NULL ) +return NULL ; + +/* non-overwirte doesn't pause the ringbuffer */ +if (!overwrite) + end =perf_mmap__read_head (map); + + event =perf_mmap__read (map, startp, end); + +if (!overwrite) + map->prev = *startp; + +return event; +} +void perf_mmap__read_catchup (struct perf_mmap *map) {u64 head;
tools/perf/util/mmap.h +4 -0
@@ -89,6 +89,10 @@ static inline void perf_mmap__write_tail(struct perf_mmap *md, u64 tail)union perf_event *perf_mmap__read_forward (struct perf_mmap *map);union perf_event *perf_mmap__read_backward (struct perf_mmap *map); +union perf_event *perf_mmap__read_event (struct perf_mmap *map, +bool overwrite, +u64 *startp,u64 end); +int perf_mmap__push (struct perf_mmap *md,bool backward,void *to,int push (void *to,void *buf,size_t size));
Signature · 1 line
2.14.3
Arnaldo Carvalho de Melo
maintainerPATCH 10/21 perf test: Update mmap read functions for backward-ring-buffer test
In reply to Arnaldo Carvalho de MeloFrom: Kan Liang <[email protected]>
Use the new perf_mmap__read_* interfaces for overwrite ringbuffer test.
Commiter notes:
Testing:
[root@seventh ~]# perf test -v backward
48: Read backward ring buffer :
--- start ---
test child forked, pid 8309
Using CPUID GenuineIntel-6-9E
mmap size 1052672B
mmap size 8192B
Finished reading overwrite ring buffer: rewind
test child finished with 0
---- end ----
Read backward ring buffer: Ok
[root@seventh ~]#
--- tools/perf/tests/backward-ring-buffer.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-)
tools/perf/tests/backward-ring-buffer.c +5 -2
@@ -31,10 +31,12 @@ static int count_samples(struct perf_evlist *evlist, int *sample_count,int i;for (i =0 ; i < evlist->nr_mmaps; i++) { +struct perf_mmap *map = &evlist->overwrite_mmap[i];union perf_event *event; +u64 start, end; -perf_mmap__read_catchup (&evlist->overwrite_mmap[i]); -while ((event =perf_mmap__read_backward (&evlist->overwrite_mmap[i])) !=NULL ) { +perf_mmap__read_init (map, true, &start, &end); +while ((event =perf_mmap__read_event (map, true, &start, end)) !=NULL ) {const u32 type = event->header.type;switch (type) {
@@ -49,6 +51,7 @@ static int count_samples(struct perf_evlist *evlist, int *sample_count,return TEST_FAIL ; } } +perf_mmap__read_done (map); }return TEST_OK ; }
Signature · 1 line
2.14.3
Arnaldo Carvalho de Melo
maintainerPATCH 11/21 perf mmap: Discard legacy interface for mmap read
In reply to Arnaldo Carvalho de MeloFrom: Kan Liang <[email protected]>
Discards perf_mmap__read_backward() and perf_mmap__read_catchup(). No tools use them.
There are tools still use perf_mmap__read_forward(). Keep it, but add comments to point to the new interface for future use.
--- tools/perf/util/mmap.c | 50 ++++---------------------------------------------- tools/perf/util/mmap.h | 3 --- 2 files changed, 4 insertions(+), 49 deletions(-)
tools/perf/util/mmap.c +4 -46
@@ -63,6 +63,10 @@ static union perf_event *perf_mmap__read(struct perf_mmap *map,return event; } +/* +* legacy interface for mmap read. +* Don't use it. Use perf_mmap__read_event(). +*/ union perf_event *perf_mmap__read_forward (struct perf_mmap *map) {u64 head;
@@ -78,41 +82,6 @@ union perf_event *perf_mmap__read_forward(struct perf_mmap *map)return perf_mmap__read (map, &map->prev, head); } -union perf_event *perf_mmap__read_backward (struct perf_mmap *map) -{ -u64 head, end; - -/* -* Check if event was unmapped due to a POLLHUP/POLLERR. -*/ -if (!refcount_read (&map->refcnt)) -return NULL ; - - head =perf_mmap__read_head (map); -if (!head) -return NULL ; - -/* -* 'head' pointer starts from 0. Kernel minus sizeof(record) form -* it each time when kernel writes to it, so in fact 'head' is -* negative. 'end' pointer is made manually by adding the size of -* the ring buffer to 'head' pointer, means the validate data can -* read is the whole ring buffer. If 'end' is positive, the ring -* buffer has not fully filled, so we must adjust 'end' to 0. -* -* However, since both 'head' and 'end' is unsigned, we can't -* simply compare 'end' against 0. Here we compare '-head' and -* the size of the ring buffer, where -head is the number of bytes -* kernel write to the ring buffer. -*/ -if (-head < (u64)(map->mask +1 )) - end =0 ; -else - end = head + map->mask +1 ; - -return perf_mmap__read (map, &map->prev, end); -} -/* * Read event from ring buffer one by one. * Return one event for each call.
@@ -152,17 +121,6 @@ union perf_event *perf_mmap__read_event(struct perf_mmap *map,return event; } -void perf_mmap__read_catchup (struct perf_mmap *map) -{ -u64 head; - -if (!refcount_read (&map->refcnt)) -return ; - - head =perf_mmap__read_head (map); - map->prev = head; -} -static bool perf_mmap__empty (struct perf_mmap *map) {return perf_mmap__read_head (map) == map->prev && !map->auxtrace_mmap.base;
tools/perf/util/mmap.h +0 -3
@@ -65,8 +65,6 @@ void perf_mmap__put(struct perf_mmap *map);void perf_mmap__consume (struct perf_mmap *map,bool overwrite); -void perf_mmap__read_catchup (struct perf_mmap *md); -static inline u64 perf_mmap__read_head (struct perf_mmap *mm) {struct perf_event_mmap_page *pc = mm->base;
@@ -87,7 +85,6 @@ static inline void perf_mmap__write_tail(struct perf_mmap *md, u64 tail) }union perf_event *perf_mmap__read_forward (struct perf_mmap *map); -union perf_event *perf_mmap__read_backward (struct perf_mmap *map); union perf_event *perf_mmap__read_event(struct perf_mmap *map, bool overwrite,
Signature · 1 line
2.14.3
Arnaldo Carvalho de Melo
maintainerPATCH 12/21 perf top: Check per-event overwrite term
In reply to Arnaldo Carvalho de MeloFrom: Kan Liang <[email protected]>
Per-event overwrite term is not forbidden in 'perf top', which can bring problems. Because 'perf top' only support non-overwrite mode now.
Add new rules and check regarding to overwrite term for 'perf top'.
- All events either have same per-event term or don't have per-event mode setting. Otherwise, it will error out.
- Per-event overwrite term should be consistent as opts->overwrite. If not, updating the opts->overwrite according to per-event term.
Make it possible to support either non-overwrite or overwrite mode. The overwrite mode is forbidden now, which will be removed when the overwrite mode is supported later.
--- tools/perf/builtin-top.c | 73 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 73 insertions(+)
tools/perf/builtin-top.c +73 -0
@@ -881,6 +881,68 @@ static void perf_top__mmap_read(struct perf_top *top)perf_top__mmap_read_idx (top, i); } +/* +* Check per-event overwrite term. +* perf top should support consistent term for all events. +* - All events don't have per-event term +* E.g. "cpu/cpu-cycles/,cpu/instructions/" +* Nothing change, return 0. +* - All events have same per-event term +* E.g. "cpu/cpu-cycles,no-overwrite/,cpu/instructions,no-overwrite/ +* Using the per-event setting to replace the opts->overwrite if +* they are different, then return 0. +* - Events have different per-event term +* E.g. "cpu/cpu-cycles,overwrite/,cpu/instructions,no-overwrite/" +* Return -1 +* - Some of the event set per-event term, but some not. +* E.g. "cpu/cpu-cycles/,cpu/instructions,no-overwrite/" +* Return -1 +*/ +static int perf_top__overwrite_check (struct perf_top *top) +{ +struct record_opts *opts = &top->record_opts; +struct perf_evlist *evlist = top->evlist; +struct perf_evsel_config_term *term; +struct list_head *config_terms; +struct perf_evsel *evsel; +int set, overwrite =-1 ; + +evlist__for_each_entry (evlist, evsel) { + set =-1 ; + config_terms = &evsel->config_terms; +list_for_each_entry (term, config_terms, list) { +if (term->type ==PERF_EVSEL__CONFIG_TERM_OVERWRITE ) + set = term->val.overwrite ?1 :0 ; + } + +/* no term for current and previous event (likely) */ +if ((overwrite <0 ) && (set <0 )) +continue ; + +/* has term for both current and previous event, compare */ +if ((overwrite >=0 ) && (set >=0 ) && (overwrite != set)) +return -1 ; + +/* no term for current event but has term for previous one */ +if ((overwrite >=0 ) && (set <0 )) +return -1 ; + +/* has term for current event */ +if ((overwrite <0 ) && (set >=0 )) { +/* if it's first event, set overwrite */ +if (evsel ==perf_evlist__first (evlist)) + overwrite = set; +else +return -1 ; + } + } + +if ((overwrite >=0 ) && (opts->overwrite != overwrite)) + opts->overwrite = overwrite; + +return 0 ; +} +static int perf_top__start_counters (struct perf_top *top) {char msg[BUFSIZ ];
@@ -888,6 +950,17 @@ static int perf_top__start_counters(struct perf_top *top)struct perf_evlist *evlist = top->evlist;struct record_opts *opts = &top->record_opts; +if (perf_top__overwrite_check (top)) { +ui__error ("perf top only support consistent per-event " +"overwrite setting for all events\n" ); + goto out_err; + } + +if (opts->overwrite) { +ui__error ("not support overwrite mode yet\n" ); + goto out_err; + } +perf_evlist__config (evlist, opts, &callchain_param);evlist__for_each_entry (evlist, counter) {
Signature · 1 line
2.14.3
Arnaldo Carvalho de Melo
maintainerPATCH 13/21 perf evsel: Expose the perf_missing_features struct
In reply to Arnaldo Carvalho de MeloFrom: Arnaldo Carvalho de Melo <[email protected]>
As tools may need to adjust to missing features, as 'perf top' will, in the next csets, to cope with a missing 'write_backward' feature.
--- tools/perf/util/evsel.c | 12 +----------- tools/perf/util/evsel.h | 14 ++++++++++++++ 2 files changed, 15 insertions(+), 11 deletions(-)
tools/perf/util/evsel.c +1 -11
@@ -41,17 +41,7 @@#include "sane_ctype.h" -static struct { -bool sample_id_all; -bool exclude_guest; -bool mmap2; -bool cloexec; -bool clockid; -bool clockid_wrong; -bool lbr_flags; -bool write_backward; -bool group_read; -} perf_missing_features; +struct perf_missing_features perf_missing_features;static clockid_t clockid;
tools/perf/util/evsel.h +14 -0
@@ -149,6 +149,20 @@ union u64_swap {u32 val32[2 ]; }; +struct perf_missing_features { +bool sample_id_all; +bool exclude_guest; +bool mmap2; +bool cloexec; +bool clockid; +bool clockid_wrong; +bool lbr_flags; +bool write_backward; +bool group_read; +}; + +extern struct perf_missing_features perf_missing_features; +struct cpu_map ;struct target ;struct thread_map ;
Signature · 1 line
2.14.3
Arnaldo Carvalho de Melo
maintainerPATCH 14/21 perf top: Add overwrite fall back
In reply to Arnaldo Carvalho de MeloFrom: Kan Liang <[email protected]>
Switch to non-overwrite mode if kernel doesnot support overwrite ringbuffer.
It's only effect when overwrite mode is supported. No change to current behavior.
--- tools/perf/builtin-top.c | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+)
tools/perf/builtin-top.c +36 -0
@@ -943,6 +943,27 @@ static int perf_top__overwrite_check(struct perf_top *top)return 0 ; } +static int perf_top_overwrite_fallback (struct perf_top *top, +struct perf_evsel *evsel) +{ +struct record_opts *opts = &top->record_opts; +struct perf_evlist *evlist = top->evlist; +struct perf_evsel *counter; + +if (!opts->overwrite) +return 0 ; + +/* only fall back when first event fails */ +if (evsel !=perf_evlist__first (evlist)) +return 0 ; + +evlist__for_each_entry (evlist, counter) + counter->attr.write_backward = false; + opts->overwrite = false; +ui__warning ("fall back to non-overwrite mode\n" ); +return 1 ; +} +static int perf_top__start_counters (struct perf_top *top) {char msg[BUFSIZ ];
@@ -967,6 +988,21 @@ static int perf_top__start_counters(struct perf_top *top) try_again:if (perf_evsel__open (counter, top->evlist->cpus, top->evlist->threads) <0 ) { + +/* +* Specially handle overwrite fall back. +* Because perf top is the only tool which has +* overwrite mode by default, support +* both overwrite and non-overwrite mode, and +* require consistent mode for all events. +* +* May move it to generic code with more tools +* have similar attribute. +*/ +if (perf_missing_features.write_backward && +perf_top_overwrite_fallback (top, counter)) + goto try_again; +if (perf_evsel__fallback (counter, errno, msg,sizeof (msg))) {if (verbose >0 )ui__warning ("%s\n" , msg);
Signature · 1 line
2.14.3
Arnaldo Carvalho de Melo
maintainerPATCH 15/21 perf hists browser: Add parameter to disable lost event warning
In reply to Arnaldo Carvalho de MeloFrom: Kan Liang <[email protected]>
For overwrite mode, the ringbuffer will be paused. The event lost is expected. It needs a way to notify the browser not print the warning.
It will be used later for perf top to disable lost event warning in overwrite mode. There is no behavior change for now.
--- tools/perf/builtin-c2c.c | 4 ++-- tools/perf/builtin-report.c | 3 ++- tools/perf/builtin-top.c | 2 +- tools/perf/ui/browsers/hists.c | 38 +++++++++++++++++++++++++------------- tools/perf/ui/browsers/hists.h | 3 ++- tools/perf/util/hist.h | 6 ++++-- 6 files changed, 36 insertions(+), 20 deletions(-)
tools/perf/builtin-c2c.c +2 -2
@@ -2245,7 +2245,7 @@ static int perf_c2c__browse_cacheline(struct hist_entry *he)c2c_browser__update_nr_entries (browser);while (1 ) { - key =hist_browser__run (browser,"? - help" ); + key =hist_browser__run (browser,"? - help" , true);switch (key) {case 's' :
@@ -2314,7 +2314,7 @@ static int perf_c2c__hists_browse(struct hists *hists)c2c_browser__update_nr_entries (browser);while (1 ) { - key =hist_browser__run (browser,"? - help" ); + key =hist_browser__run (browser,"? - help" , true);switch (key) {case 'q' :
tools/perf/builtin-report.c +2 -1
@@ -530,7 +530,8 @@ static int report__browse_hists(struct report *rep)case 1 : ret =perf_evlist__tui_browse_hists (evlist, help,NULL , rep->min_percent, - &session->header.env); + &session->header.env, + true);/* * Usually "ret" is the last pressed key, and we only * care if the key notifies us to switch data file.
tools/perf/builtin-top.c +1 -1
@@ -611,7 +611,7 @@ static void *display_thread_tui(void *arg)perf_evlist__tui_browse_hists (top->evlist, help, &hbt, top->min_percent, - &top->session->header.env); + &top->session->header.env, true); done =1 ;return NULL ;
tools/perf/ui/browsers/hists.c +25 -13
@@ -608,7 +608,8 @@ static int hist_browser__title(struct hist_browser *browser, char *bf, size_t sireturn browser->title ? browser->title (browser, bf, size) :0 ; } -int hist_browser__run (struct hist_browser *browser,const char *help) +int hist_browser__run (struct hist_browser *browser,const char *help, +bool warn_lost_event) {int key;char title[160 ];
@@ -638,8 +639,9 @@ int hist_browser__run(struct hist_browser *browser, const char *help) nr_entries =hist_browser__nr_entries (browser);ui_browser__update_nr_entries (&browser->b, nr_entries); -if (browser->hists->stats.nr_lost_warned != - browser->hists->stats.nr_events[PERF_RECORD_LOST ]) { +if (warn_lost_event && + (browser->hists->stats.nr_lost_warned != + browser->hists->stats.nr_events[PERF_RECORD_LOST ])) { browser->hists->stats.nr_lost_warned = browser->hists->stats.nr_events[PERF_RECORD_LOST ];ui_browser__warn_lost_events (&browser->b);
@@ -2763,7 +2765,8 @@ static int perf_evsel__hists_browse(struct perf_evsel *evsel, int nr_events,bool left_exits, struct hist_browser_timer *hbt, float min_pcnt, - struct perf_env *env) + struct perf_env *env, + bool warn_lost_event) { struct hists *hists = evsel__hists(evsel);struct hist_browser *browser =perf_evsel_browser__new (evsel, hbt, env);
@@ -2844,7 +2847,8 @@ static int perf_evsel__hists_browse(struct perf_evsel *evsel, int nr_events, nr_options =0 ; - key =hist_browser__run (browser, helpline); + key =hist_browser__run (browser, helpline, + warn_lost_event);if (browser->he_selection !=NULL ) { thread =hist_browser__selected_thread (browser);
@@ -3184,7 +3188,8 @@ static void perf_evsel_menu__write(struct ui_browser *browser,static int perf_evsel_menu__run (struct perf_evsel_menu *menu,int nr_events,const char *help, -struct hist_browser_timer *hbt) +struct hist_browser_timer *hbt, +bool warn_lost_event) {struct perf_evlist *evlist = menu->b.priv;struct perf_evsel *pos;
@@ -3203,7 +3208,9 @@ static int perf_evsel_menu__run(struct perf_evsel_menu *menu,case K_TIMER : hbt->timer (hbt->arg); -if (!menu->lost_events_warned && menu->lost_events) { +if (!menu->lost_events_warned && + menu->lost_events && + warn_lost_event) {ui_browser__warn_lost_events (&menu->b); menu->lost_events_warned = true; }
@@ -3224,7 +3231,8 @@ static int perf_evsel_menu__run(struct perf_evsel_menu *menu, key =perf_evsel__hists_browse (pos, nr_events, help, true, hbt, menu->min_pcnt, - menu->env); + menu->env, + warn_lost_event);ui_browser__show_title (&menu->b, title);switch (key) {case K_TAB :
@@ -3282,7 +3290,8 @@ static int __perf_evlist__tui_browse_hists(struct perf_evlist *evlist, int nr_entries, const char *help, struct hist_browser_timer *hbt, float min_pcnt, - struct perf_env *env) + struct perf_env *env, + bool warn_lost_event) { struct perf_evsel *pos; struct perf_evsel_menu menu = {
@@ -3309,13 +3318,15 @@ static int __perf_evlist__tui_browse_hists(struct perf_evlist *evlist, menu.b.width = line_len; } -return perf_evsel_menu__run (&menu, nr_entries, help, hbt); +return perf_evsel_menu__run (&menu, nr_entries, help, + hbt, warn_lost_event); }int perf_evlist__tui_browse_hists (struct perf_evlist *evlist,const char *help,struct hist_browser_timer *hbt,float min_pcnt, -struct perf_env *env) +struct perf_env *env, +bool warn_lost_event) {int nr_entries = evlist->nr_entries;
@@ -3325,7 +3336,7 @@ int perf_evlist__tui_browse_hists(struct perf_evlist *evlist, const char *help,return perf_evsel__hists_browse (first, nr_entries, help, false, hbt, min_pcnt, - env); + env, warn_lost_event); }if (symbol_conf.event_group) {
@@ -3342,5 +3353,6 @@ int perf_evlist__tui_browse_hists(struct perf_evlist *evlist, const char *help, }return __perf_evlist__tui_browse_hists (evlist, nr_entries, help, - hbt, min_pcnt, env); + hbt, min_pcnt, env, + warn_lost_event); }
tools/perf/ui/browsers/hists.h +2 -1
@@ -28,7 +28,8 @@ struct hist_browser {struct hist_browser *hist_browser__new (struct hists *hists);void hist_browser__delete (struct hist_browser *browser); -int hist_browser__run (struct hist_browser *browser,const char *help); +int hist_browser__run (struct hist_browser *browser,const char *help, +bool warn_lost_event);void hist_browser__init (struct hist_browser *browser,struct hists *hists);#endif /* _PERF_UI_BROWSER_HISTS_H_ */
tools/perf/util/hist.h +4 -2
@@ -430,7 +430,8 @@ int hist_entry__tui_annotate(struct hist_entry *he, struct perf_evsel *evsel,int perf_evlist__tui_browse_hists (struct perf_evlist *evlist,const char *help,struct hist_browser_timer *hbt,float min_pcnt, -struct perf_env *env); +struct perf_env *env, +bool warn_lost_event);int script_browse (const char *script_opt);#else static inline
@@ -438,7 +439,8 @@ int perf_evlist__tui_browse_hists(struct perf_evlist *evlist __maybe_unused,const char *help__maybe_unused , struct hist_browser_timer *hbt __maybe_unused, float min_pcnt __maybe_unused, - struct perf_env *env __maybe_unused) + struct perf_env *env __maybe_unused, + bool warn_lost_event __maybe_unused) { return 0; }
Signature · 1 line
2.14.3
Arnaldo Carvalho de Melo
maintainerPATCH 16/21 perf top: Remove lost events checking
In reply to Arnaldo Carvalho de MeloFrom: Kan Liang <[email protected]>
There would be some records lost in overwrite mode because of pausing the ringbuffer. It has little impact for the accuracy of the snapshot and could be tolerated by 'perf top'.
Remove the lost events checking.
--- tools/perf/builtin-top.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-)
tools/perf/builtin-top.c +5 -3
@@ -283,8 +283,9 @@ static void perf_top__print_sym_table(struct perf_top *top)printf ("%-*.*s\n" , win_width, win_width, graph_dotted_line); -if (hists->stats.nr_lost_warned != - hists->stats.nr_events[PERF_RECORD_LOST ]) { +if (!top->record_opts.overwrite && + (hists->stats.nr_lost_warned != + hists->stats.nr_events[PERF_RECORD_LOST ])) { hists->stats.nr_lost_warned = hists->stats.nr_events[PERF_RECORD_LOST ]; color_fprintf(stdout, PERF_COLOR_RED,
@@ -611,7 +612,8 @@ static void *display_thread_tui(void *arg)perf_evlist__tui_browse_hists (top->evlist, help, &hbt, top->min_percent, - &top->session->header.env, true); + &top->session->header.env, + !top->record_opts.overwrite); done =1 ;return NULL ;
Signature · 1 line
2.14.3
Arnaldo Carvalho de Melo
maintainerPATCH 17/21 perf top: Switch default mode to overwrite mode
In reply to Arnaldo Carvalho de MeloFrom: Kan Liang <[email protected]>
perf_top__mmap_read() has a severe performance issue in the Knights Landing/Mill platform, when monitoring heavy load systems. It costs several minutes to finish, which is unacceptable.
Currently, 'perf top' uses the non overwrite mode. For non overwrite mode, it tries to read everything in the ringbuffer and doesn't pause it. Once there are lots of samples delivered persistently, the processing time could be very long. Also, the latest samples could be lost when the ringbuffer is full.
For overwrite mode, it takes a snapshot for the system by pausing the ringbuffer, which could significantly reduce the processing time. Also, the overwrite mode always keep the latest samples. Considering the real time requirement for 'perf top', the overwrite mode is more suitable for it.
Actually, 'perf top' was overwrite mode. It is changed to non overwrite mode since commit 93fc64f14472 ("perf top: Switch to non overwrite mode"). It's better to change it back to overwrite mode by default.
For the kernel which doesn't support overwrite mode, it will fall back to non overwrite mode.
There would be some records lost in overwrite mode because of pausing the ringbuffer. It has little impact for the accuracy of the snapshot and can be tolerated.
For overwrite mode, unconditionally wait 100 ms before each snapshot. It also reduces the overhead caused by pausing ringbuffer, especially on light load system.
--- tools/perf/builtin-top.c | 34 +++++++++++++++++++++++++--------- 1 file changed, 25 insertions(+), 9 deletions(-)
tools/perf/builtin-top.c +25 -9
@@ -809,15 +809,23 @@ static void perf_event__process_sample(struct perf_tool *tool,static void perf_top__mmap_read_idx (struct perf_top *top,int idx) { +struct record_opts *opts = &top->record_opts; +struct perf_evlist *evlist = top->evlist;struct perf_sample sample;struct perf_evsel *evsel; +struct perf_mmap *md;struct perf_session *session = top->session;union perf_event *event;struct machine *machine; +u64 end, start;int ret; -while ((event =perf_evlist__mmap_read (top->evlist, idx)) !=NULL ) { - ret =perf_evlist__parse_sample (top->evlist, event, &sample); + md = opts->overwrite ? &evlist->overwrite_mmap[idx] : &evlist->mmap[idx]; +if (perf_mmap__read_init (md, opts->overwrite, &start, &end) <0 ) +return ; + +while ((event =perf_mmap__read_event (md, opts->overwrite, &start, end)) !=NULL ) { + ret =perf_evlist__parse_sample (evlist, event, &sample);if (ret) {pr_err ("Can't parse sample, err = %d\n" , ret); goto next_event;
@@ -871,16 +879,28 @@ static void perf_top__mmap_read_idx(struct perf_top *top, int idx) }else ++session->evlist->stats.nr_unknown_events; next_event: -perf_evlist__mmap_consume (top->evlist, idx); +perf_mmap__consume (md, opts->overwrite); } + +perf_mmap__read_done (md); }static void perf_top__mmap_read (struct perf_top *top) { +bool overwrite = top->record_opts.overwrite; +struct perf_evlist *evlist = top->evlist;int i; +if (overwrite) +perf_evlist__toggle_bkw_mmap (evlist,BKW_MMAP_DATA_PENDING ); +for (i =0 ; i < top->evlist->nr_mmaps; i++)perf_top__mmap_read_idx (top, i); + +if (overwrite) { +perf_evlist__toggle_bkw_mmap (evlist,BKW_MMAP_EMPTY ); +perf_evlist__toggle_bkw_mmap (evlist,BKW_MMAP_RUNNING ); + } }/*
@@ -979,11 +999,6 @@ static int perf_top__start_counters(struct perf_top *top) goto out_err; } -if (opts->overwrite) { -ui__error ("not support overwrite mode yet\n" ); - goto out_err; - } -perf_evlist__config (evlist, opts, &callchain_param);evlist__for_each_entry (evlist, counter) {
@@ -1144,7 +1159,7 @@ static int __cmd_top(struct perf_top *top)perf_top__mmap_read (top); -if (hits == top->samples) +if (opts->overwrite || (hits == top->samples)) ret =perf_evlist__poll (top->evlist,100 );if (resize) {
@@ -1238,6 +1253,7 @@ int cmd_top(int argc, const char **argv) .uses_mmap = true, }, .proc_map_timeout = 500, + .overwrite = 1, }, .max_stack = sysctl_perf_event_max_stack, .sym_pcnt_filter = 5,
Signature · 1 line
2.14.3
Arnaldo Carvalho de Melo
maintainerPATCH 18/21 perf top: Check the latency of perf_top__mmap_read()
In reply to Arnaldo Carvalho de MeloFrom: Kan Liang <[email protected]>
The latency of perf_top__mmap_read() should be lower than refresh time. If not, give some hints to reduce the latency.
--- tools/perf/builtin-top.c | 9 +++++++++ 1 file changed, 9 insertions(+)
tools/perf/builtin-top.c +9 -0
@@ -889,8 +889,10 @@ static void perf_top__mmap_read(struct perf_top *top) {bool overwrite = top->record_opts.overwrite;struct perf_evlist *evlist = top->evlist; +unsigned long long start, end;int i; + start =rdclock ();if (overwrite)perf_evlist__toggle_bkw_mmap (evlist,BKW_MMAP_DATA_PENDING );
@@ -901,6 +903,13 @@ static void perf_top__mmap_read(struct perf_top *top)perf_evlist__toggle_bkw_mmap (evlist,BKW_MMAP_EMPTY );perf_evlist__toggle_bkw_mmap (evlist,BKW_MMAP_RUNNING ); } + end =rdclock (); + +if ((end - start) > (unsigned long long )top->delay_secs *NSEC_PER_SEC ) +ui__warning ("Too slow to read ring buffer.\n" +"Please try increasing the period (-c) or\n" +"decreasing the freq (-F) or\n" +"limiting the number of CPUs (-C)\n" ); }/*
Signature · 1 line
2.14.3
Arnaldo Carvalho de Melo
maintainerPATCH 19/21 perf tools: Substitute yet another strtoull()
In reply to Arnaldo Carvalho de MeloFrom: Andy Shevchenko <[email protected]>
Instead of home grown function let's use what library provides us.
--- tools/perf/util/util.c | 24 ++---------------------- 1 file changed, 2 insertions(+), 22 deletions(-)
tools/perf/util/util.c +2 -22
@@ -340,35 +340,15 @@ size_t hex_width(u64 v)return n; } -static int hex (char ch) -{ -if ((ch >='0' ) && (ch <='9' )) -return ch -'0' ; -if ((ch >='a' ) && (ch <='f' )) -return ch -'a' +10 ; -if ((ch >='A' ) && (ch <='F' )) -return ch -'A' +10 ; -return -1 ; -} -/* * While we find nice hex chars, build a long_val. * Return number of chars processed. */ int hex2u64 (const char *ptr,u64 *long_val) { -const char *p = ptr; - *long_val =0 ; - -while (*p) { -const int hex_val =hex (*p); +char *p; -if (hex_val <0 ) -break ; - - *long_val = (*long_val <<4 ) | hex_val; - p++; - } + *long_val =strtoull (ptr, &p,16 );return p - ptr; }
Signature · 1 line
2.14.3
Arnaldo Carvalho de Melo
maintainerPATCH 20/21 perf data: Document missing --force option
In reply to Arnaldo Carvalho de MeloFrom: Sangwon Hong <[email protected]>
Add the --force option to the man page.
--- tools/perf/Documentation/perf-data.txt | 4 ++++ 1 file changed, 4 insertions(+)
tools/perf/Documentation/perf-data.txt +4 -0
@@ -30,6 +30,10 @@ OPTIONS for 'convert' -i:: Specify input perf data file path. +-f:: +--force:: + Don't complain, do it. + -v:: --verbose:: Be more verbose (show counter open errors, etc).
Signature · 1 line
2.14.3
Arnaldo Carvalho de Melo
maintainerPATCH 21/21 perf test: Fix test trace+probe_libc_inet_pton.sh for s390x
In reply to Arnaldo Carvalho de MeloFrom: Thomas Richter <[email protected]>
On Intel test case trace+probe_libc_inet_pton.sh succeeds and the output is:
[root@f27 perf]# ./perf trace --no-syscalls
-e probe_libc:inet_pton/max-stack=3/ ping -6 -c 1 ::1
PING ::1(::1) 56 data bytes
64 bytes from ::1: icmp_seq=1 ttl=64 time=0.037 ms
--- ::1 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms rtt min/avg/max/mdev = 0.037/0.037/0.037/0.000 ms
0.000 probe_libc:inet_pton:(7fa40ac618a0))
__GI___inet_pton (/usr/lib64/libc-2.26.so)
getaddrinfo (/usr/lib64/libc-2.26.so)
main (/usr/bin/ping)The kernel stack unwinder is used, it is specified implicitly as call-graph=fp (frame pointer).
On s390x only dwarf is available for stack unwinding. It is also done in user space. This requires different parameter setup and result checking for s390x and Intel.
This patch adds separate perf trace setup and result checking for Intel and s390x. On s390x specify this command line to get a call-graph and handle the different call graph result checking:
[root@s35lp76 perf]# ./perf trace --no-syscalls
-e probe_libc:inet_pton/call-graph=dwarf/ ping -6 -c 1 ::1
PING ::1(::1) 56 data bytes
64 bytes from ::1: icmp_seq=1 ttl=64 time=0.041 ms
--- ::1 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms rtt min/avg/max/mdev = 0.041/0.041/0.041/0.000 ms
0.000 probe_libc:inet_pton:(3ffb9942060))
__GI___inet_pton (/usr/lib64/libc-2.26.so)
gaih_inet (inlined)
__GI_getaddrinfo (inlined)
main (/usr/bin/ping)
__libc_start_main (/usr/lib64/libc-2.26.so)
_start (/usr/bin/ping)[root@s35lp76 perf]#
Before:
[root@s8360047 perf]# ./perf test -vv 58
58: probe libc's inet_pton & backtrace it with ping :
--- start ---
test child forked, pid 26349
PING ::1(::1) 56 data bytes
64 bytes from ::1: icmp_seq=1 ttl=64 time=0.079 ms
--- ::1 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms rtt min/avg/max/mdev = 0.079/0.079/0.079/0.000 ms 0.000 probe_libc:inet_pton:(3ff925c2060))
test child finished with -1
---- end ----
probe libc's inet_pton & backtrace it with ping: FAILED! [root@s8360047 perf]#
After:
[root@s35lp76 perf]# ./perf test -vv 57
57: probe libc's inet_pton & backtrace it with ping :
--- start ---
test child forked, pid 38708
PING ::1(::1) 56 data bytes
64 bytes from ::1: icmp_seq=1 ttl=64 time=0.038 ms
--- ::1 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms rtt min/avg/max/mdev = 0.038/0.038/0.038/0.000 ms 0.000 probe_libc:inet_pton:(3ff87342060)) __GI___inet_pton (/usr/lib64/libc-2.26.so) gaih_inet (inlined)__GI_getaddrinfo (inlined)
main (/usr/bin/ping)__libc_start_main (/usr/lib64/libc-2.26.so)_start (/usr/bin/ping)
test child finished with 0
---- end ----
probe libc's inet_pton & backtrace it with ping: Ok [root@s35lp76 perf]#
On Intel the test case runs unchanged and succeeds.
--- .../perf/tests/shell/trace+probe_libc_inet_pton.sh | 23 +++++++++++++++++----- 1 file changed, 18 insertions(+), 5 deletions(-)
tools/perf/tests/shell/trace+probe_libc_inet_pton.sh +18 -5
@@ -22,10 +22,23 @@ trace_libc_inet_pton_backtrace() { expected[4]="rtt min.*" expected[5]="[0-9]+\.[0-9]+[[:space:]]+probe_libc:inet_pton:\([[:xdigit:]]+\)" expected[6]=".*inet_pton[[:space:]]\($libc\)$" - expected[7]="getaddrinfo[[:space:]]\($libc\)$" - expected[8]=".*\(.*/bin/ping.*\)$" - - perf trace --no-syscalls -e probe_libc:inet_pton/max-stack=3/ ping -6 -c 1 ::1 2>&1 | grep -v ^$ | while read line ; do + case "$(uname -m)" in + s390x) + eventattr='call-graph=dwarf' + expected[7]="gaih_inet[[:space:]]\(inlined\)$" + expected[8]="__GI_getaddrinfo[[:space:]]\(inlined\)$" + expected[9]="main[[:space:]]\(.*/bin/ping.*\)$" + expected[10]="__libc_start_main[[:space:]]\($libc\)$" + expected[11]="_start[[:space:]]\(.*/bin/ping.*\)$" + ;; + *) + eventattr='max-stack=3' + expected[7]="getaddrinfo[[:space:]]\($libc\)$" + expected[8]=".*\(.*/bin/ping.*\)$" + ;; + esac + + perf trace --no-syscalls -e probe_libc:inet_pton/$eventattr/ ping -6 -c 1 ::1 2>&1 | grep -v ^$ | while read line ; do echo $line echo "$line" | egrep -q "${expected[$idx]}" if [ $? -ne 0 ] ; then
@@ -33,7 +46,7 @@ trace_libc_inet_pton_backtrace() { exit 1 fi let idx+=1 - [ $idx -eq 9 ] && break + [ -z "${expected[$idx]}" ] && break done }
Signature · 1 line
2.14.3
PATCH 1/1 tools/headers: Synchronize kernel ABI headers, v4.16-rc1
In reply to Arnaldo Carvalho de MeloQuoted 91 lines · Arnaldo Carvalho de Melo
Hi Ingo,
Please consider pulling,
- Arnaldo
Test results at the end of this message, as usual.
The following changes since commit
33ea4b24277b06dbc55d7f5772a46f029600255e:perf/core: Implement the '
perf_uprobe' PMU (2018-02-06 11:29:28 +0100)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-20180206for you to fetch changes up to
52a37001d51a320c1019269fb3ba473a1363650d:perf test: Fix test
trace+probe_libc_inet_pton.shfor s390x (2018-02-06 10:46:58 -0300)----------------------------------------------------------------
perf/core improvements and fixes:-
perf_mmapoverwrite mode overhaul, prep work to get 'perf top' using it, making it bearable to use it in large core count systems such as Knights Landing/Mill Intel systems (Kan Liang)- Add perf vendor JSON metrics for ARM Cortex-A53 Processor (William Cohen)
- Use
strtoull()instead of home grown function (Andy Shevchenko)- Document missing 'perf data --force' option (Sangwon Hong)
Signed-off-by Arnaldo Carvalho de Melo <[email protected]>----------------------------------------------------------------
Andy Shevchenko (1):
perf tools: Substitute yet anotherstrtoull()Arnaldo Carvalho de Melo (1):
perf evsel: Expose theperf_missing_featuresstructKan Liang (16):
perf evlist: Remove stale mmap read for backward
perf mmap: Recalculate size for overwrite mode
perf mmap: Cleanupperf_mmap__push()
perf mmap: Introduceperf_mmap__read_init()
perf mmap: Add new return value logic forperf_mmap__read_init()perf mmap: Discard 'prev' inperf_mmap__read()
perf mmap: Introduceperf_mmap__read_done()
perf mmap: Introduceperf_mmap__read_event()
perf test: Update mmap read functions for backward-ring-buffer test perf mmap: Discard legacy interface for mmap read
perf top: Check per-event overwrite term
perf top: Add overwrite fall back
perf hists browser: Add parameter to disable lost event warning perf top: Remove lost events checking
perf top: Switch default mode to overwrite mode
perf top: Check the latency ofperf_top__mmap_read()Sangwon Hong (1):
perf data: Document missing --force optionThomas Richter (1):
perf test: Fix test trace+probe_libc_inet_pton.sh for s390xWilliam Cohen (1):
perf vendor events aarch64: Add JSON metrics for ARM Cortex-A53 Processortools/perf/Documentation/perf-data.txt | 4 + tools/perf/builtin-c2c.c | 4 +- tools/perf/builtin-report.c | 3 +- tools/perf/builtin-top.c | 150 ++++++++++++++++++++- .../pmu-events/arch/arm64/cortex-a53/branch.json | 27 ++++ .../perf/pmu-events/arch/arm64/cortex-a53/bus.json | 22 +++ .../pmu-events/arch/arm64/cortex-a53/cache.json | 27 ++++ .../pmu-events/arch/arm64/cortex-a53/memory.json | 22 +++ .../pmu-events/arch/arm64/cortex-a53/other.json | 32 +++++ .../pmu-events/arch/arm64/cortex-a53/pipeline.json | 52 +++++++ tools/perf/pmu-events/arch/arm64/mapfile.csv | 1 + tools/perf/tests/backward-ring-buffer.c | 7 +- .../perf/tests/shell/trace+probe_libc_inet_pton.sh | 23 +++- tools/perf/ui/browsers/hists.c | 38 ++++-- tools/perf/ui/browsers/hists.h | 3 +- tools/perf/util/evlist.c | 17 --- tools/perf/util/evlist.h | 4 - tools/perf/util/evsel.c | 12 +- tools/perf/util/evsel.h | 14 ++ tools/perf/util/hist.h | 6 +- tools/perf/util/mmap.c | 141 ++++++++++--------- tools/perf/util/mmap.h | 10 +-
Quoted 8 lines
tools/perf/util/util.c | 24 +--- 23 files changed, 492 insertions(+), 151 deletions(-) create mode 100644 tools/perf/pmu-events/arch/arm64/cortex-a53/branch.json create mode 100644 tools/perf/pmu-events/arch/arm64/cortex-a53/bus.json create mode 100644 tools/perf/pmu-events/arch/arm64/cortex-a53/cache.json create mode 100644 tools/perf/pmu-events/arch/arm64/cortex-a53/memory.json create mode 100644 tools/perf/pmu-events/arch/arm64/cortex-a53/other.json create mode 100644 tools/perf/pmu-events/arch/arm64/cortex-a53/pipeline.json
Pulled into tip:perf/urgent, thanks a lot Arnaldo!
Note, I also performed a header sync with v4.16-rc1, see the patch below.
The only exception is:
Warning: Kernel ABI header at 'tools/arch/s390/include/uapi/asm/unistd.h' differs from latest version at 'arch/s390/include/uapi/asm/unistd.h'
... which I'm unsure how to resolve: the new upstream header includes unistd_64.h, but neither s390 nor asm-generic has no such a file.
Thanks,
Ingo
===================>
From a408361b6aa182d9defc0ffed71936b9bc41f0db Mon Sep 17 00:00:00 2001
From: Ingo Molnar <[email protected]>
Date: Tue, 13 Feb 2018 12:54:58 +0100
Subject: [PATCH] tools/headers: Synchronize kernel ABI headers, v4.16-rc1
Sync the following tooling headers with the latest kernel version:
tools/arch/powerpc/include/uapi/asm/kvm.h
tools/arch/x86/include/asm/cpufeatures.h
tools/include/uapi/drm/i915_drm.h
tools/include/uapi/linux/if_link.h
tools/include/uapi/linux/kvm.h
All the changes are new ABI additions which don't impact their use in existing tooling.
--- tools/arch/powerpc/include/uapi/asm/kvm.h | 2 + tools/arch/x86/include/asm/cpufeatures.h | 1 + tools/include/uapi/drm/i915_drm.h | 77 ++++++++++++++++++++++++++ tools/include/uapi/linux/if_link.h | 1 + tools/include/uapi/linux/kvm.h | 90 +++++++++++++++++++++++++++++++ 5 files changed, 171 insertions(+)
tools/arch/powerpc/include/uapi/asm/kvm.h +2 -0
@@ -632,6 +632,8 @@ struct kvm_ppc_cpu_char {#define KVM_REG_PPC_TIDR (KVM_REG_PPC | KVM_REG_SIZE_U64 | 0xbc)#define KVM_REG_PPC_PSSCR (KVM_REG_PPC | KVM_REG_SIZE_U64 | 0xbd) +#define KVM_REG_PPC_DEC_EXPIRY (KVM_REG_PPC | KVM_REG_SIZE_U64 | 0xbe) +/* Transactional Memory checkpointed state: * This is all GPRs, all VSX regs and a subset of SPRs */
tools/arch/x86/include/asm/cpufeatures.h +1 -0
@@ -210,6 +210,7 @@#define X86_FEATURE_MBA ( 7*32+18)/* Memory Bandwidth Allocation */ #define X86_FEATURE_RSB_CTXSW ( 7*32+19)/* "" Fill RSB on context switches */ +#define X86_FEATURE_SEV ( 7*32+20)/* AMD Secure Encrypted Virtualization */ #define X86_FEATURE_USE_IBPB ( 7*32+21)/* "" Indirect Branch Prediction Barrier enabled */
tools/include/uapi/drm/i915_drm.h +77 -0
89 lines not on this page · raw message
tools/include/uapi/linux/if_link.h +1 -0
@@ -163,6 +163,7 @@ enum {IFLA_IF_NETNSID ,IFLA_CARRIER_UP_COUNT ,IFLA_CARRIER_DOWN_COUNT , +IFLA_NEW_IFINDEX , __IFLA_MAX };
tools/include/uapi/linux/kvm.h +90 -0
96 lines not on this page · raw message
Arnaldo Carvalho de Melo
maintainerRe: [PATCH] tools/headers: Synchronize kernel ABI headers, v4.16-rc1
Em Tue, Feb 13, 2018 at 12:59:53PM +0100, Ingo Molnar escreveu:
Quoted 105 lines · Arnaldo Carvalho de Melo
Quoted 92 lines
Hi Ingo,
Please consider pulling,
- Arnaldo
Test results at the end of this message, as usual.
The following changes since commit
33ea4b24277b06dbc55d7f5772a46f029600255e:perf/core: Implement the '
perf_uprobe' PMU (2018-02-06 11:29:28 +0100)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-20180206for you to fetch changes up to
52a37001d51a320c1019269fb3ba473a1363650d:perf test: Fix test
trace+probe_libc_inet_pton.shfor s390x (2018-02-06 10:46:58 -0300)----------------------------------------------------------------
perf/core improvements and fixes:-
perf_mmapoverwrite mode overhaul, prep work to get 'perf top' using it, making it bearable to use it in large core count systems such as Knights Landing/Mill Intel systems (Kan Liang)- Add perf vendor JSON metrics for ARM Cortex-A53 Processor (William Cohen)
- Use
strtoull()instead of home grown function (Andy Shevchenko)- Document missing 'perf data --force' option (Sangwon Hong)
Signed-off-by Arnaldo Carvalho de Melo <[email protected]>----------------------------------------------------------------
Andy Shevchenko (1):
perf tools: Substitute yet anotherstrtoull()Arnaldo Carvalho de Melo (1):
perf evsel: Expose theperf_missing_featuresstructKan Liang (16):
perf evlist: Remove stale mmap read for backward
perf mmap: Recalculate size for overwrite mode
perf mmap: Cleanupperf_mmap__push()
perf mmap: Introduceperf_mmap__read_init()
perf mmap: Add new return value logic forperf_mmap__read_init()perf mmap: Discard 'prev' inperf_mmap__read()
perf mmap: Introduceperf_mmap__read_done()
perf mmap: Introduceperf_mmap__read_event()
perf test: Update mmap read functions for backward-ring-buffer test perf mmap: Discard legacy interface for mmap read
perf top: Check per-event overwrite term
perf top: Add overwrite fall back
perf hists browser: Add parameter to disable lost event warning perf top: Remove lost events checking
perf top: Switch default mode to overwrite mode
perf top: Check the latency ofperf_top__mmap_read()Sangwon Hong (1):
perf data: Document missing --force optionThomas Richter (1):
perf test: Fix test trace+probe_libc_inet_pton.sh for s390xWilliam Cohen (1):
perf vendor events aarch64: Add JSON metrics for ARM Cortex-A53 Processortools/perf/Documentation/perf-data.txt | 4 + tools/perf/builtin-c2c.c | 4 +- tools/perf/builtin-report.c | 3 +- tools/perf/builtin-top.c | 150 ++++++++++++++++++++- .../pmu-events/arch/arm64/cortex-a53/branch.json | 27 ++++ .../perf/pmu-events/arch/arm64/cortex-a53/bus.json | 22 +++ .../pmu-events/arch/arm64/cortex-a53/cache.json | 27 ++++ .../pmu-events/arch/arm64/cortex-a53/memory.json | 22 +++ .../pmu-events/arch/arm64/cortex-a53/other.json | 32 +++++ .../pmu-events/arch/arm64/cortex-a53/pipeline.json | 52 +++++++ tools/perf/pmu-events/arch/arm64/mapfile.csv | 1 + tools/perf/tests/backward-ring-buffer.c | 7 +- .../perf/tests/shell/trace+probe_libc_inet_pton.sh | 23 +++- tools/perf/ui/browsers/hists.c | 38 ++++-- tools/perf/ui/browsers/hists.h | 3 +- tools/perf/util/evlist.c | 17 --- tools/perf/util/evlist.h | 4 - tools/perf/util/evsel.c | 12 +- tools/perf/util/evsel.h | 14 ++ tools/perf/util/hist.h | 6 +- tools/perf/util/mmap.c | 141 ++++++++++--------- tools/perf/util/mmap.h | 10 +-Quoted 8 lines
tools/perf/util/util.c | 24 +--- 23 files changed, 492 insertions(+), 151 deletions(-) create mode 100644 tools/perf/pmu-events/arch/arm64/cortex-a53/branch.json create mode 100644 tools/perf/pmu-events/arch/arm64/cortex-a53/bus.json create mode 100644 tools/perf/pmu-events/arch/arm64/cortex-a53/cache.json create mode 100644 tools/perf/pmu-events/arch/arm64/cortex-a53/memory.json create mode 100644 tools/perf/pmu-events/arch/arm64/cortex-a53/other.json create mode 100644 tools/perf/pmu-events/arch/arm64/cortex-a53/pipeline.jsonPulled into tip:perf/urgent, thanks a lot Arnaldo!
Quoted 8 lines
Note, I also performed a header sync with v4.16-rc1, see the patch below.
The only exception is:
Warning: Kernel ABI header at '
tools/arch/s390/include/uapi/asm/unistd.h' differs from latest version at 'arch/s390/include/uapi/asm/unistd.h'... which I'm unsure how to resolve: the new upstream header includes
unistd_64.h, but neither s390 nor asm-generic has no such a file.
There is a patch for that from Hendrik, IIRC, I'll merge it. They worked on making the syscall table generation process to be similar to the one used in x86_64 after being exposed to it by means of how 'perf trace' creates its id->string syscall tables.
- Arnaldo