perf tools changes for v5.10: 1st batch
- cgroup improvements for 'perf stat', allowing for compact specification of events and cgroups in the command line. - Support per thread topdown metrics in 'perf stat'. - Support sample-read topdown metric group in 'perf record' - Show start of latency in addition to its start in 'perf sched latency'. - Add min, max to 'perf script' futex-contention output, in addition to avg. - Allow usage of 'perf_event_attr->exclusive' attribute via the new ':e' event modifier. - Add 'snapshot' command to 'perf record --control', using it with Intel PT. - Support FIFO file names as alternative options to 'perf record --control'. - Introduce branch history "streams", to compare 'perf record' runs with 'perf diff' based on branch records and report hot streams. - Support PE executable symbol tables using libbfd, to profile, for instance, wine binaries. - Add filter support for option 'perf ftrace -F/--funcs'. - Allow configuring the 'disassembler_style' 'perf annotate' knob via 'perf config' - Update CascadelakeX and SkylakeX JSON vendor events files. - Add support for parsing perchip/percore JSON vendor events. - Add power9 hv_24x7 core level metric events. - Add L2 prefetch, ITLB instruction fetch hits JSON events for AMD zen1. - Enable Family 19h users by matching Zen2 AMD vendor events. - Use debuginfod in 'perf probe' when required debug files not found locally. - Display negative tid in non-sample events in 'perf script'. - Make GTK2 support opt-in - Add build test with GTK+ - Add missing -lzstd to the fast path feature detection - Add scripts to auto generate 'mmap', 'mremap' string<->id tables for use in 'perf trace'. - Show python test script in verbose mode. - Fix uncore metric expressions - Msan uninitialized use fixes. - Use condition variables in 'perf bench numa' - Autodetect python3 binary in systems without python2. - Support md5 build ids in addition to sha1. - Add build id 'perf test' regression test. - Fix printable strings in python3 scripts. - Fix off by ones in 'perf trace' in arches using libaudit. - Fix JSON event code for events referencing std arch events. - Introduce 'perf test' shell script for Arm CoreSight testing. - Add rdtsc() for Arm64 for used in the PERF_RECORD_TIME_CONV metadata event and in 'perf test tsc'. - 'perf c2c' improvements: Add "RMT Load Hit" metric, "Total Stores", fixes and documentation update. - Fix usage of reloc_sym in 'perf probe' when using both kallsyms and debuginfo files. - Do not print 'Metric Groups:' unnecessarily in 'perf list' - Refcounting fixes in the event parsing code. - Add expand cgroup event 'perf test' entry. - Fix out of bounds CPU map access when handling armv8_pmu events in 'perf stat'. - Add build-id injection 'perf bench' benchmark. - Enter namespace when reading build-id in 'perf inject'. - Do not load map/dso when injecting build-id speeding up the 'perf inject' process. - Add --buildid-all option to avoid processing all samples, just the mmap metadata events. - Add feature test to check if libbfd has buildid support - Add 'perf test' entry for PE binary format support. - Fix typos in power8 PMU vendor events JSON files. - Hide libtraceevent non API functions. Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com> Test results: The first ones are container based builds of tools/perf with and without libelf support. Where clang is available, it is also used to build perf with/without libelf, and building with LIBCLANGLLVM=1 (built-in clang) with gcc and clang when clang and its devel libraries are installed. The objtool and samples/bpf/ builds are disabled now that I'm switching from using the sources in a local volume to fetching them from a http server to build it inside the container, to make it easier to build in a container cluster. Those will come back later. Several are cross builds, the ones with -x-ARCH and the android one, and those may not have all the features built, due to lack of multi-arch devel packages, available and being used so far on just a few, like debian:experimental-x-{arm64,mipsel}. The 'perf test' one will perform a variety of tests exercising tools/perf/util/, tools/lib/{bpf,traceevent,etc}, as well as run perf commands with a variety of command line event specifications to then intercept the sys_perf_event syscall to check that the perf_event_attr fields are set up as expected, among a variety of other unit tests. Then there is the 'make -C tools/perf build-test' ones, that build tools/perf/ with a variety of feature sets, exercising the build with an incomplete set of features as well as with a complete one. It is planned to have it run on each of the containers mentioned above, using some container orchestration infrastructure. Get in contact if interested in helping having this in place. $ grep "model name" -m1 /proc/cpuinfo model name: AMD Ryzen 9 3900X 12-Core Processor $ export PERF_TARBALL=http://192.168.122.1/perf/perf-5.9.0-rc7.tar.xz $ dm Thu 15 Oct 2020 01:10:56 PM -03 1 67.40 alpine:3.4 : Ok gcc (Alpine 5.3.0) 5.3.0, clang version 3.8.0 (tags/RELEASE_380/final) 2 69.01 alpine:3.5 : Ok gcc (Alpine 6.2.1) 6.2.1 20160822, clang version 3.8.1 (tags/RELEASE_381/final) 3 70.79 alpine:3.6 : Ok gcc (Alpine 6.3.0) 6.3.0, clang version 4.0.0 (tags/RELEASE_400/final) 4 79.89 alpine:3.7 : Ok gcc (Alpine 6.4.0) 6.4.0, Alpine clang version 5.0.0 (tags/RELEASE_500/final) (based on LLVM 5.0.0) 5 80.88 alpine:3.8 : Ok gcc (Alpine 6.4.0) 6.4.0, Alpine clang version 5.0.1 (tags/RELEASE_501/final) (based on LLVM 5.0.1) 6 83.88 alpine:3.9 : Ok gcc (Alpine 8.3.0) 8.3.0, Alpine clang version 5.0.1 (tags/RELEASE_502/final) (based on LLVM 5.0.1) 7 107.87 alpine:3.10 : Ok gcc (Alpine 8.3.0) 8.3.0, Alpine clang version 8.0.0 (tags/RELEASE_800/final) (based on LLVM 8.0.0) 8 115.43 alpine:3.11 : Ok gcc (Alpine 9.3.0) 9.3.0, Alpine clang version 9.0.0 (https://git.alpinelinux.org/aports f7f0d2c2b8bcd6a5843401a9a702029556492689) (based on LLVM 9.0.0) 9 106.80 alpine:3.12 : Ok gcc (Alpine 9.3.0) 9.3.0, Alpine clang version 10.0.0 (https://gitlab.alpinelinux.org/alpine/aports.git 7445adce501f8473efdb93b17b5eaf2f1445ed4c) 10 114.06 alpine:edge : Ok gcc (Alpine 10.2.0) 10.2.0, Alpine clang version 10.0.1 11 70.42 alt:p8 : Ok x86_64-alt-linux-gcc (GCC) 5.3.1 20151207 (ALT p8 5.3.1-alt3.M80P.1), clang version 3.8.0 (tags/RELEASE_380/final) 12 98.70 alt:p9 : Ok x86_64-alt-linux-gcc (GCC) 8.4.1 20200305 (ALT p9 8.4.1-alt0.p9.1), clang version 10.0.0 13 80.37 alt:sisyphus : Ok x86_64-alt-linux-gcc (GCC) 9.3.1 20200518 (ALT Sisyphus 9.3.1-alt1), clang version 10.0.1 14 64.12 amazonlinux:1 : Ok gcc (GCC) 7.2.1 20170915 (Red Hat 7.2.1-2), clang version 3.6.2 (tags/RELEASE_362/final) 15 97.64 amazonlinux:2 : Ok gcc (GCC) 7.3.1 20180712 (Red Hat 7.3.1-9), clang version 7.0.1 (Amazon Linux 2 7.0.1-1.amzn2.0.2) 16 22.70 android-ndk:r12b-arm : Ok arm-linux-androideabi-gcc (GCC) 4.9.x 20150123 (prerelease) 17 22.72 android-ndk:r15c-arm : Ok arm-linux-androideabi-gcc (GCC) 4.9.x 20150123 (prerelease) 18 26.70 centos:6 : Ok gcc (GCC) 4.4.7 20120313 (Red Hat 4.4.7-23) 19 31.86 centos:7 : Ok gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-39) 20 113.19 centos:8 : Ok gcc (GCC) 8.3.1 20191121 (Red Hat 8.3.1-5), clang version 9.0.1 (Red Hat 9.0.1-2.module_el8.2.0+309+0c7b6b03) 21 57.23 clearlinux:latest : Ok gcc (Clear Linux OS for Intel Architecture) 10.2.1 20200908 releases/gcc-10.2.0-203-g127d693955, clang version 10.0.1 22 64.98 debian:8 : Ok gcc (Debian 4.9.2-10+deb8u2) 4.9.2, Debian clang version 3.5.0-10 (tags/RELEASE_350/final) (based on LLVM 3.5.0) 23 76.08 debian:9 : Ok gcc (Debian 6.3.0-18+deb9u1) 6.3.0 20170516, clang version 3.8.1-24 (tags/RELEASE_381/final) 24 74.49 debian:10 : Ok gcc (Debian 8.3.0-6) 8.3.0, clang version 7.0.1-8+deb10u2 (tags/RELEASE_701/final) 25 78.50 debian:experimental : Ok gcc (Debian 10.2.0-15) 10.2.0, Debian clang version 11.0.0-2 26 33.30 debian:experimental-x-arm64 : Ok aarch64-linux-gnu-gcc (Debian 10.2.0-3) 10.2.0 27 30.96 debian:experimental-x-mips64 : Ok mips64-linux-gnuabi64-gcc (Debian 9.3.0-8) 9.3.0 28 32.63 debian:experimental-x-mipsel : Ok mipsel-linux-gnu-gcc (Debian 9.3.0-8) 9.3.0 29 30.12 fedora:20 : Ok gcc (GCC) 4.8.3 20140911 (Red Hat 4.8.3-7) 30 30.99 fedora:22 : Ok gcc (GCC) 5.3.1 20160406 (Red Hat 5.3.1-6), clang version 3.5.0 (tags/RELEASE_350/final) 31 68.60 fedora:23 : Ok gcc (GCC) 5.3.1 20160406 (Red Hat 5.3.1-6), clang version 3.7.0 (tags/RELEASE_370/final) 32 78.92 fedora:24 : Ok gcc (GCC) 6.3.1 20161221 (Red Hat 6.3.1-1), clang version 3.8.1 (tags/RELEASE_381/final) 33 26.15 fedora:24-x-ARC-uClibc : Ok arc-linux-gcc (ARCompact ISA Linux uClibc toolchain 2017.09-rc2) 7.1.1 20170710 34 80.13 fedora:25 : Ok gcc (GCC) 6.4.1 20170727 (Red Hat 6.4.1-1), clang version 3.9.1 (tags/RELEASE_391/final) 35 90.68 fedora:26 : Ok gcc (GCC) 7.3.1 20180130 (Red Hat 7.3.1-2), clang version 4.0.1 (tags/RELEASE_401/final) 36 90.45 fedora:27 : Ok gcc (GCC) 7.3.1 20180712 (Red Hat 7.3.1-6), clang version 5.0.2 (tags/RELEASE_502/final) 37 100.88 fedora:28 : Ok gcc (GCC) 8.3.1 20190223 (Red Hat 8.3.1-2), clang version 6.0.1 (tags/RELEASE_601/final) 38 105.99 fedora:29 : Ok gcc (GCC) 8.3.1 20190223 (Red Hat 8.3.1-2), clang version 7.0.1 (Fedora 7.0.1-6.fc29) 39 111.05 fedora:30 : Ok gcc (GCC) 9.3.1 20200408 (Red Hat 9.3.1-2), clang version 8.0.0 (Fedora 8.0.0-3.fc30) 40 29.96 fedora:30-x-ARC-glibc : Ok arc-linux-gcc (ARC HS GNU/Linux glibc toolchain 2019.03-rc1) 8.3.1 20190225 41 27.02 fedora:30-x-ARC-uClibc : Ok arc-linux-gcc (ARCv2 ISA Linux uClibc toolchain 2019.03-rc1) 8.3.1 20190225 42 110.47 fedora:31 : Ok gcc (GCC) 9.3.1 20200408 (Red Hat 9.3.1-2), clang version 9.0.1 (Fedora 9.0.1-2.fc31) 43 88.78 fedora:32 : Ok gcc (GCC) 10.2.1 20200723 (Red Hat 10.2.1-1), clang version 10.0.0 (Fedora 10.0.0-2.fc32) 44 15.92 fedora:rawhide : FAIL gcc (GCC) 10.2.1 20200916 (Red Hat 10.2.1-4), clang version 11.0.0 (Fedora 11.0.0-0.4.rc3.fc34) 45 33.58 gentoo-stage3-amd64:latest : Ok gcc (Gentoo 9.3.0-r1 p3) 9.3.0 46 65.32 mageia:5 : Ok gcc (GCC) 4.9.2, clang version 3.5.2 (tags/RELEASE_352/final) 47 81.35 mageia:6 : Ok gcc (Mageia 5.5.0-1.mga6) 5.5.0, clang version 3.9.1 (tags/RELEASE_391/final) 48 103.94 mageia:7 : Ok gcc (Mageia 8.4.0-1.mga7) 8.4.0, clang version 8.0.0 (Mageia 8.0.0-1.mga7) 49 91.62 manjaro:latest : Ok gcc (GCC) 10.2.0, clang version 10.0.1 50 219.87 openmandriva:cooker : Ok gcc (GCC) 10.2.0 20200723 (OpenMandriva), OpenMandriva 11.0.0-0.20200909.1 clang version 11.0.0 (/builddir/build/BUILD/llvm-project-release-11.x/clang 5cb8ffbab42358a7cdb0a67acfadb84df0779579) 51 111.76 opensuse:15.0 : Ok gcc (SUSE Linux) 7.4.1 20190905 [gcc-7-branch revision 275407], clang version 5.0.1 (tags/RELEASE_501/final 312548) 52 118.03 opensuse:15.1 : Ok gcc (SUSE Linux) 7.5.0, clang version 7.0.1 (tags/RELEASE_701/final 349238) 53 107.91 opensuse:15.2 : Ok gcc (SUSE Linux) 7.5.0, clang version 9.0.1 54 102.34 opensuse:tumbleweed : Ok gcc (SUSE Linux) 10.2.1 20200825 [revision c0746a1beb1ba073c7981eb09f55b3d993b32e5c], clang version 10.0.1 55 25.33 oraclelinux:6 : Ok gcc (GCC) 4.4.7 20120313 (Red Hat 4.4.7-23.0.1) 56 30.45 oraclelinux:7 : Ok gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-44.0.3) 57 104.65 oraclelinux:8 : Ok gcc (GCC) 8.3.1 20191121 (Red Hat 8.3.1-5.0.3), clang version 9.0.1 (Red Hat 9.0.1-2.0.1.module+el8.2.0+5599+9ed9ef6d) 58 26.04 ubuntu:12.04 : Ok gcc (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3, Ubuntu clang version 3.0-6ubuntu3 (tags/RELEASE_30/final) (based on LLVM 3.0) 59 29.49 ubuntu:14.04 : Ok gcc (Ubuntu 4.8.4-2ubuntu1~14.04.4) 4.8.4 60 72.95 ubuntu:16.04 : Ok gcc (Ubuntu 5.4.0-6ubuntu1~16.04.12) 5.4.0 20160609, clang version 3.8.0-2ubuntu4 (tags/RELEASE_380/final) 61 26.03 ubuntu:16.04-x-arm : Ok arm-linux-gnueabihf-gcc (Ubuntu/Linaro 5.4.0-6ubuntu1~16.04.9) 5.4.0 20160609 62 25.15 ubuntu:16.04-x-arm64 : Ok aarch64-linux-gnu-gcc (Ubuntu/Linaro 5.4.0-6ubuntu1~16.04.9) 5.4.0 20160609 63 24.88 ubuntu:16.04-x-powerpc : Ok powerpc-linux-gnu-gcc (Ubuntu 5.4.0-6ubuntu1~16.04.9) 5.4.0 20160609 64 25.72 ubuntu:16.04-x-powerpc64 : Ok powerpc64-linux-gnu-gcc (Ubuntu/IBM 5.4.0-6ubuntu1~16.04.9) 5.4.0 20160609 65 25.39 ubuntu:16.04-x-powerpc64el : Ok powerpc64le-linux-gnu-gcc (Ubuntu/IBM 5.4.0-6ubuntu1~16.04.9) 5.4.0 20160609 66 25.34 ubuntu:16.04-x-s390 : Ok s390x-linux-gnu-gcc (Ubuntu 5.4.0-6ubuntu1~16.04.9) 5.4.0 20160609 67 84.84 ubuntu:18.04 : Ok gcc (Ubuntu 7.5.0-3ubuntu1~18.04) 7.5.0, clang version 6.0.0-1ubuntu2 (tags/RELEASE_600/final) 68 27.15 ubuntu:18.04-x-arm : Ok arm-linux-gnueabihf-gcc (Ubuntu/Linaro 7.5.0-3ubuntu1~18.04) 7.5.0 69 26.68 ubuntu:18.04-x-arm64 : Ok aarch64-linux-gnu-gcc (Ubuntu/Linaro 7.5.0-3ubuntu1~18.04) 7.5.0 70 22.38 ubuntu:18.04-x-m68k : Ok m68k-linux-gnu-gcc (Ubuntu 7.5.0-3ubuntu1~18.04) 7.5.0 71 26.35 ubuntu:18.04-x-powerpc : Ok powerpc-linux-gnu-gcc (Ubuntu 7.5.0-3ubuntu1~18.04) 7.5.0 72 28.58 ubuntu:18.04-x-powerpc64 : Ok powerpc64-linux-gnu-gcc (Ubuntu 7.5.0-3ubuntu1~18.04) 7.5.0 73 28.18 ubuntu:18.04-x-powerpc64el : Ok powerpc64le-linux-gnu-gcc (Ubuntu 7.5.0-3ubuntu1~18.04) 7.5.0 74 178.55 ubuntu:18.04-x-riscv64 : Ok riscv64-linux-gnu-gcc (Ubuntu 7.5.0-3ubuntu1~18.04) 7.5.0 75 24.58 ubuntu:18.04-x-s390 : Ok s390x-linux-gnu-gcc (Ubuntu 7.5.0-3ubuntu1~18.04) 7.5.0 76 26.89 ubuntu:18.04-x-sh4 : Ok sh4-linux-gnu-gcc (Ubuntu 7.5.0-3ubuntu1~18.04) 7.5.0 77 24.81 ubuntu:18.04-x-sparc64 : Ok sparc64-linux-gnu-gcc (Ubuntu 7.5.0-3ubuntu1~18.04) 7.5.0 78 68.90 ubuntu:19.10 : Ok gcc (Ubuntu 9.2.1-9ubuntu2) 9.2.1 20191008, clang version 8.0.1-3build1 (tags/RELEASE_801/final) 79 69.31 ubuntu:20.04 : Ok gcc (Ubuntu 9.3.0-10ubuntu2) 9.3.0, clang version 10.0.0-4ubuntu1 80 30.00 ubuntu:20.04-x-powerpc64el : Ok powerpc64le-linux-gnu-gcc (Ubuntu 10-20200411-0ubuntu1) 10.0.1 20200411 (experimental) [master revision bb87d5cc77d:75961caccb7:f883c46b4877f637e0fa5025b4d6b5c9040ec566] 81 70.34 ubuntu:20.10 : Ok gcc (Ubuntu 10.2.0-5ubuntu2) 10.2.0, Ubuntu clang version 10.0.1-1 $ # uname -a Linux five 5.9.0+ #1 SMP Thu Oct 15 09:06:41 -03 2020 x86_64 x86_64 x86_64 GNU/Linux # git log --oneline -1744aec4df2
perf c2c: Update documentation for metrics reorganization # perf version --build-options perf version 5.9.rc7.g744aec4df2c5 dwarf: [ on ] # HAVE_DWARF_SUPPORT dwarf_getlocations: [ on ] # HAVE_DWARF_GETLOCATIONS_SUPPORT glibc: [ on ] # HAVE_GLIBC_SUPPORT syscall_table: [ on ] # HAVE_SYSCALL_TABLE_SUPPORT libbfd: [ on ] # HAVE_LIBBFD_SUPPORT libelf: [ on ] # HAVE_LIBELF_SUPPORT libnuma: [ on ] # HAVE_LIBNUMA_SUPPORT numa_num_possible_cpus: [ on ] # HAVE_LIBNUMA_SUPPORT libperl: [ on ] # HAVE_LIBPERL_SUPPORT libpython: [ on ] # HAVE_LIBPYTHON_SUPPORT libslang: [ on ] # HAVE_SLANG_SUPPORT libcrypto: [ on ] # HAVE_LIBCRYPTO_SUPPORT libunwind: [ on ] # HAVE_LIBUNWIND_SUPPORT libdw-dwarf-unwind: [ on ] # HAVE_DWARF_SUPPORT zlib: [ on ] # HAVE_ZLIB_SUPPORT lzma: [ on ] # HAVE_LZMA_SUPPORT get_cpuid: [ on ] # HAVE_AUXTRACE_SUPPORT bpf: [ on ] # HAVE_LIBBPF_SUPPORT aio: [ on ] # HAVE_AIO_SUPPORT zstd: [ on ] # HAVE_ZSTD_SUPPORT # perf test 1: vmlinux symtab matches kallsyms : Ok 2: Detect openat syscall event : Ok 3: Detect openat syscall event on all cpus : Ok 4: Read samples using the mmap interface : Ok 5: Test data source output : Ok 6: Parse event definition strings : Ok 7: Simple expression parser : Ok 8: PERF_RECORD_* events & perf_sample fields : Ok 9: Parse perf pmu format : Ok 10: PMU events : 10.1: PMU event table sanity : Ok 10.2: PMU event map aliases : Ok 10.3: Parsing of PMU event table metrics : Ok 10.4: Parsing of PMU event table metrics with fake PMUs : Ok 11: DSO data read : Ok 12: DSO data cache : Ok 13: DSO data reopen : Ok 14: Roundtrip evsel->name : Ok 15: Parse sched tracepoints fields : Ok 16: syscalls:sys_enter_openat event fields : Ok 17: Setup struct perf_event_attr : Ok 18: Match and link multiple hists : Ok 19: 'import perf' in python : Ok 20: Breakpoint overflow signal handler : Ok 21: Breakpoint overflow sampling : Ok 22: Breakpoint accounting : Ok 23: Watchpoint : 23.1: Read Only Watchpoint : Skip 23.2: Write Only Watchpoint : Ok 23.3: Read / Write Watchpoint : Ok 23.4: Modify Watchpoint : Ok 24: Number of exit events of a simple workload : Ok 25: Software clock events period values : Ok 26: Object code reading : Ok 27: Sample parsing : Ok 28: Use a dummy software event to keep tracking : Ok 29: Parse with no sample_id_all bit set : Ok 30: Filter hist entries : Ok 31: Lookup mmap thread : Ok 32: Share thread maps : Ok 33: Sort output of hist entries : Ok 34: Cumulate child hist entries : Ok 35: Track with sched_switch : Ok 36: Filter fds with revents mask in a fdarray : Ok 37: Add fd to a fdarray, making it autogrow : Ok 38: kmod_path__parse : Ok 39: Thread map : Ok 40: LLVM search and compile : 40.1: Basic BPF llvm compile : Ok 40.2: kbuild searching : Ok 40.3: Compile source for BPF prologue generation : Ok 40.4: Compile source for BPF relocation : Ok 41: Session topology : Ok 42: BPF filter : 42.1: Basic BPF filtering : Ok 42.2: BPF pinning : Ok 42.3: BPF prologue generation : Ok 42.4: BPF relocation checker : Ok 43: Synthesize thread map : Ok 44: Remove thread map : Ok 45: Synthesize cpu map : Ok 46: Synthesize stat config : Ok 47: Synthesize stat : Ok 48: Synthesize stat round : Ok 49: Synthesize attr update : Ok 50: Event times : Ok 51: Read backward ring buffer : Ok 52: Print cpu map : Ok 53: Merge cpu map : Ok 54: Probe SDT events : Ok 55: is_printable_array : Ok 56: Print bitmap : Ok 57: perf hooks : Ok 58: builtin clang support : Skip (not compiled in) 59: unit_number__scnprintf : Ok 60: mem2node : Ok 61: time utils : Ok 62: Test jit_write_elf : Ok 63: Test libpfm4 support : Skip (not compiled in) 64: Test api io : Ok 65: maps__merge_in : Ok 66: Demangle Java : Ok 67: Parse and process metrics : Ok 68: PE file support : Ok 69: Event expansion for cgroups : Ok 70: x86 rdpmc : Ok 71: Convert perf time to TSC : Ok 72: DWARF unwind : Ok 73: x86 instruction decoder - new instructions : Ok 74: Intel PT packet decoder : Ok 75: x86 bp modify : Ok 76: probe libc's inet_pton & backtrace it with ping : Ok 77: Check Arm CoreSight trace data recording and synthesized samples: Skip 78: Use vfs_getname probe to get syscall args filenames : Ok 79: Check open filename arg using perf trace + vfs_getname : Ok 80: Zstd perf.data compression/decompression : Ok 81: Add vfs_getname probe to get syscall args filenames : Ok 82: build id cache operations : Ok # $ git log --oneline -1744aec4df2
(HEAD -> perf/core, quaco/perf/core) perf c2c: Update documentation for metrics reorganization $ make -C tools/perf build-test make: Entering directory '/home/acme/git/perf/tools/perf' - tarpkg: ./tests/perf-targz-src-pkg . make_install_bin_O: make install-bin make_static_O: make LDFLAGS=-static NO_PERF_READ_VDSO32=1 NO_PERF_READ_VDSOX32=1 NO_JVMTI=1 make_no_libdw_dwarf_unwind_O: make NO_LIBDW_DWARF_UNWIND=1 make_no_newt_O: make NO_NEWT=1 make_no_libbionic_O: make NO_LIBBIONIC=1 make_no_sdt_O: make NO_SDT=1 make_debug_O: make DEBUG=1 make_perf_o_O: make perf.o make_no_libbpf_O: make NO_LIBBPF=1 make_no_libbpf_DEBUG_O: make NO_LIBBPF=1 DEBUG=1 make_clean_all_O: make clean all make_tags_O: make tags make_with_babeltrace_O: make LIBBABELTRACE=1 make_with_clangllvm_O: make LIBCLANGLLVM=1 make_no_scripts_O: make NO_LIBPYTHON=1 NO_LIBPERL=1 make_no_libelf_O: make NO_LIBELF=1 make_no_libcrypto_O: make NO_LIBCRYPTO=1 make_with_libpfm4_O: make LIBPFM4=1 make_no_libunwind_O: make NO_LIBUNWIND=1 make_util_map_o_O: make util/map.o make_no_slang_O: make NO_SLANG=1 make_with_gtk2_O: make GTK2=1 make_no_ui_O: make NO_NEWT=1 NO_SLANG=1 NO_GTK2=1 make_util_pmu_bison_o_O: make util/pmu-bison.o make_no_backtrace_O: make NO_BACKTRACE=1 make_no_demangle_O: make NO_DEMANGLE=1 make_help_O: make help make_pure_O: make make_no_gtk2_O: make NO_GTK2=1 make_install_prefix_O: make install prefix=/tmp/krava make_no_libnuma_O: make NO_LIBNUMA=1 make_no_libpython_O: make NO_LIBPYTHON=1 make_install_prefix_slash_O: make install prefix=/tmp/krava/ make_no_libaudit_O: make NO_LIBAUDIT=1 make_no_auxtrace_O: make NO_AUXTRACE=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 NO_LIBZSTD=1 NO_LIBCAP=1 NO_SYSCALL_TABLE=1 make_install_O: make install make_doc_O: make doc make_no_libperl_O: make NO_LIBPERL=1 make_no_syscall_tbl_O: make NO_SYSCALL_TABLE=1 OK make: Leaving directory '/home/acme/git/perf/tools/perf' $ -----BEGIN PGP SIGNATURE----- iHUEABYIAB0WIQR2GiIUctdOfX2qHhGyPKLppCJ+JwUCX4iuzgAKCRCyPKLppCJ+ J1khAP4iMQMFCMpNsBaL6KLtj3aTOhrooYuhbNL3kajqYVyW/QD8Dws35k6m2+tB tcOMJykFjPkQ4I13zsxKyugeJuUzSQw= =KdSj -----END PGP SIGNATURE----- Merge tag 'perf-tools-for-v5.10-2020-10-15' of git://git.kernel.org/pub/scm/linux/kernel/git/acme/linux Pull perf tools updates from Arnaldo Carvalho de Melo: - cgroup improvements for 'perf stat', allowing for compact specification of events and cgroups in the command line. - Support per thread topdown metrics in 'perf stat'. - Support sample-read topdown metric group in 'perf record' - Show start of latency in addition to its start in 'perf sched latency'. - Add min, max to 'perf script' futex-contention output, in addition to avg. - Allow usage of 'perf_event_attr->exclusive' attribute via the new ':e' event modifier. - Add 'snapshot' command to 'perf record --control', using it with Intel PT. - Support FIFO file names as alternative options to 'perf record --control'. - Introduce branch history "streams", to compare 'perf record' runs with 'perf diff' based on branch records and report hot streams. - Support PE executable symbol tables using libbfd, to profile, for instance, wine binaries. - Add filter support for option 'perf ftrace -F/--funcs'. - Allow configuring the 'disassembler_style' 'perf annotate' knob via 'perf config' - Update CascadelakeX and SkylakeX JSON vendor events files. - Add support for parsing perchip/percore JSON vendor events. - Add power9 hv_24x7 core level metric events. - Add L2 prefetch, ITLB instruction fetch hits JSON events for AMD zen1. - Enable Family 19h users by matching Zen2 AMD vendor events. - Use debuginfod in 'perf probe' when required debug files not found locally. - Display negative tid in non-sample events in 'perf script'. - Make GTK2 support opt-in - Add build test with GTK+ - Add missing -lzstd to the fast path feature detection - Add scripts to auto generate 'mmap', 'mremap' string<->id tables for use in 'perf trace'. - Show python test script in verbose mode. - Fix uncore metric expressions - Msan uninitialized use fixes. - Use condition variables in 'perf bench numa' - Autodetect python3 binary in systems without python2. - Support md5 build ids in addition to sha1. - Add build id 'perf test' regression test. - Fix printable strings in python3 scripts. - Fix off by ones in 'perf trace' in arches using libaudit. - Fix JSON event code for events referencing std arch events. - Introduce 'perf test' shell script for Arm CoreSight testing. - Add rdtsc() for Arm64 for used in the PERF_RECORD_TIME_CONV metadata event and in 'perf test tsc'. - 'perf c2c' improvements: Add "RMT Load Hit" metric, "Total Stores", fixes and documentation update. - Fix usage of reloc_sym in 'perf probe' when using both kallsyms and debuginfo files. - Do not print 'Metric Groups:' unnecessarily in 'perf list' - Refcounting fixes in the event parsing code. - Add expand cgroup event 'perf test' entry. - Fix out of bounds CPU map access when handling armv8_pmu events in 'perf stat'. - Add build-id injection 'perf bench' benchmark. - Enter namespace when reading build-id in 'perf inject'. - Do not load map/dso when injecting build-id speeding up the 'perf inject' process. - Add --buildid-all option to avoid processing all samples, just the mmap metadata events. - Add feature test to check if libbfd has buildid support - Add 'perf test' entry for PE binary format support. - Fix typos in power8 PMU vendor events JSON files. - Hide libtraceevent non API functions. * tag 'perf-tools-for-v5.10-2020-10-15' of git://git.kernel.org/pub/scm/linux/kernel/git/acme/linux: (113 commits) perf c2c: Update documentation for metrics reorganization perf c2c: Add metrics "RMT Load Hit" perf c2c: Correct LLC load hit metrics perf c2c: Change header for LLC local hit perf c2c: Use more explicit headers for HITM perf c2c: Change header from "LLC Load Hitm" to "Load Hitm" perf c2c: Organize metrics based on memory hierarchy perf c2c: Display "Total Stores" as a standalone metrics perf c2c: Display the total numbers continuously perf bench: Use condition variables in numa. perf jevents: Fix event code for events referencing std arch events perf diff: Support hot streams comparison perf streams: Report hot streams perf streams: Calculate the sum of total streams hits perf streams: Link stream pair perf streams: Compare two streams perf streams: Get the evsel_streams by evsel_idx perf streams: Introduce branch history "streams" perf intel-pt: Improve PT documentation slightly perf tools: Add support for exclusive groups/events ...
This commit is contained in:
commit
9d9af1007b
|
@ -38,9 +38,8 @@ FEATURE_TESTS_BASIC := \
|
|||
get_current_dir_name \
|
||||
gettid \
|
||||
glibc \
|
||||
gtk2 \
|
||||
gtk2-infobar \
|
||||
libbfd \
|
||||
libbfd-buildid \
|
||||
libcap \
|
||||
libelf \
|
||||
libelf-getphdrnum \
|
||||
|
@ -80,6 +79,8 @@ FEATURE_TESTS_EXTRA := \
|
|||
compile-32 \
|
||||
compile-x32 \
|
||||
cplus-demangle \
|
||||
gtk2 \
|
||||
gtk2-infobar \
|
||||
hello \
|
||||
libbabeltrace \
|
||||
libbfd-liberty \
|
||||
|
@ -110,8 +111,8 @@ FEATURE_DISPLAY ?= \
|
|||
dwarf \
|
||||
dwarf_getlocations \
|
||||
glibc \
|
||||
gtk2 \
|
||||
libbfd \
|
||||
libbfd-buildid \
|
||||
libcap \
|
||||
libelf \
|
||||
libnuma \
|
||||
|
|
|
@ -15,6 +15,7 @@ FILES= \
|
|||
test-hello.bin \
|
||||
test-libaudit.bin \
|
||||
test-libbfd.bin \
|
||||
test-libbfd-buildid.bin \
|
||||
test-disassembler-four-args.bin \
|
||||
test-reallocarray.bin \
|
||||
test-libbfd-liberty.bin \
|
||||
|
@ -89,7 +90,7 @@ __BUILDXX = $(CXX) $(CXXFLAGS) -MD -Wall -Werror -o $@ $(patsubst %.bin,%.cpp,$(
|
|||
###############################
|
||||
|
||||
$(OUTPUT)test-all.bin:
|
||||
$(BUILD) -fstack-protector-all -O2 -D_FORTIFY_SOURCE=2 -ldw -lelf -lnuma -lelf -I/usr/include/slang -lslang $(shell $(PKG_CONFIG) --libs --cflags gtk+-2.0 2>/dev/null) $(FLAGS_PERL_EMBED) $(FLAGS_PYTHON_EMBED) -DPACKAGE='"perf"' -lbfd -ldl -lz -llzma
|
||||
$(BUILD) -fstack-protector-all -O2 -D_FORTIFY_SOURCE=2 -ldw -lelf -lnuma -lelf -I/usr/include/slang -lslang $(FLAGS_PERL_EMBED) $(FLAGS_PYTHON_EMBED) -DPACKAGE='"perf"' -lbfd -ldl -lz -llzma -lzstd
|
||||
|
||||
$(OUTPUT)test-hello.bin:
|
||||
$(BUILD)
|
||||
|
@ -225,6 +226,9 @@ $(OUTPUT)test-libpython-version.bin:
|
|||
$(OUTPUT)test-libbfd.bin:
|
||||
$(BUILD) -DPACKAGE='"perf"' -lbfd -ldl
|
||||
|
||||
$(OUTPUT)test-libbfd-buildid.bin:
|
||||
$(BUILD) -DPACKAGE='"perf"' -lbfd -ldl
|
||||
|
||||
$(OUTPUT)test-disassembler-four-args.bin:
|
||||
$(BUILD) -DPACKAGE='"perf"' -lbfd -lopcodes
|
||||
|
||||
|
|
|
@ -74,18 +74,14 @@
|
|||
# include "test-libslang.c"
|
||||
#undef main
|
||||
|
||||
#define main main_test_gtk2
|
||||
# include "test-gtk2.c"
|
||||
#undef main
|
||||
|
||||
#define main main_test_gtk2_infobar
|
||||
# include "test-gtk2-infobar.c"
|
||||
#undef main
|
||||
|
||||
#define main main_test_libbfd
|
||||
# include "test-libbfd.c"
|
||||
#undef main
|
||||
|
||||
#define main main_test_libbfd_buildid
|
||||
# include "test-libbfd-buildid.c"
|
||||
#undef main
|
||||
|
||||
#define main main_test_backtrace
|
||||
# include "test-backtrace.c"
|
||||
#undef main
|
||||
|
@ -201,9 +197,8 @@ int main(int argc, char *argv[])
|
|||
main_test_libelf_getshdrstrndx();
|
||||
main_test_libunwind();
|
||||
main_test_libslang();
|
||||
main_test_gtk2(argc, argv);
|
||||
main_test_gtk2_infobar(argc, argv);
|
||||
main_test_libbfd();
|
||||
main_test_libbfd_buildid();
|
||||
main_test_backtrace();
|
||||
main_test_libnuma();
|
||||
main_test_numa_num_possible_cpus();
|
||||
|
|
|
@ -0,0 +1,8 @@
|
|||
// SPDX-License-Identifier: GPL-2.0
|
||||
#include <bfd.h>
|
||||
|
||||
int main(void)
|
||||
{
|
||||
bfd *abfd = bfd_openr("Pedro", 0);
|
||||
return abfd && (!abfd->build_id || abfd->build_id->size > 0x506564726f);
|
||||
}
|
|
@ -45,6 +45,9 @@ static void __perf_evlist__propagate_maps(struct perf_evlist *evlist,
|
|||
if (!evsel->own_cpus || evlist->has_user_cpus) {
|
||||
perf_cpu_map__put(evsel->cpus);
|
||||
evsel->cpus = perf_cpu_map__get(evlist->cpus);
|
||||
} else if (!evsel->system_wide && perf_cpu_map__empty(evlist->cpus)) {
|
||||
perf_cpu_map__put(evsel->cpus);
|
||||
evsel->cpus = perf_cpu_map__get(evlist->cpus);
|
||||
} else if (evsel->cpus != evsel->own_cpus) {
|
||||
perf_cpu_map__put(evsel->cpus);
|
||||
evsel->cpus = perf_cpu_map__get(evsel->own_cpus);
|
||||
|
|
|
@ -201,10 +201,20 @@ struct perf_record_header_tracing_data {
|
|||
__u32 size;
|
||||
};
|
||||
|
||||
#define PERF_RECORD_MISC_BUILD_ID_SIZE (1 << 15)
|
||||
|
||||
struct perf_record_header_build_id {
|
||||
struct perf_event_header header;
|
||||
pid_t pid;
|
||||
union {
|
||||
__u8 build_id[24];
|
||||
struct {
|
||||
__u8 data[20];
|
||||
__u8 size;
|
||||
__u8 reserved1__;
|
||||
__u16 reserved2__;
|
||||
};
|
||||
};
|
||||
char filename[];
|
||||
};
|
||||
|
||||
|
@ -324,6 +334,10 @@ struct perf_record_time_conv {
|
|||
__u64 time_shift;
|
||||
__u64 time_mult;
|
||||
__u64 time_zero;
|
||||
__u64 time_cycles;
|
||||
__u64 time_mask;
|
||||
bool cap_user_time_zero;
|
||||
bool cap_user_time_short;
|
||||
};
|
||||
|
||||
struct perf_record_header_feature {
|
||||
|
|
|
@ -92,7 +92,7 @@ bool tep_test_flag(struct tep_handle *tep, enum tep_flag flag)
|
|||
return false;
|
||||
}
|
||||
|
||||
unsigned short tep_data2host2(struct tep_handle *tep, unsigned short data)
|
||||
__hidden unsigned short data2host2(struct tep_handle *tep, unsigned short data)
|
||||
{
|
||||
unsigned short swap;
|
||||
|
||||
|
@ -105,7 +105,7 @@ unsigned short tep_data2host2(struct tep_handle *tep, unsigned short data)
|
|||
return swap;
|
||||
}
|
||||
|
||||
unsigned int tep_data2host4(struct tep_handle *tep, unsigned int data)
|
||||
__hidden unsigned int data2host4(struct tep_handle *tep, unsigned int data)
|
||||
{
|
||||
unsigned int swap;
|
||||
|
||||
|
@ -120,8 +120,8 @@ unsigned int tep_data2host4(struct tep_handle *tep, unsigned int data)
|
|||
return swap;
|
||||
}
|
||||
|
||||
unsigned long long
|
||||
tep_data2host8(struct tep_handle *tep, unsigned long long data)
|
||||
__hidden unsigned long long
|
||||
data2host8(struct tep_handle *tep, unsigned long long data)
|
||||
{
|
||||
unsigned long long swap;
|
||||
|
||||
|
|
|
@ -15,6 +15,8 @@ struct event_handler;
|
|||
struct func_resolver;
|
||||
struct tep_plugins_dir;
|
||||
|
||||
#define __hidden __attribute__((visibility ("hidden")))
|
||||
|
||||
struct tep_handle {
|
||||
int ref_count;
|
||||
|
||||
|
@ -102,12 +104,20 @@ struct tep_print_parse {
|
|||
struct tep_print_arg *len_as_arg;
|
||||
};
|
||||
|
||||
void tep_free_event(struct tep_event *event);
|
||||
void tep_free_format_field(struct tep_format_field *field);
|
||||
void tep_free_plugin_paths(struct tep_handle *tep);
|
||||
void free_tep_event(struct tep_event *event);
|
||||
void free_tep_format_field(struct tep_format_field *field);
|
||||
void free_tep_plugin_paths(struct tep_handle *tep);
|
||||
|
||||
unsigned short tep_data2host2(struct tep_handle *tep, unsigned short data);
|
||||
unsigned int tep_data2host4(struct tep_handle *tep, unsigned int data);
|
||||
unsigned long long tep_data2host8(struct tep_handle *tep, unsigned long long data);
|
||||
unsigned short data2host2(struct tep_handle *tep, unsigned short data);
|
||||
unsigned int data2host4(struct tep_handle *tep, unsigned int data);
|
||||
unsigned long long data2host8(struct tep_handle *tep, unsigned long long data);
|
||||
|
||||
/* access to the internal parser */
|
||||
int peek_char(void);
|
||||
void init_input_buf(const char *buf, unsigned long long size);
|
||||
unsigned long long get_input_buf_ptr(void);
|
||||
const char *get_input_buf(void);
|
||||
enum tep_event_type read_token(char **tok);
|
||||
void free_token(char *tok);
|
||||
|
||||
#endif /* _PARSE_EVENTS_INT_H */
|
||||
|
|
|
@ -54,19 +54,26 @@ static int show_warning = 1;
|
|||
warning(fmt, ##__VA_ARGS__); \
|
||||
} while (0)
|
||||
|
||||
static void init_input_buf(const char *buf, unsigned long long size)
|
||||
/**
|
||||
* init_input_buf - init buffer for parsing
|
||||
* @buf: buffer to parse
|
||||
* @size: the size of the buffer
|
||||
*
|
||||
* Initializes the internal buffer that tep_read_token() will parse.
|
||||
*/
|
||||
__hidden void init_input_buf(const char *buf, unsigned long long size)
|
||||
{
|
||||
input_buf = buf;
|
||||
input_buf_siz = size;
|
||||
input_buf_ptr = 0;
|
||||
}
|
||||
|
||||
const char *tep_get_input_buf(void)
|
||||
__hidden const char *get_input_buf(void)
|
||||
{
|
||||
return input_buf;
|
||||
}
|
||||
|
||||
unsigned long long tep_get_input_buf_ptr(void)
|
||||
__hidden unsigned long long get_input_buf_ptr(void)
|
||||
{
|
||||
return input_buf_ptr;
|
||||
}
|
||||
|
@ -100,26 +107,13 @@ process_defined_func(struct trace_seq *s, void *data, int size,
|
|||
|
||||
static void free_func_handle(struct tep_function_handler *func);
|
||||
|
||||
/**
|
||||
* tep_buffer_init - init buffer for parsing
|
||||
* @buf: buffer to parse
|
||||
* @size: the size of the buffer
|
||||
*
|
||||
* For use with tep_read_token(), this initializes the internal
|
||||
* buffer that tep_read_token() will parse.
|
||||
*/
|
||||
void tep_buffer_init(const char *buf, unsigned long long size)
|
||||
{
|
||||
init_input_buf(buf, size);
|
||||
}
|
||||
|
||||
void breakpoint(void)
|
||||
{
|
||||
static int x;
|
||||
x++;
|
||||
}
|
||||
|
||||
struct tep_print_arg *alloc_arg(void)
|
||||
static struct tep_print_arg *alloc_arg(void)
|
||||
{
|
||||
return calloc(1, sizeof(struct tep_print_arg));
|
||||
}
|
||||
|
@ -962,7 +956,12 @@ static int __read_char(void)
|
|||
return input_buf[input_buf_ptr++];
|
||||
}
|
||||
|
||||
static int __peek_char(void)
|
||||
/**
|
||||
* peek_char - peek at the next character that will be read
|
||||
*
|
||||
* Returns the next character read, or -1 if end of buffer.
|
||||
*/
|
||||
__hidden int peek_char(void)
|
||||
{
|
||||
if (input_buf_ptr >= input_buf_siz)
|
||||
return -1;
|
||||
|
@ -970,16 +969,6 @@ static int __peek_char(void)
|
|||
return input_buf[input_buf_ptr];
|
||||
}
|
||||
|
||||
/**
|
||||
* tep_peek_char - peek at the next character that will be read
|
||||
*
|
||||
* Returns the next character read, or -1 if end of buffer.
|
||||
*/
|
||||
int tep_peek_char(void)
|
||||
{
|
||||
return __peek_char();
|
||||
}
|
||||
|
||||
static int extend_token(char **tok, char *buf, int size)
|
||||
{
|
||||
char *newtok = realloc(*tok, size);
|
||||
|
@ -1033,7 +1022,7 @@ static enum tep_event_type __read_token(char **tok)
|
|||
case TEP_EVENT_OP:
|
||||
switch (ch) {
|
||||
case '-':
|
||||
next_ch = __peek_char();
|
||||
next_ch = peek_char();
|
||||
if (next_ch == '>') {
|
||||
buf[i++] = __read_char();
|
||||
break;
|
||||
|
@ -1045,7 +1034,7 @@ static enum tep_event_type __read_token(char **tok)
|
|||
case '>':
|
||||
case '<':
|
||||
last_ch = ch;
|
||||
ch = __peek_char();
|
||||
ch = peek_char();
|
||||
if (ch != last_ch)
|
||||
goto test_equal;
|
||||
buf[i++] = __read_char();
|
||||
|
@ -1068,7 +1057,7 @@ static enum tep_event_type __read_token(char **tok)
|
|||
return type;
|
||||
|
||||
test_equal:
|
||||
ch = __peek_char();
|
||||
ch = peek_char();
|
||||
if (ch == '=')
|
||||
buf[i++] = __read_char();
|
||||
goto out;
|
||||
|
@ -1122,7 +1111,7 @@ static enum tep_event_type __read_token(char **tok)
|
|||
break;
|
||||
}
|
||||
|
||||
while (get_type(__peek_char()) == type) {
|
||||
while (get_type(peek_char()) == type) {
|
||||
if (i == (BUFSIZ - 1)) {
|
||||
buf[i] = 0;
|
||||
tok_size += BUFSIZ;
|
||||
|
@ -1191,13 +1180,26 @@ static enum tep_event_type force_token(const char *str, char **tok)
|
|||
return type;
|
||||
}
|
||||
|
||||
static void free_token(char *tok)
|
||||
/**
|
||||
* free_token - free a token returned by tep_read_token
|
||||
* @token: the token to free
|
||||
*/
|
||||
__hidden void free_token(char *tok)
|
||||
{
|
||||
if (tok)
|
||||
free(tok);
|
||||
}
|
||||
|
||||
static enum tep_event_type read_token(char **tok)
|
||||
/**
|
||||
* read_token - access to utilities to use the tep parser
|
||||
* @tok: The token to return
|
||||
*
|
||||
* This will parse tokens from the string given by
|
||||
* tep_init_data().
|
||||
*
|
||||
* Returns the token type.
|
||||
*/
|
||||
__hidden enum tep_event_type read_token(char **tok)
|
||||
{
|
||||
enum tep_event_type type;
|
||||
|
||||
|
@ -1214,29 +1216,6 @@ static enum tep_event_type read_token(char **tok)
|
|||
return TEP_EVENT_NONE;
|
||||
}
|
||||
|
||||
/**
|
||||
* tep_read_token - access to utilities to use the tep parser
|
||||
* @tok: The token to return
|
||||
*
|
||||
* This will parse tokens from the string given by
|
||||
* tep_init_data().
|
||||
*
|
||||
* Returns the token type.
|
||||
*/
|
||||
enum tep_event_type tep_read_token(char **tok)
|
||||
{
|
||||
return read_token(tok);
|
||||
}
|
||||
|
||||
/**
|
||||
* tep_free_token - free a token returned by tep_read_token
|
||||
* @token: the token to free
|
||||
*/
|
||||
void tep_free_token(char *token)
|
||||
{
|
||||
free_token(token);
|
||||
}
|
||||
|
||||
/* no newline */
|
||||
static enum tep_event_type read_token_item(char **tok)
|
||||
{
|
||||
|
@ -3459,12 +3438,12 @@ unsigned long long tep_read_number(struct tep_handle *tep,
|
|||
case 1:
|
||||
return *(unsigned char *)ptr;
|
||||
case 2:
|
||||
return tep_data2host2(tep, *(unsigned short *)ptr);
|
||||
return data2host2(tep, *(unsigned short *)ptr);
|
||||
case 4:
|
||||
return tep_data2host4(tep, *(unsigned int *)ptr);
|
||||
return data2host4(tep, *(unsigned int *)ptr);
|
||||
case 8:
|
||||
memcpy(&val, (ptr), sizeof(unsigned long long));
|
||||
return tep_data2host8(tep, val);
|
||||
return data2host8(tep, val);
|
||||
default:
|
||||
/* BUG! */
|
||||
return 0;
|
||||
|
@ -4190,7 +4169,7 @@ static void print_str_arg(struct trace_seq *s, void *data, int size,
|
|||
f = tep_find_any_field(event, arg->string.string);
|
||||
arg->string.offset = f->offset;
|
||||
}
|
||||
str_offset = tep_data2host4(tep, *(unsigned int *)(data + arg->string.offset));
|
||||
str_offset = data2host4(tep, *(unsigned int *)(data + arg->string.offset));
|
||||
str_offset &= 0xffff;
|
||||
print_str_to_seq(s, format, len_arg, ((char *)data) + str_offset);
|
||||
break;
|
||||
|
@ -4208,7 +4187,7 @@ static void print_str_arg(struct trace_seq *s, void *data, int size,
|
|||
f = tep_find_any_field(event, arg->bitmask.bitmask);
|
||||
arg->bitmask.offset = f->offset;
|
||||
}
|
||||
bitmask_offset = tep_data2host4(tep, *(unsigned int *)(data + arg->bitmask.offset));
|
||||
bitmask_offset = data2host4(tep, *(unsigned int *)(data + arg->bitmask.offset));
|
||||
bitmask_size = bitmask_offset >> 16;
|
||||
bitmask_offset &= 0xffff;
|
||||
print_bitmask_to_seq(tep, s, format, len_arg,
|
||||
|
@ -6750,7 +6729,7 @@ static int find_event_handle(struct tep_handle *tep, struct tep_event *event)
|
|||
}
|
||||
|
||||
/**
|
||||
* __tep_parse_format - parse the event format
|
||||
* parse_format - parse the event format
|
||||
* @buf: the buffer storing the event format string
|
||||
* @size: the size of @buf
|
||||
* @sys: the system the event belongs to
|
||||
|
@ -6762,7 +6741,7 @@ static int find_event_handle(struct tep_handle *tep, struct tep_event *event)
|
|||
*
|
||||
* /sys/kernel/debug/tracing/events/.../.../format
|
||||
*/
|
||||
enum tep_errno __tep_parse_format(struct tep_event **eventp,
|
||||
static enum tep_errno parse_format(struct tep_event **eventp,
|
||||
struct tep_handle *tep, const char *buf,
|
||||
unsigned long size, const char *sys)
|
||||
{
|
||||
|
@ -6879,7 +6858,7 @@ __parse_event(struct tep_handle *tep,
|
|||
const char *buf, unsigned long size,
|
||||
const char *sys)
|
||||
{
|
||||
int ret = __tep_parse_format(eventp, tep, buf, size, sys);
|
||||
int ret = parse_format(eventp, tep, buf, size, sys);
|
||||
struct tep_event *event = *eventp;
|
||||
|
||||
if (event == NULL)
|
||||
|
@ -6897,7 +6876,7 @@ __parse_event(struct tep_handle *tep,
|
|||
return 0;
|
||||
|
||||
event_add_failed:
|
||||
tep_free_event(event);
|
||||
free_tep_event(event);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
@ -7490,7 +7469,7 @@ int tep_get_ref(struct tep_handle *tep)
|
|||
return 0;
|
||||
}
|
||||
|
||||
void tep_free_format_field(struct tep_format_field *field)
|
||||
__hidden void free_tep_format_field(struct tep_format_field *field)
|
||||
{
|
||||
free(field->type);
|
||||
if (field->alias != field->name)
|
||||
|
@ -7505,7 +7484,7 @@ static void free_format_fields(struct tep_format_field *field)
|
|||
|
||||
while (field) {
|
||||
next = field->next;
|
||||
tep_free_format_field(field);
|
||||
free_tep_format_field(field);
|
||||
field = next;
|
||||
}
|
||||
}
|
||||
|
@ -7516,7 +7495,7 @@ static void free_formats(struct tep_format *format)
|
|||
free_format_fields(format->fields);
|
||||
}
|
||||
|
||||
void tep_free_event(struct tep_event *event)
|
||||
__hidden void free_tep_event(struct tep_event *event)
|
||||
{
|
||||
free(event->name);
|
||||
free(event->system);
|
||||
|
@ -7602,7 +7581,7 @@ void tep_free(struct tep_handle *tep)
|
|||
}
|
||||
|
||||
for (i = 0; i < tep->nr_events; i++)
|
||||
tep_free_event(tep->events[i]);
|
||||
free_tep_event(tep->events[i]);
|
||||
|
||||
while (tep->handlers) {
|
||||
handle = tep->handlers;
|
||||
|
@ -7613,7 +7592,7 @@ void tep_free(struct tep_handle *tep)
|
|||
free(tep->events);
|
||||
free(tep->sort_events);
|
||||
free(tep->func_resolver);
|
||||
tep_free_plugin_paths(tep);
|
||||
free_tep_plugin_paths(tep);
|
||||
|
||||
free(tep);
|
||||
}
|
||||
|
|
|
@ -578,14 +578,6 @@ void tep_ref(struct tep_handle *tep);
|
|||
void tep_unref(struct tep_handle *tep);
|
||||
int tep_get_ref(struct tep_handle *tep);
|
||||
|
||||
/* access to the internal parser */
|
||||
void tep_buffer_init(const char *buf, unsigned long long size);
|
||||
enum tep_event_type tep_read_token(char **tok);
|
||||
void tep_free_token(char *token);
|
||||
int tep_peek_char(void);
|
||||
const char *tep_get_input_buf(void);
|
||||
unsigned long long tep_get_input_buf_ptr(void);
|
||||
|
||||
/* for debugging */
|
||||
void tep_print_funcs(struct tep_handle *tep);
|
||||
void tep_print_printk(struct tep_handle *tep);
|
||||
|
|
|
@ -676,7 +676,7 @@ int tep_add_plugin_path(struct tep_handle *tep, char *path,
|
|||
return 0;
|
||||
}
|
||||
|
||||
void tep_free_plugin_paths(struct tep_handle *tep)
|
||||
__hidden void free_tep_plugin_paths(struct tep_handle *tep)
|
||||
{
|
||||
struct tep_plugins_dir *dir;
|
||||
|
||||
|
|
|
@ -38,8 +38,8 @@ static void show_error(char *error_buf, const char *fmt, ...)
|
|||
int len;
|
||||
int i;
|
||||
|
||||
input = tep_get_input_buf();
|
||||
index = tep_get_input_buf_ptr();
|
||||
input = get_input_buf();
|
||||
index = get_input_buf_ptr();
|
||||
len = input ? strlen(input) : 0;
|
||||
|
||||
if (len) {
|
||||
|
@ -57,25 +57,20 @@ static void show_error(char *error_buf, const char *fmt, ...)
|
|||
va_end(ap);
|
||||
}
|
||||
|
||||
static void free_token(char *token)
|
||||
{
|
||||
tep_free_token(token);
|
||||
}
|
||||
|
||||
static enum tep_event_type read_token(char **tok)
|
||||
static enum tep_event_type filter_read_token(char **tok)
|
||||
{
|
||||
enum tep_event_type type;
|
||||
char *token = NULL;
|
||||
|
||||
do {
|
||||
free_token(token);
|
||||
type = tep_read_token(&token);
|
||||
type = read_token(&token);
|
||||
} while (type == TEP_EVENT_NEWLINE || type == TEP_EVENT_SPACE);
|
||||
|
||||
/* If token is = or ! check to see if the next char is ~ */
|
||||
if (token &&
|
||||
(strcmp(token, "=") == 0 || strcmp(token, "!") == 0) &&
|
||||
tep_peek_char() == '~') {
|
||||
peek_char() == '~') {
|
||||
/* append it */
|
||||
*tok = malloc(3);
|
||||
if (*tok == NULL) {
|
||||
|
@ -85,7 +80,7 @@ static enum tep_event_type read_token(char **tok)
|
|||
sprintf(*tok, "%c%c", *token, '~');
|
||||
free_token(token);
|
||||
/* Now remove the '~' from the buffer */
|
||||
tep_read_token(&token);
|
||||
read_token(&token);
|
||||
free_token(token);
|
||||
} else
|
||||
*tok = token;
|
||||
|
@ -959,7 +954,7 @@ process_filter(struct tep_event *event, struct tep_filter_arg **parg,
|
|||
|
||||
do {
|
||||
free(token);
|
||||
type = read_token(&token);
|
||||
type = filter_read_token(&token);
|
||||
switch (type) {
|
||||
case TEP_EVENT_SQUOTE:
|
||||
case TEP_EVENT_DQUOTE:
|
||||
|
@ -1185,7 +1180,7 @@ process_event(struct tep_event *event, const char *filter_str,
|
|||
{
|
||||
int ret;
|
||||
|
||||
tep_buffer_init(filter_str, strlen(filter_str));
|
||||
init_input_buf(filter_str, strlen(filter_str));
|
||||
|
||||
ret = process_filter(event, parg, error_str, 0);
|
||||
if (ret < 0)
|
||||
|
@ -1243,7 +1238,7 @@ filter_event(struct tep_event_filter *filter, struct tep_event *event,
|
|||
static void filter_init_error_buf(struct tep_event_filter *filter)
|
||||
{
|
||||
/* clear buffer to reset show error */
|
||||
tep_buffer_init("", 0);
|
||||
init_input_buf("", 0);
|
||||
filter->error_buffer[0] = '\0';
|
||||
}
|
||||
|
||||
|
|
|
@ -174,34 +174,36 @@ For each cacheline in the 1) list we display following data:
|
|||
Cacheline
|
||||
- cacheline address (hex number)
|
||||
|
||||
Total records
|
||||
- sum of all cachelines accesses
|
||||
|
||||
Rmt/Lcl Hitm
|
||||
- cacheline percentage of all Remote/Local HITM accesses
|
||||
|
||||
LLC Load Hitm - Total, Lcl, Rmt
|
||||
LLC Load Hitm - Total, LclHitm, RmtHitm
|
||||
- count of Total/Local/Remote load HITMs
|
||||
|
||||
Store Reference - Total, L1Hit, L1Miss
|
||||
Total - all store accesses
|
||||
L1Hit - store accesses that hit L1
|
||||
L1Hit - store accesses that missed L1
|
||||
Total records
|
||||
- sum of all cachelines accesses
|
||||
|
||||
Load Dram
|
||||
- count of local and remote DRAM accesses
|
||||
|
||||
LLC Ld Miss
|
||||
- count of all accesses that missed LLC
|
||||
|
||||
Total Loads
|
||||
Total loads
|
||||
- sum of all load accesses
|
||||
|
||||
Total stores
|
||||
- sum of all store accesses
|
||||
|
||||
Store Reference - L1Hit, L1Miss
|
||||
L1Hit - store accesses that hit L1
|
||||
L1Miss - store accesses that missed L1
|
||||
|
||||
Core Load Hit - FB, L1, L2
|
||||
- count of load hits in FB (Fill Buffer), L1 and L2 cache
|
||||
|
||||
LLC Load Hit - Llc, Rmt
|
||||
- count of LLC and Remote load hits
|
||||
LLC Load Hit - LlcHit, LclHitm
|
||||
- count of LLC load accesses, includes LLC hits and LLC HITMs
|
||||
|
||||
RMT Load Hit - RmtHit, RmtHitm
|
||||
- count of remote load accesses, includes remote hits and remote HITMs
|
||||
|
||||
Load Dram - Lcl, Rmt
|
||||
- count of local and remote DRAM accesses
|
||||
|
||||
For each offset in the 2) list we display following data:
|
||||
|
||||
|
|
|
@ -242,6 +242,11 @@ annotate.*::
|
|||
These are in control of addresses, jump function, source code
|
||||
in lines of assembly code from a specific program.
|
||||
|
||||
annotate.disassembler_style:
|
||||
Use this to change the default disassembler style to some other value
|
||||
supported by binutils, such as "intel", see the '-M' option help in the
|
||||
'objdump' man page.
|
||||
|
||||
annotate.hide_src_code::
|
||||
If a program which is analyzed has source code,
|
||||
this option lets 'annotate' print a list of assembly code with the source code.
|
||||
|
|
|
@ -182,6 +182,10 @@ OPTIONS
|
|||
--tid=::
|
||||
Only diff samples for given thread ID (comma separated list).
|
||||
|
||||
--stream::
|
||||
Enable hot streams comparison. Stream can be a callchain which is
|
||||
aggregated by the branch records from samples.
|
||||
|
||||
COMPARISON
|
||||
----------
|
||||
The comparison is governed by the baseline file. The baseline perf.data
|
||||
|
|
|
@ -33,7 +33,8 @@ OPTIONS
|
|||
|
||||
-F::
|
||||
--funcs::
|
||||
List all available functions to trace.
|
||||
List available functions to trace. It accepts a pattern to
|
||||
only list interested functions.
|
||||
|
||||
-p::
|
||||
--pid=::
|
||||
|
|
|
@ -24,8 +24,12 @@ information could make use of this facility.
|
|||
OPTIONS
|
||||
-------
|
||||
-b::
|
||||
--build-ids=::
|
||||
--build-ids::
|
||||
Inject build-ids into the output stream
|
||||
|
||||
--buildid-all:
|
||||
Inject build-ids of all DSOs into the output stream
|
||||
|
||||
-v::
|
||||
--verbose::
|
||||
Be more verbose.
|
||||
|
|
|
@ -112,6 +112,32 @@ The flags are "bcrosyiABEx" which stand for branch, call, return, conditional,
|
|||
system, asynchronous, interrupt, transaction abort, trace begin, trace end, and
|
||||
in transaction, respectively.
|
||||
|
||||
perf script also supports higher level ways to dump instruction traces:
|
||||
|
||||
perf script --insn-trace --xed
|
||||
|
||||
Dump all instructions. This requires installing the xed tool (see XED below)
|
||||
Dumping all instructions in a long trace can be fairly slow. It is usually better
|
||||
to start with higher level decoding, like
|
||||
|
||||
perf script --call-trace
|
||||
|
||||
or
|
||||
|
||||
perf script --call-ret-trace
|
||||
|
||||
and then select a time range of interest. The time range can then be examined
|
||||
in detail with
|
||||
|
||||
perf script --time starttime,stoptime --insn-trace --xed
|
||||
|
||||
While examining the trace it's also useful to filter on specific CPUs using
|
||||
the -C option
|
||||
|
||||
perf script --time starttime,stoptime --insn-trace --xed -C 1
|
||||
|
||||
Dump all instructions in time range on CPU 1.
|
||||
|
||||
Another interesting field that is not printed by default is 'ipc' which can be
|
||||
displayed as follows:
|
||||
|
||||
|
@ -558,7 +584,7 @@ The mmap size and auxtrace mmap size are displayed if the -vv option is used e.g
|
|||
Intel PT modes of operation
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
Intel PT can be used in 2 modes:
|
||||
Intel PT can be used in 3 modes:
|
||||
full-trace mode
|
||||
sample mode
|
||||
snapshot mode
|
||||
|
@ -571,7 +597,8 @@ Sample mode attaches a Intel PT sample to other events e.g.
|
|||
|
||||
perf record --aux-sample -e intel_pt//u -e branch-misses:u
|
||||
|
||||
Snapshot mode captures the available data when a signal is sent e.g.
|
||||
Snapshot mode captures the available data when a signal is sent or "snapshot"
|
||||
control command is issued. e.g. using a signal
|
||||
|
||||
perf record -v -e intel_pt//u -S ./loopy 1000000000 &
|
||||
[1] 11435
|
||||
|
@ -582,7 +609,23 @@ Note that the signal sent is SIGUSR2.
|
|||
Note that "Recording AUX area tracing snapshot" is displayed because the -v
|
||||
option is used.
|
||||
|
||||
The 2 modes cannot be used together.
|
||||
The advantage of using "snapshot" control command is that the access is
|
||||
controlled by access to a FIFO e.g.
|
||||
|
||||
$ mkfifo perf.control
|
||||
$ mkfifo perf.ack
|
||||
$ cat perf.ack &
|
||||
[1] 15235
|
||||
$ sudo ~/bin/perf record --control fifo:perf.control,perf.ack -S -e intel_pt//u -- sleep 60 &
|
||||
[2] 15243
|
||||
$ ps -e | grep perf
|
||||
15244 pts/1 00:00:00 perf
|
||||
$ kill -USR2 15244
|
||||
bash: kill: (15244) - Operation not permitted
|
||||
$ echo snapshot > perf.control
|
||||
ack
|
||||
|
||||
The 3 Intel PT modes of operation cannot be used together.
|
||||
|
||||
|
||||
Buffer handling
|
||||
|
@ -1093,6 +1136,10 @@ To display PEBS events from the Intel PT trace, use the itrace 'o' option e.g.
|
|||
|
||||
perf script --itrace=oe
|
||||
|
||||
XED
|
||||
---
|
||||
|
||||
include::build-xed.txt[]
|
||||
|
||||
SEE ALSO
|
||||
--------
|
||||
|
|
|
@ -58,6 +58,7 @@ counted. The following modifiers exist:
|
|||
S - read sample value (PERF_SAMPLE_READ)
|
||||
D - pin the event to the PMU
|
||||
W - group is weak and will fallback to non-group if not schedulable,
|
||||
e - group or event are exclusive and do not share the PMU
|
||||
|
||||
The 'p' modifier can be used for specifying how precise the instruction
|
||||
address should be. The 'p' modifier can be specified multiple times:
|
||||
|
|
|
@ -631,12 +631,14 @@ option. The -e option and this one can be mixed and matched. Events
|
|||
can be grouped using the {} notation.
|
||||
endif::HAVE_LIBPFM[]
|
||||
|
||||
--control fd:ctl-fd[,ack-fd]
|
||||
--control=fifo:ctl-fifo[,ack-fifo]::
|
||||
--control=fd:ctl-fd[,ack-fd]::
|
||||
ctl-fifo / ack-fifo are opened and used as ctl-fd / ack-fd as follows.
|
||||
Listen on ctl-fd descriptor for command to control measurement ('enable': enable events,
|
||||
'disable': disable events). Measurements can be started with events disabled using
|
||||
--delay=-1 option. Optionally send control command completion ('ack\n') to ack-fd descriptor
|
||||
to synchronize with the controlling process. Example of bash shell script to enable and
|
||||
disable events during measurements:
|
||||
'disable': disable events, 'snapshot': AUX area tracing snapshot). Measurements can be
|
||||
started with events disabled using --delay=-1 option. Optionally send control command
|
||||
completion ('ack\n') to ack-fd descriptor to synchronize with the controlling process.
|
||||
Example of bash shell script to enable and disable events during measurements:
|
||||
|
||||
#!/bin/bash
|
||||
|
||||
|
|
|
@ -166,6 +166,11 @@ use '-e e1 -e e2 -G foo,foo' or just use '-e e1 -e e2 -G foo'.
|
|||
If wanting to monitor, say, 'cycles' for a cgroup and also for system wide, this
|
||||
command line can be used: 'perf stat -e cycles -G cgroup_name -a -e cycles'.
|
||||
|
||||
--for-each-cgroup name::
|
||||
Expand event list for each cgroup in "name" (allow multiple cgroups separated
|
||||
by comma). This has same effect that repeating -e option and -G option for
|
||||
each event x name. This option cannot be used with -G/--cgroup option.
|
||||
|
||||
-o file::
|
||||
--output file::
|
||||
Print the output into the designated file.
|
||||
|
@ -180,7 +185,9 @@ with it. --append may be used here. Examples:
|
|||
3>results perf stat --log-fd 3 -- $cmd
|
||||
3>>results perf stat --log-fd 3 --append -- $cmd
|
||||
|
||||
--control fd:ctl-fd[,ack-fd]
|
||||
--control=fifo:ctl-fifo[,ack-fifo]::
|
||||
--control=fd:ctl-fd[,ack-fd]::
|
||||
ctl-fifo / ack-fifo are opened and used as ctl-fd / ack-fd as follows.
|
||||
Listen on ctl-fd descriptor for command to control measurement ('enable': enable events,
|
||||
'disable': disable events). Measurements can be started with events disabled using
|
||||
--delay=-1 option. Optionally send control command completion ('ack\n') to ack-fd descriptor
|
||||
|
@ -361,6 +368,11 @@ if the workload is actually bound by the CPU and not by something else.
|
|||
For best results it is usually a good idea to use it with interval
|
||||
mode like -I 1000, as the bottleneck of workloads can change often.
|
||||
|
||||
This enables --metric-only, unless overridden with --no-metric-only.
|
||||
|
||||
The following restrictions only apply to older Intel CPUs and Atom,
|
||||
on newer CPUs (IceLake and later) TopDown can be collected for any thread:
|
||||
|
||||
The top down metrics are collected per core instead of per
|
||||
CPU thread. Per core mode is automatically enabled
|
||||
and -a (global monitoring) is needed, requiring root rights or
|
||||
|
@ -372,8 +384,6 @@ echo 0 > /proc/sys/kernel/nmi_watchdog
|
|||
for best results. Otherwise the bottlenecks may be inconsistent
|
||||
on workload with changing phases.
|
||||
|
||||
This enables --metric-only, unless overridden with --no-metric-only.
|
||||
|
||||
To interpret the results it is usually needed to know on which
|
||||
CPUs the workload runs on. If needed the CPUs can be forced using
|
||||
taskset.
|
||||
|
|
|
@ -12,6 +12,43 @@ SYNOPSIS
|
|||
|
||||
OPTIONS
|
||||
-------
|
||||
-h::
|
||||
--help::
|
||||
Run perf help command.
|
||||
|
||||
-v::
|
||||
--version::
|
||||
Display perf version.
|
||||
|
||||
-vv::
|
||||
Print the compiled-in status of libraries.
|
||||
|
||||
--exec-path::
|
||||
Display or set exec path.
|
||||
|
||||
--html-path::
|
||||
Display html documentation path.
|
||||
|
||||
-p::
|
||||
--paginate::
|
||||
Set up pager.
|
||||
|
||||
--no-pager::
|
||||
Do not set pager.
|
||||
|
||||
--buildid-dir::
|
||||
Setup buildid cache directory. It has higher priority
|
||||
than buildid.dir config file option.
|
||||
|
||||
--list-cmds::
|
||||
List the most commonly used perf commands.
|
||||
|
||||
--list-opts::
|
||||
List available perf options.
|
||||
|
||||
--debugfs-dir::
|
||||
Set debugfs directory or set environment variable PERF_DEBUGFS_DIR.
|
||||
|
||||
--debug::
|
||||
Setup debug variable (see list below) in value
|
||||
range (0, 10). Use like:
|
||||
|
@ -27,18 +64,6 @@ OPTIONS
|
|||
perf-event-open - Print perf_event_open() arguments and
|
||||
return value
|
||||
|
||||
--buildid-dir::
|
||||
Setup buildid cache directory. It has higher priority than
|
||||
buildid.dir config file option.
|
||||
|
||||
-v::
|
||||
--version::
|
||||
Display perf version.
|
||||
|
||||
-h::
|
||||
--help::
|
||||
Run perf help command.
|
||||
|
||||
DESCRIPTION
|
||||
-----------
|
||||
Performance counters for Linux are a new kernel-based subsystem
|
||||
|
|
|
@ -0,0 +1,256 @@
|
|||
Using TopDown metrics in user space
|
||||
-----------------------------------
|
||||
|
||||
Intel CPUs (since Sandy Bridge and Silvermont) support a TopDown
|
||||
methology to break down CPU pipeline execution into 4 bottlenecks:
|
||||
frontend bound, backend bound, bad speculation, retiring.
|
||||
|
||||
For more details on Topdown see [1][5]
|
||||
|
||||
Traditionally this was implemented by events in generic counters
|
||||
and specific formulas to compute the bottlenecks.
|
||||
|
||||
perf stat --topdown implements this.
|
||||
|
||||
Full Top Down includes more levels that can break down the
|
||||
bottlenecks further. This is not directly implemented in perf,
|
||||
but available in other tools that can run on top of perf,
|
||||
such as toplev[2] or vtune[3]
|
||||
|
||||
New Topdown features in Ice Lake
|
||||
===============================
|
||||
|
||||
With Ice Lake CPUs the TopDown metrics are directly available as
|
||||
fixed counters and do not require generic counters. This allows
|
||||
to collect TopDown always in addition to other events.
|
||||
|
||||
% perf stat -a --topdown -I1000
|
||||
# time retiring bad speculation frontend bound backend bound
|
||||
1.001281330 23.0% 15.3% 29.6% 32.1%
|
||||
2.003009005 5.0% 6.8% 46.6% 41.6%
|
||||
3.004646182 6.7% 6.7% 46.0% 40.6%
|
||||
4.006326375 5.0% 6.4% 47.6% 41.0%
|
||||
5.007991804 5.1% 6.3% 46.3% 42.3%
|
||||
6.009626773 6.2% 7.1% 47.3% 39.3%
|
||||
7.011296356 4.7% 6.7% 46.2% 42.4%
|
||||
8.012951831 4.7% 6.7% 47.5% 41.1%
|
||||
...
|
||||
|
||||
This also enables measuring TopDown per thread/process instead
|
||||
of only per core.
|
||||
|
||||
Using TopDown through RDPMC in applications on Ice Lake
|
||||
======================================================
|
||||
|
||||
For more fine grained measurements it can be useful to
|
||||
access the new directly from user space. This is more complicated,
|
||||
but drastically lowers overhead.
|
||||
|
||||
On Ice Lake, there is a new fixed counter 3: SLOTS, which reports
|
||||
"pipeline SLOTS" (cycles multiplied by core issue width) and a
|
||||
metric register that reports slots ratios for the different bottleneck
|
||||
categories.
|
||||
|
||||
The metrics counter is CPU model specific and is not available on older
|
||||
CPUs.
|
||||
|
||||
Example code
|
||||
============
|
||||
|
||||
Library functions to do the functionality described below
|
||||
is also available in libjevents [4]
|
||||
|
||||
The application opens a group with fixed counter 3 (SLOTS) and any
|
||||
metric event, and allow user programs to read the performance counters.
|
||||
|
||||
Fixed counter 3 is mapped to a pseudo event event=0x00, umask=04,
|
||||
so the perf_event_attr structure should be initialized with
|
||||
{ .config = 0x0400, .type = PERF_TYPE_RAW }
|
||||
The metric events are mapped to the pseudo event event=0x00, umask=0x8X.
|
||||
For example, the perf_event_attr structure can be initialized with
|
||||
{ .config = 0x8000, .type = PERF_TYPE_RAW } for Retiring metric event
|
||||
The Fixed counter 3 must be the leader of the group.
|
||||
|
||||
#include <linux/perf_event.h>
|
||||
#include <sys/syscall.h>
|
||||
#include <unistd.h>
|
||||
|
||||
/* Provide own perf_event_open stub because glibc doesn't */
|
||||
__attribute__((weak))
|
||||
int perf_event_open(struct perf_event_attr *attr, pid_t pid,
|
||||
int cpu, int group_fd, unsigned long flags)
|
||||
{
|
||||
return syscall(__NR_perf_event_open, attr, pid, cpu, group_fd, flags);
|
||||
}
|
||||
|
||||
/* Open slots counter file descriptor for current task. */
|
||||
struct perf_event_attr slots = {
|
||||
.type = PERF_TYPE_RAW,
|
||||
.size = sizeof(struct perf_event_attr),
|
||||
.config = 0x400,
|
||||
.exclude_kernel = 1,
|
||||
};
|
||||
|
||||
int slots_fd = perf_event_open(&slots, 0, -1, -1, 0);
|
||||
if (slots_fd < 0)
|
||||
... error ...
|
||||
|
||||
/*
|
||||
* Open metrics event file descriptor for current task.
|
||||
* Set slots event as the leader of the group.
|
||||
*/
|
||||
struct perf_event_attr metrics = {
|
||||
.type = PERF_TYPE_RAW,
|
||||
.size = sizeof(struct perf_event_attr),
|
||||
.config = 0x8000,
|
||||
.exclude_kernel = 1,
|
||||
};
|
||||
|
||||
int metrics_fd = perf_event_open(&metrics, 0, -1, slots_fd, 0);
|
||||
if (metrics_fd < 0)
|
||||
... error ...
|
||||
|
||||
|
||||
The RDPMC instruction (or _rdpmc compiler intrinsic) can now be used
|
||||
to read slots and the topdown metrics at different points of the program:
|
||||
|
||||
#include <stdint.h>
|
||||
#include <x86intrin.h>
|
||||
|
||||
#define RDPMC_FIXED (1 << 30) /* return fixed counters */
|
||||
#define RDPMC_METRIC (1 << 29) /* return metric counters */
|
||||
|
||||
#define FIXED_COUNTER_SLOTS 3
|
||||
#define METRIC_COUNTER_TOPDOWN_L1 0
|
||||
|
||||
static inline uint64_t read_slots(void)
|
||||
{
|
||||
return _rdpmc(RDPMC_FIXED | FIXED_COUNTER_SLOTS);
|
||||
}
|
||||
|
||||
static inline uint64_t read_metrics(void)
|
||||
{
|
||||
return _rdpmc(RDPMC_METRIC | METRIC_COUNTER_TOPDOWN_L1);
|
||||
}
|
||||
|
||||
Then the program can be instrumented to read these metrics at different
|
||||
points.
|
||||
|
||||
It's not a good idea to do this with too short code regions,
|
||||
as the parallelism and overlap in the CPU program execution will
|
||||
cause too much measurement inaccuracy. For example instrumenting
|
||||
individual basic blocks is definitely too fine grained.
|
||||
|
||||
Decoding metrics values
|
||||
=======================
|
||||
|
||||
The value reported by read_metrics() contains four 8 bit fields
|
||||
that represent a scaled ratio that represent the Level 1 bottleneck.
|
||||
All four fields add up to 0xff (= 100%)
|
||||
|
||||
The binary ratios in the metric value can be converted to float ratios:
|
||||
|
||||
#define GET_METRIC(m, i) (((m) >> (i*8)) & 0xff)
|
||||
|
||||
#define TOPDOWN_RETIRING(val) ((float)GET_METRIC(val, 0) / 0xff)
|
||||
#define TOPDOWN_BAD_SPEC(val) ((float)GET_METRIC(val, 1) / 0xff)
|
||||
#define TOPDOWN_FE_BOUND(val) ((float)GET_METRIC(val, 2) / 0xff)
|
||||
#define TOPDOWN_BE_BOUND(val) ((float)GET_METRIC(val, 3) / 0xff)
|
||||
|
||||
and then converted to percent for printing.
|
||||
|
||||
The ratios in the metric accumulate for the time when the counter
|
||||
is enabled. For measuring programs it is often useful to measure
|
||||
specific sections. For this it is needed to deltas on metrics.
|
||||
|
||||
This can be done by scaling the metrics with the slots counter
|
||||
read at the same time.
|
||||
|
||||
Then it's possible to take deltas of these slots counts
|
||||
measured at different points, and determine the metrics
|
||||
for that time period.
|
||||
|
||||
slots_a = read_slots();
|
||||
metric_a = read_metrics();
|
||||
|
||||
... larger code region ...
|
||||
|
||||
slots_b = read_slots()
|
||||
metric_b = read_metrics()
|
||||
|
||||
# compute scaled metrics for measurement a
|
||||
retiring_slots_a = GET_METRIC(metric_a, 0) * slots_a
|
||||
bad_spec_slots_a = GET_METRIC(metric_a, 1) * slots_a
|
||||
fe_bound_slots_a = GET_METRIC(metric_a, 2) * slots_a
|
||||
be_bound_slots_a = GET_METRIC(metric_a, 3) * slots_a
|
||||
|
||||
# compute delta scaled metrics between b and a
|
||||
retiring_slots = GET_METRIC(metric_b, 0) * slots_b - retiring_slots_a
|
||||
bad_spec_slots = GET_METRIC(metric_b, 1) * slots_b - bad_spec_slots_a
|
||||
fe_bound_slots = GET_METRIC(metric_b, 2) * slots_b - fe_bound_slots_a
|
||||
be_bound_slots = GET_METRIC(metric_b, 3) * slots_b - be_bound_slots_a
|
||||
|
||||
Later the individual ratios for the measurement period can be recreated
|
||||
from these counts.
|
||||
|
||||
slots_delta = slots_b - slots_a
|
||||
retiring_ratio = (float)retiring_slots / slots_delta
|
||||
bad_spec_ratio = (float)bad_spec_slots / slots_delta
|
||||
fe_bound_ratio = (float)fe_bound_slots / slots_delta
|
||||
be_bound_ratio = (float)be_bound_slots / slota_delta
|
||||
|
||||
printf("Retiring %.2f%% Bad Speculation %.2f%% FE Bound %.2f%% BE Bound %.2f%%\n",
|
||||
retiring_ratio * 100.,
|
||||
bad_spec_ratio * 100.,
|
||||
fe_bound_ratio * 100.,
|
||||
be_bound_ratio * 100.);
|
||||
|
||||
Resetting metrics counters
|
||||
==========================
|
||||
|
||||
Since the individual metrics are only 8bit they lose precision for
|
||||
short regions over time because the number of cycles covered by each
|
||||
fraction bit shrinks. So the counters need to be reset regularly.
|
||||
|
||||
When using the kernel perf API the kernel resets on every read.
|
||||
So as long as the reading is at reasonable intervals (every few
|
||||
seconds) the precision is good.
|
||||
|
||||
When using perf stat it is recommended to always use the -I option,
|
||||
with no longer interval than a few seconds
|
||||
|
||||
perf stat -I 1000 --topdown ...
|
||||
|
||||
For user programs using RDPMC directly the counter can
|
||||
be reset explicitly using ioctl:
|
||||
|
||||
ioctl(perf_fd, PERF_EVENT_IOC_RESET, 0);
|
||||
|
||||
This "opens" a new measurement period.
|
||||
|
||||
A program using RDPMC for TopDown should schedule such a reset
|
||||
regularly, as in every few seconds.
|
||||
|
||||
Limits on Ice Lake
|
||||
==================
|
||||
|
||||
Four pseudo TopDown metric events are exposed for the end-users,
|
||||
topdown-retiring, topdown-bad-spec, topdown-fe-bound and topdown-be-bound.
|
||||
They can be used to collect the TopDown value under the following
|
||||
rules:
|
||||
- All the TopDown metric events must be in a group with the SLOTS event.
|
||||
- The SLOTS event must be the leader of the group.
|
||||
- The PERF_FORMAT_GROUP flag must be applied for each TopDown metric
|
||||
events
|
||||
|
||||
The SLOTS event and the TopDown metric events can be counting members of
|
||||
a sampling read group. Since the SLOTS event must be the leader of a TopDown
|
||||
group, the second event of the group is the sampling event.
|
||||
For example, perf record -e '{slots, $sampling_event, topdown-retiring}:S'
|
||||
|
||||
|
||||
[1] https://software.intel.com/en-us/top-down-microarchitecture-analysis-method-win
|
||||
[2] https://github.com/andikleen/pmu-tools/wiki/toplev-manual
|
||||
[3] https://software.intel.com/en-us/intel-vtune-amplifier-xe
|
||||
[4] https://github.com/andikleen/pmu-tools/tree/master/jevents
|
||||
[5] https://sites.google.com/site/analysismethods/yasin-pubs
|
|
@ -223,14 +223,17 @@ endif
|
|||
|
||||
# Try different combinations to accommodate systems that only have
|
||||
# python[2][-config] in weird combinations but always preferring
|
||||
# python2 and python2-config as per pep-0394. If we catch a
|
||||
# python[-config] in version 3, the version check will kill it.
|
||||
PYTHON2 := $(if $(call get-executable,python2),python2,python)
|
||||
override PYTHON := $(call get-executable-or-default,PYTHON,$(PYTHON2))
|
||||
PYTHON2_CONFIG := \
|
||||
# python2 and python2-config as per pep-0394. If python2 or python
|
||||
# aren't found, then python3 is used.
|
||||
PYTHON_AUTO := python
|
||||
PYTHON_AUTO := $(if $(call get-executable,python3),python3,$(PYTHON_AUTO))
|
||||
PYTHON_AUTO := $(if $(call get-executable,python),python,$(PYTHON_AUTO))
|
||||
PYTHON_AUTO := $(if $(call get-executable,python2),python2,$(PYTHON_AUTO))
|
||||
override PYTHON := $(call get-executable-or-default,PYTHON,$(PYTHON_AUTO))
|
||||
PYTHON_AUTO_CONFIG := \
|
||||
$(if $(call get-executable,$(PYTHON)-config),$(PYTHON)-config,python-config)
|
||||
override PYTHON_CONFIG := \
|
||||
$(call get-executable-or-default,PYTHON_CONFIG,$(PYTHON2_CONFIG))
|
||||
$(call get-executable-or-default,PYTHON_CONFIG,$(PYTHON_AUTO_CONFIG))
|
||||
|
||||
grep-libs = $(filter -l%,$(1))
|
||||
strip-libs = $(filter-out -l%,$(1))
|
||||
|
@ -720,12 +723,14 @@ ifndef NO_SLANG
|
|||
endif
|
||||
endif
|
||||
|
||||
ifndef NO_GTK2
|
||||
ifdef GTK2
|
||||
FLAGS_GTK2=$(CFLAGS) $(LDFLAGS) $(EXTLIBS) $(shell $(PKG_CONFIG) --libs --cflags gtk+-2.0 2>/dev/null)
|
||||
$(call feature_check,gtk2)
|
||||
ifneq ($(feature-gtk2), 1)
|
||||
msg := $(warning GTK2 not found, disables GTK2 support. Please install gtk2-devel or libgtk2.0-dev);
|
||||
NO_GTK2 := 1
|
||||
else
|
||||
$(call feature_check,gtk2-infobar)
|
||||
ifeq ($(feature-gtk2-infobar), 1)
|
||||
GTK_CFLAGS := -DHAVE_GTK_INFO_BAR_SUPPORT
|
||||
endif
|
||||
|
@ -821,6 +826,12 @@ else
|
|||
$(call feature_check,disassembler-four-args)
|
||||
endif
|
||||
|
||||
ifeq ($(feature-libbfd-buildid), 1)
|
||||
CFLAGS += -DHAVE_LIBBFD_BUILDID_SUPPORT
|
||||
else
|
||||
msg := $(warning Old version of libbfd/binutils things like PE executable profiling will not be available);
|
||||
endif
|
||||
|
||||
ifdef NO_DEMANGLE
|
||||
CFLAGS += -DNO_DEMANGLE
|
||||
else
|
||||
|
|
|
@ -48,7 +48,7 @@ include ../scripts/utilities.mak
|
|||
#
|
||||
# Define NO_SLANG if you do not want TUI support.
|
||||
#
|
||||
# Define NO_GTK2 if you do not want GTK+ GUI support.
|
||||
# Define GTK2 if you want GTK+ GUI support.
|
||||
#
|
||||
# Define NO_DEMANGLE if you do not want C++ symbol demangling.
|
||||
#
|
||||
|
@ -386,7 +386,7 @@ ifneq ($(OUTPUT),)
|
|||
CFLAGS += -I$(OUTPUT)
|
||||
endif
|
||||
|
||||
ifndef NO_GTK2
|
||||
ifdef GTK2
|
||||
ALL_PROGRAMS += $(OUTPUT)libperf-gtk.so
|
||||
GTK_IN := $(OUTPUT)gtk-in.o
|
||||
endif
|
||||
|
@ -537,6 +537,12 @@ mmap_flags_tbl := $(srctree)/tools/perf/trace/beauty/mmap_flags.sh
|
|||
$(mmap_flags_array): $(linux_uapi_dir)/mman.h $(asm_generic_uapi_dir)/mman.h $(asm_generic_uapi_dir)/mman-common.h $(mmap_flags_tbl)
|
||||
$(Q)$(SHELL) '$(mmap_flags_tbl)' $(linux_uapi_dir) $(asm_generic_uapi_dir) $(arch_asm_uapi_dir) > $@
|
||||
|
||||
mremap_flags_array := $(beauty_outdir)/mremap_flags_array.c
|
||||
mremap_flags_tbl := $(srctree)/tools/perf/trace/beauty/mremap_flags.sh
|
||||
|
||||
$(mremap_flags_array): $(linux_uapi_dir)/mman.h $(mremap_flags_tbl)
|
||||
$(Q)$(SHELL) '$(mremap_flags_tbl)' $(linux_uapi_dir) > $@
|
||||
|
||||
mount_flags_array := $(beauty_outdir)/mount_flags_array.c
|
||||
mount_flags_tbl := $(srctree)/tools/perf/trace/beauty/mount_flags.sh
|
||||
|
||||
|
@ -549,6 +555,13 @@ move_mount_flags_tbl := $(srctree)/tools/perf/trace/beauty/move_mount_flags.sh
|
|||
$(move_mount_flags_array): $(linux_uapi_dir)/fs.h $(move_mount_flags_tbl)
|
||||
$(Q)$(SHELL) '$(move_mount_flags_tbl)' $(linux_uapi_dir) > $@
|
||||
|
||||
|
||||
mmap_prot_array := $(beauty_outdir)/mmap_prot_array.c
|
||||
mmap_prot_tbl := $(srctree)/tools/perf/trace/beauty/mmap_prot.sh
|
||||
|
||||
$(mmap_prot_array): $(asm_generic_uapi_dir)/mman.h $(asm_generic_uapi_dir)/mman-common.h $(mmap_prot_tbl)
|
||||
$(Q)$(SHELL) '$(mmap_prot_tbl)' $(asm_generic_uapi_dir) $(arch_asm_uapi_dir) > $@
|
||||
|
||||
prctl_option_array := $(beauty_outdir)/prctl_option_array.c
|
||||
prctl_hdr_dir := $(srctree)/tools/include/uapi/linux/
|
||||
prctl_option_tbl := $(srctree)/tools/perf/trace/beauty/prctl_option.sh
|
||||
|
@ -710,6 +723,8 @@ prepare: $(OUTPUT)PERF-VERSION-FILE $(OUTPUT)common-cmds.h archheaders $(drm_ioc
|
|||
$(vhost_virtio_ioctl_array) \
|
||||
$(madvise_behavior_array) \
|
||||
$(mmap_flags_array) \
|
||||
$(mmap_prot_array) \
|
||||
$(mremap_flags_array) \
|
||||
$(mount_flags_array) \
|
||||
$(move_mount_flags_array) \
|
||||
$(perf_ioctl_array) \
|
||||
|
@ -886,7 +901,7 @@ check: $(OUTPUT)common-cmds.h
|
|||
|
||||
### Installation rules
|
||||
|
||||
ifndef NO_GTK2
|
||||
ifdef GTK2
|
||||
install-gtk: $(OUTPUT)libperf-gtk.so
|
||||
$(call QUIET_INSTALL, 'GTK UI') \
|
||||
$(INSTALL) -d -m 755 '$(DESTDIR_SQ)$(libdir_SQ)'; \
|
||||
|
@ -961,6 +976,7 @@ install-tests: all install-gtk
|
|||
$(call QUIET_INSTALL, tests) \
|
||||
$(INSTALL) -d -m 755 '$(DESTDIR_SQ)$(perfexec_instdir_SQ)/tests'; \
|
||||
$(INSTALL) tests/attr.py '$(DESTDIR_SQ)$(perfexec_instdir_SQ)/tests'; \
|
||||
$(INSTALL) tests/pe-file.exe* '$(DESTDIR_SQ)$(perfexec_instdir_SQ)/tests'; \
|
||||
$(INSTALL) -d -m 755 '$(DESTDIR_SQ)$(perfexec_instdir_SQ)/tests/attr'; \
|
||||
$(INSTALL) tests/attr/* '$(DESTDIR_SQ)$(perfexec_instdir_SQ)/tests/attr'; \
|
||||
$(INSTALL) -d -m 755 '$(DESTDIR_SQ)$(perfexec_instdir_SQ)/tests/shell'; \
|
||||
|
@ -1007,6 +1023,8 @@ clean:: $(LIBTRACEEVENT)-clean $(LIBAPI)-clean $(LIBBPF)-clean $(LIBSUBCMD)-clea
|
|||
$(OUTPUT)$(fspick_arrays) \
|
||||
$(OUTPUT)$(madvise_behavior_array) \
|
||||
$(OUTPUT)$(mmap_flags_array) \
|
||||
$(OUTPUT)$(mmap_prot_array) \
|
||||
$(OUTPUT)$(mremap_flags_array) \
|
||||
$(OUTPUT)$(mount_flags_array) \
|
||||
$(OUTPUT)$(move_mount_flags_array) \
|
||||
$(OUTPUT)$(drm_ioctl_array) \
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
perf-y += header.o
|
||||
perf-y += machine.o
|
||||
perf-y += perf_regs.o
|
||||
perf-y += tsc.o
|
||||
perf-$(CONFIG_DWARF) += dwarf-regs.o
|
||||
perf-$(CONFIG_LOCAL_LIBUNWIND) += unwind-libunwind.o
|
||||
perf-$(CONFIG_LIBDW_DWARF_UNWIND) += unwind-libdw.o
|
||||
|
|
|
@ -0,0 +1,21 @@
|
|||
// SPDX-License-Identifier: GPL-2.0
|
||||
|
||||
#include <linux/types.h>
|
||||
|
||||
#include "../../../util/tsc.h"
|
||||
|
||||
u64 rdtsc(void)
|
||||
{
|
||||
u64 val;
|
||||
|
||||
/*
|
||||
* According to ARM DDI 0487F.c, from Armv8.0 to Armv8.5 inclusive, the
|
||||
* system counter is at least 56 bits wide; from Armv8.6, the counter
|
||||
* must be 64 bits wide. So the system counter could be less than 64
|
||||
* bits wide and it is attributed with the flag 'cap_user_time_short'
|
||||
* is true.
|
||||
*/
|
||||
asm volatile("mrs %0, cntvct_el0" : "=r" (val));
|
||||
|
||||
return val;
|
||||
}
|
|
@ -40,8 +40,11 @@ get_cpuid_str(struct perf_pmu *pmu __maybe_unused)
|
|||
return bufp;
|
||||
}
|
||||
|
||||
int arch_get_runtimeparam(void)
|
||||
int arch_get_runtimeparam(struct pmu_event *pe)
|
||||
{
|
||||
int count;
|
||||
return sysfs__read_int("/devices/hv_24x7/interface/sockets", &count) < 0 ? 1 : count;
|
||||
char path[PATH_MAX] = "/devices/hv_24x7/interface/";
|
||||
|
||||
atoi(pe->aggr_mode) == PerChip ? strcat(path, "sockets") : strcat(path, "coresperchip");
|
||||
return sysfs__read_int(path, &count) < 0 ? 1 : count;
|
||||
}
|
||||
|
|
|
@ -110,6 +110,7 @@ static struct ins x86__instructions[] = {
|
|||
{ .name = "por", .ops = &mov_ops, },
|
||||
{ .name = "rclb", .ops = &mov_ops, },
|
||||
{ .name = "rcll", .ops = &mov_ops, },
|
||||
{ .name = "ret", .ops = &ret_ops, },
|
||||
{ .name = "retq", .ops = &ret_ops, },
|
||||
{ .name = "sbb", .ops = &mov_ops, },
|
||||
{ .name = "sbbl", .ops = &mov_ops, },
|
||||
|
|
|
@ -3,7 +3,7 @@ perf-y += tsc.o
|
|||
perf-y += pmu.o
|
||||
perf-y += kvm-stat.o
|
||||
perf-y += perf_regs.o
|
||||
perf-y += group.o
|
||||
perf-y += topdown.o
|
||||
perf-y += machine.o
|
||||
perf-y += event.o
|
||||
|
||||
|
|
|
@ -1,28 +0,0 @@
|
|||
// SPDX-License-Identifier: GPL-2.0
|
||||
#include <stdio.h>
|
||||
#include "api/fs/fs.h"
|
||||
#include "util/group.h"
|
||||
|
||||
/*
|
||||
* Check whether we can use a group for top down.
|
||||
* Without a group may get bad results due to multiplexing.
|
||||
*/
|
||||
bool arch_topdown_check_group(bool *warn)
|
||||
{
|
||||
int n;
|
||||
|
||||
if (sysctl__read_int("kernel/nmi_watchdog", &n) < 0)
|
||||
return false;
|
||||
if (n > 0) {
|
||||
*warn = true;
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
void arch_topdown_group_warn(void)
|
||||
{
|
||||
fprintf(stderr,
|
||||
"nmi_watchdog enabled with topdown. May give wrong results.\n"
|
||||
"Disable with echo 0 > /proc/sys/kernel/nmi_watchdog\n");
|
||||
}
|
|
@ -0,0 +1,63 @@
|
|||
// SPDX-License-Identifier: GPL-2.0
|
||||
#include <stdio.h>
|
||||
#include "api/fs/fs.h"
|
||||
#include "util/pmu.h"
|
||||
#include "util/topdown.h"
|
||||
|
||||
/*
|
||||
* Check whether we can use a group for top down.
|
||||
* Without a group may get bad results due to multiplexing.
|
||||
*/
|
||||
bool arch_topdown_check_group(bool *warn)
|
||||
{
|
||||
int n;
|
||||
|
||||
if (sysctl__read_int("kernel/nmi_watchdog", &n) < 0)
|
||||
return false;
|
||||
if (n > 0) {
|
||||
*warn = true;
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
void arch_topdown_group_warn(void)
|
||||
{
|
||||
fprintf(stderr,
|
||||
"nmi_watchdog enabled with topdown. May give wrong results.\n"
|
||||
"Disable with echo 0 > /proc/sys/kernel/nmi_watchdog\n");
|
||||
}
|
||||
|
||||
#define TOPDOWN_SLOTS 0x0400
|
||||
|
||||
static bool is_topdown_slots_event(struct evsel *counter)
|
||||
{
|
||||
if (!counter->pmu_name)
|
||||
return false;
|
||||
|
||||
if (strcmp(counter->pmu_name, "cpu"))
|
||||
return false;
|
||||
|
||||
if (counter->core.attr.config == TOPDOWN_SLOTS)
|
||||
return true;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/*
|
||||
* Check whether a topdown group supports sample-read.
|
||||
*
|
||||
* Only Topdown metic supports sample-read. The slots
|
||||
* event must be the leader of the topdown group.
|
||||
*/
|
||||
|
||||
bool arch_topdown_sample_read(struct evsel *leader)
|
||||
{
|
||||
if (!pmu_have_event("cpu", "slots"))
|
||||
return false;
|
||||
|
||||
if (is_topdown_slots_event(leader))
|
||||
return true;
|
||||
|
||||
return false;
|
||||
}
|
|
@ -1,46 +1,8 @@
|
|||
// SPDX-License-Identifier: GPL-2.0
|
||||
#include <stdbool.h>
|
||||
#include <errno.h>
|
||||
|
||||
#include <linux/stddef.h>
|
||||
#include <linux/perf_event.h>
|
||||
|
||||
#include <linux/types.h>
|
||||
#include <asm/barrier.h>
|
||||
#include "../../../util/debug.h"
|
||||
#include "../../../util/event.h"
|
||||
#include "../../../util/synthetic-events.h"
|
||||
|
||||
#include "../../../util/tsc.h"
|
||||
|
||||
int perf_read_tsc_conversion(const struct perf_event_mmap_page *pc,
|
||||
struct perf_tsc_conversion *tc)
|
||||
{
|
||||
bool cap_user_time_zero;
|
||||
u32 seq;
|
||||
int i = 0;
|
||||
|
||||
while (1) {
|
||||
seq = pc->lock;
|
||||
rmb();
|
||||
tc->time_mult = pc->time_mult;
|
||||
tc->time_shift = pc->time_shift;
|
||||
tc->time_zero = pc->time_zero;
|
||||
cap_user_time_zero = pc->cap_user_time_zero;
|
||||
rmb();
|
||||
if (pc->lock == seq && !(seq & 1))
|
||||
break;
|
||||
if (++i > 10000) {
|
||||
pr_debug("failed to get perf_event_mmap_page lock\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
}
|
||||
|
||||
if (!cap_user_time_zero)
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
u64 rdtsc(void)
|
||||
{
|
||||
unsigned int low, high;
|
||||
|
@ -49,36 +11,3 @@ u64 rdtsc(void)
|
|||
|
||||
return low | ((u64)high) << 32;
|
||||
}
|
||||
|
||||
int perf_event__synth_time_conv(const struct perf_event_mmap_page *pc,
|
||||
struct perf_tool *tool,
|
||||
perf_event__handler_t process,
|
||||
struct machine *machine)
|
||||
{
|
||||
union perf_event event = {
|
||||
.time_conv = {
|
||||
.header = {
|
||||
.type = PERF_RECORD_TIME_CONV,
|
||||
.size = sizeof(struct perf_record_time_conv),
|
||||
},
|
||||
},
|
||||
};
|
||||
struct perf_tsc_conversion tc;
|
||||
int err;
|
||||
|
||||
if (!pc)
|
||||
return 0;
|
||||
err = perf_read_tsc_conversion(pc, &tc);
|
||||
if (err == -EOPNOTSUPP)
|
||||
return 0;
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
pr_debug2("Synthesizing TSC conversion information\n");
|
||||
|
||||
event.time_conv.time_mult = tc.time_mult;
|
||||
event.time_conv.time_shift = tc.time_shift;
|
||||
event.time_conv.time_zero = tc.time_zero;
|
||||
|
||||
return process(tool, &event, NULL, machine);
|
||||
}
|
||||
|
|
|
@ -12,6 +12,7 @@ perf-y += epoll-ctl.o
|
|||
perf-y += synthesize.o
|
||||
perf-y += kallsyms-parse.o
|
||||
perf-y += find-bit-bench.o
|
||||
perf-y += inject-buildid.o
|
||||
|
||||
perf-$(CONFIG_X86_64) += mem-memcpy-x86-64-asm.o
|
||||
perf-$(CONFIG_X86_64) += mem-memset-x86-64-asm.o
|
||||
|
|
|
@ -47,6 +47,7 @@ int bench_epoll_wait(int argc, const char **argv);
|
|||
int bench_epoll_ctl(int argc, const char **argv);
|
||||
int bench_synthesize(int argc, const char **argv);
|
||||
int bench_kallsyms_parse(int argc, const char **argv);
|
||||
int bench_inject_build_id(int argc, const char **argv);
|
||||
|
||||
#define BENCH_FORMAT_DEFAULT_STR "default"
|
||||
#define BENCH_FORMAT_DEFAULT 0
|
||||
|
|
|
@ -0,0 +1,476 @@
|
|||
// SPDX-License-Identifier: GPL-2.0
|
||||
#include <stdlib.h>
|
||||
#include <stddef.h>
|
||||
#include <ftw.h>
|
||||
#include <fcntl.h>
|
||||
#include <errno.h>
|
||||
#include <unistd.h>
|
||||
#include <pthread.h>
|
||||
#include <sys/mman.h>
|
||||
#include <sys/wait.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/time64.h>
|
||||
#include <linux/list.h>
|
||||
#include <linux/err.h>
|
||||
#include <internal/lib.h>
|
||||
#include <subcmd/parse-options.h>
|
||||
|
||||
#include "bench.h"
|
||||
#include "util/data.h"
|
||||
#include "util/stat.h"
|
||||
#include "util/debug.h"
|
||||
#include "util/event.h"
|
||||
#include "util/symbol.h"
|
||||
#include "util/session.h"
|
||||
#include "util/build-id.h"
|
||||
#include "util/synthetic-events.h"
|
||||
|
||||
#define MMAP_DEV_MAJOR 8
|
||||
#define DSO_MMAP_RATIO 4
|
||||
|
||||
static unsigned int iterations = 100;
|
||||
static unsigned int nr_mmaps = 100;
|
||||
static unsigned int nr_samples = 100; /* samples per mmap */
|
||||
|
||||
static u64 bench_sample_type;
|
||||
static u16 bench_id_hdr_size;
|
||||
|
||||
struct bench_data {
|
||||
int pid;
|
||||
int input_pipe[2];
|
||||
int output_pipe[2];
|
||||
pthread_t th;
|
||||
};
|
||||
|
||||
struct bench_dso {
|
||||
struct list_head list;
|
||||
char *name;
|
||||
int ino;
|
||||
};
|
||||
|
||||
static int nr_dsos;
|
||||
static struct bench_dso *dsos;
|
||||
|
||||
extern int cmd_inject(int argc, const char *argv[]);
|
||||
|
||||
static const struct option options[] = {
|
||||
OPT_UINTEGER('i', "iterations", &iterations,
|
||||
"Number of iterations used to compute average (default: 100)"),
|
||||
OPT_UINTEGER('m', "nr-mmaps", &nr_mmaps,
|
||||
"Number of mmap events for each iteration (default: 100)"),
|
||||
OPT_UINTEGER('n', "nr-samples", &nr_samples,
|
||||
"Number of sample events per mmap event (default: 100)"),
|
||||
OPT_INCR('v', "verbose", &verbose,
|
||||
"be more verbose (show iteration count, DSO name, etc)"),
|
||||
OPT_END()
|
||||
};
|
||||
|
||||
static const char *const bench_usage[] = {
|
||||
"perf bench internals inject-build-id <options>",
|
||||
NULL
|
||||
};
|
||||
|
||||
/*
|
||||
* Helper for collect_dso that adds the given file as a dso to dso_list
|
||||
* if it contains a build-id. Stops after collecting 4 times more than
|
||||
* we need (for MMAP2 events).
|
||||
*/
|
||||
static int add_dso(const char *fpath, const struct stat *sb __maybe_unused,
|
||||
int typeflag, struct FTW *ftwbuf __maybe_unused)
|
||||
{
|
||||
struct bench_dso *dso = &dsos[nr_dsos];
|
||||
struct build_id bid;
|
||||
|
||||
if (typeflag == FTW_D || typeflag == FTW_SL)
|
||||
return 0;
|
||||
|
||||
if (filename__read_build_id(fpath, &bid) < 0)
|
||||
return 0;
|
||||
|
||||
dso->name = realpath(fpath, NULL);
|
||||
if (dso->name == NULL)
|
||||
return -1;
|
||||
|
||||
dso->ino = nr_dsos++;
|
||||
pr_debug2(" Adding DSO: %s\n", fpath);
|
||||
|
||||
/* stop if we collected enough DSOs */
|
||||
if ((unsigned int)nr_dsos == DSO_MMAP_RATIO * nr_mmaps)
|
||||
return 1;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void collect_dso(void)
|
||||
{
|
||||
dsos = calloc(nr_mmaps * DSO_MMAP_RATIO, sizeof(*dsos));
|
||||
if (dsos == NULL) {
|
||||
printf(" Memory allocation failed\n");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
if (nftw("/usr/lib/", add_dso, 10, FTW_PHYS) < 0)
|
||||
return;
|
||||
|
||||
pr_debug(" Collected %d DSOs\n", nr_dsos);
|
||||
}
|
||||
|
||||
static void release_dso(void)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < nr_dsos; i++) {
|
||||
struct bench_dso *dso = &dsos[i];
|
||||
|
||||
free(dso->name);
|
||||
}
|
||||
free(dsos);
|
||||
}
|
||||
|
||||
/* Fake address used by mmap and sample events */
|
||||
static u64 dso_map_addr(struct bench_dso *dso)
|
||||
{
|
||||
return 0x400000ULL + dso->ino * 8192ULL;
|
||||
}
|
||||
|
||||
static u32 synthesize_attr(struct bench_data *data)
|
||||
{
|
||||
union perf_event event;
|
||||
|
||||
memset(&event, 0, sizeof(event.attr) + sizeof(u64));
|
||||
|
||||
event.header.type = PERF_RECORD_HEADER_ATTR;
|
||||
event.header.size = sizeof(event.attr) + sizeof(u64);
|
||||
|
||||
event.attr.attr.type = PERF_TYPE_SOFTWARE;
|
||||
event.attr.attr.config = PERF_COUNT_SW_TASK_CLOCK;
|
||||
event.attr.attr.exclude_kernel = 1;
|
||||
event.attr.attr.sample_id_all = 1;
|
||||
event.attr.attr.sample_type = bench_sample_type;
|
||||
|
||||
return writen(data->input_pipe[1], &event, event.header.size);
|
||||
}
|
||||
|
||||
static u32 synthesize_fork(struct bench_data *data)
|
||||
{
|
||||
union perf_event event;
|
||||
|
||||
memset(&event, 0, sizeof(event.fork) + bench_id_hdr_size);
|
||||
|
||||
event.header.type = PERF_RECORD_FORK;
|
||||
event.header.misc = PERF_RECORD_MISC_FORK_EXEC;
|
||||
event.header.size = sizeof(event.fork) + bench_id_hdr_size;
|
||||
|
||||
event.fork.ppid = 1;
|
||||
event.fork.ptid = 1;
|
||||
event.fork.pid = data->pid;
|
||||
event.fork.tid = data->pid;
|
||||
|
||||
return writen(data->input_pipe[1], &event, event.header.size);
|
||||
}
|
||||
|
||||
static u32 synthesize_mmap(struct bench_data *data, struct bench_dso *dso,
|
||||
u64 timestamp)
|
||||
{
|
||||
union perf_event event;
|
||||
size_t len = offsetof(struct perf_record_mmap2, filename);
|
||||
u64 *id_hdr_ptr = (void *)&event;
|
||||
int ts_idx;
|
||||
|
||||
len += roundup(strlen(dso->name) + 1, 8) + bench_id_hdr_size;
|
||||
|
||||
memset(&event, 0, min(len, sizeof(event.mmap2)));
|
||||
|
||||
event.header.type = PERF_RECORD_MMAP2;
|
||||
event.header.misc = PERF_RECORD_MISC_USER;
|
||||
event.header.size = len;
|
||||
|
||||
event.mmap2.pid = data->pid;
|
||||
event.mmap2.tid = data->pid;
|
||||
event.mmap2.maj = MMAP_DEV_MAJOR;
|
||||
event.mmap2.ino = dso->ino;
|
||||
|
||||
strcpy(event.mmap2.filename, dso->name);
|
||||
|
||||
event.mmap2.start = dso_map_addr(dso);
|
||||
event.mmap2.len = 4096;
|
||||
event.mmap2.prot = PROT_EXEC;
|
||||
|
||||
if (len > sizeof(event.mmap2)) {
|
||||
/* write mmap2 event first */
|
||||
writen(data->input_pipe[1], &event, len - bench_id_hdr_size);
|
||||
/* zero-fill sample id header */
|
||||
memset(id_hdr_ptr, 0, bench_id_hdr_size);
|
||||
/* put timestamp in the right position */
|
||||
ts_idx = (bench_id_hdr_size / sizeof(u64)) - 2;
|
||||
id_hdr_ptr[ts_idx] = timestamp;
|
||||
writen(data->input_pipe[1], id_hdr_ptr, bench_id_hdr_size);
|
||||
} else {
|
||||
ts_idx = (len / sizeof(u64)) - 2;
|
||||
id_hdr_ptr[ts_idx] = timestamp;
|
||||
writen(data->input_pipe[1], &event, len);
|
||||
}
|
||||
return len;
|
||||
}
|
||||
|
||||
static u32 synthesize_sample(struct bench_data *data, struct bench_dso *dso,
|
||||
u64 timestamp)
|
||||
{
|
||||
union perf_event event;
|
||||
struct perf_sample sample = {
|
||||
.tid = data->pid,
|
||||
.pid = data->pid,
|
||||
.ip = dso_map_addr(dso),
|
||||
.time = timestamp,
|
||||
};
|
||||
|
||||
event.header.type = PERF_RECORD_SAMPLE;
|
||||
event.header.misc = PERF_RECORD_MISC_USER;
|
||||
event.header.size = perf_event__sample_event_size(&sample, bench_sample_type, 0);
|
||||
|
||||
perf_event__synthesize_sample(&event, bench_sample_type, 0, &sample);
|
||||
|
||||
return writen(data->input_pipe[1], &event, event.header.size);
|
||||
}
|
||||
|
||||
static u32 synthesize_flush(struct bench_data *data)
|
||||
{
|
||||
struct perf_event_header header = {
|
||||
.size = sizeof(header),
|
||||
.type = PERF_RECORD_FINISHED_ROUND,
|
||||
};
|
||||
|
||||
return writen(data->input_pipe[1], &header, header.size);
|
||||
}
|
||||
|
||||
static void *data_reader(void *arg)
|
||||
{
|
||||
struct bench_data *data = arg;
|
||||
char buf[8192];
|
||||
int flag;
|
||||
int n;
|
||||
|
||||
flag = fcntl(data->output_pipe[0], F_GETFL);
|
||||
fcntl(data->output_pipe[0], F_SETFL, flag | O_NONBLOCK);
|
||||
|
||||
/* read out data from child */
|
||||
while (true) {
|
||||
n = read(data->output_pipe[0], buf, sizeof(buf));
|
||||
if (n > 0)
|
||||
continue;
|
||||
if (n == 0)
|
||||
break;
|
||||
|
||||
if (errno != EINTR && errno != EAGAIN)
|
||||
break;
|
||||
|
||||
usleep(100);
|
||||
}
|
||||
|
||||
close(data->output_pipe[0]);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static int setup_injection(struct bench_data *data, bool build_id_all)
|
||||
{
|
||||
int ready_pipe[2];
|
||||
int dev_null_fd;
|
||||
char buf;
|
||||
|
||||
if (pipe(ready_pipe) < 0)
|
||||
return -1;
|
||||
|
||||
if (pipe(data->input_pipe) < 0)
|
||||
return -1;
|
||||
|
||||
if (pipe(data->output_pipe) < 0)
|
||||
return -1;
|
||||
|
||||
data->pid = fork();
|
||||
if (data->pid < 0)
|
||||
return -1;
|
||||
|
||||
if (data->pid == 0) {
|
||||
const char **inject_argv;
|
||||
int inject_argc = 2;
|
||||
|
||||
close(data->input_pipe[1]);
|
||||
close(data->output_pipe[0]);
|
||||
close(ready_pipe[0]);
|
||||
|
||||
dup2(data->input_pipe[0], STDIN_FILENO);
|
||||
close(data->input_pipe[0]);
|
||||
dup2(data->output_pipe[1], STDOUT_FILENO);
|
||||
close(data->output_pipe[1]);
|
||||
|
||||
dev_null_fd = open("/dev/null", O_WRONLY);
|
||||
if (dev_null_fd < 0)
|
||||
exit(1);
|
||||
|
||||
dup2(dev_null_fd, STDERR_FILENO);
|
||||
|
||||
if (build_id_all)
|
||||
inject_argc++;
|
||||
|
||||
inject_argv = calloc(inject_argc + 1, sizeof(*inject_argv));
|
||||
if (inject_argv == NULL)
|
||||
exit(1);
|
||||
|
||||
inject_argv[0] = strdup("inject");
|
||||
inject_argv[1] = strdup("-b");
|
||||
if (build_id_all)
|
||||
inject_argv[2] = strdup("--buildid-all");
|
||||
|
||||
/* signal that we're ready to go */
|
||||
close(ready_pipe[1]);
|
||||
|
||||
cmd_inject(inject_argc, inject_argv);
|
||||
|
||||
exit(0);
|
||||
}
|
||||
|
||||
pthread_create(&data->th, NULL, data_reader, data);
|
||||
|
||||
close(ready_pipe[1]);
|
||||
close(data->input_pipe[0]);
|
||||
close(data->output_pipe[1]);
|
||||
|
||||
/* wait for child ready */
|
||||
if (read(ready_pipe[0], &buf, 1) < 0)
|
||||
return -1;
|
||||
close(ready_pipe[0]);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int inject_build_id(struct bench_data *data, u64 *max_rss)
|
||||
{
|
||||
int status;
|
||||
unsigned int i, k;
|
||||
struct rusage rusage;
|
||||
u64 len = 0;
|
||||
|
||||
/* this makes the child to run */
|
||||
if (perf_header__write_pipe(data->input_pipe[1]) < 0)
|
||||
return -1;
|
||||
|
||||
len += synthesize_attr(data);
|
||||
len += synthesize_fork(data);
|
||||
|
||||
for (i = 0; i < nr_mmaps; i++) {
|
||||
int idx = rand() % (nr_dsos - 1);
|
||||
struct bench_dso *dso = &dsos[idx];
|
||||
u64 timestamp = rand() % 1000000;
|
||||
|
||||
pr_debug2(" [%d] injecting: %s\n", i+1, dso->name);
|
||||
len += synthesize_mmap(data, dso, timestamp);
|
||||
|
||||
for (k = 0; k < nr_samples; k++)
|
||||
len += synthesize_sample(data, dso, timestamp + k * 1000);
|
||||
|
||||
if ((i + 1) % 10 == 0)
|
||||
len += synthesize_flush(data);
|
||||
}
|
||||
|
||||
/* tihs makes the child to finish */
|
||||
close(data->input_pipe[1]);
|
||||
|
||||
wait4(data->pid, &status, 0, &rusage);
|
||||
*max_rss = rusage.ru_maxrss;
|
||||
|
||||
pr_debug(" Child %d exited with %d\n", data->pid, status);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void do_inject_loop(struct bench_data *data, bool build_id_all)
|
||||
{
|
||||
unsigned int i;
|
||||
struct stats time_stats, mem_stats;
|
||||
double time_average, time_stddev;
|
||||
double mem_average, mem_stddev;
|
||||
|
||||
init_stats(&time_stats);
|
||||
init_stats(&mem_stats);
|
||||
|
||||
pr_debug(" Build-id%s injection benchmark\n", build_id_all ? "-all" : "");
|
||||
|
||||
for (i = 0; i < iterations; i++) {
|
||||
struct timeval start, end, diff;
|
||||
u64 runtime_us, max_rss;
|
||||
|
||||
pr_debug(" Iteration #%d\n", i+1);
|
||||
|
||||
if (setup_injection(data, build_id_all) < 0) {
|
||||
printf(" Build-id injection setup failed\n");
|
||||
break;
|
||||
}
|
||||
|
||||
gettimeofday(&start, NULL);
|
||||
if (inject_build_id(data, &max_rss) < 0) {
|
||||
printf(" Build-id injection failed\n");
|
||||
break;
|
||||
}
|
||||
|
||||
gettimeofday(&end, NULL);
|
||||
timersub(&end, &start, &diff);
|
||||
runtime_us = diff.tv_sec * USEC_PER_SEC + diff.tv_usec;
|
||||
update_stats(&time_stats, runtime_us);
|
||||
update_stats(&mem_stats, max_rss);
|
||||
|
||||
pthread_join(data->th, NULL);
|
||||
}
|
||||
|
||||
time_average = avg_stats(&time_stats) / USEC_PER_MSEC;
|
||||
time_stddev = stddev_stats(&time_stats) / USEC_PER_MSEC;
|
||||
printf(" Average build-id%s injection took: %.3f msec (+- %.3f msec)\n",
|
||||
build_id_all ? "-all" : "", time_average, time_stddev);
|
||||
|
||||
/* each iteration, it processes MMAP2 + BUILD_ID + nr_samples * SAMPLE */
|
||||
time_average = avg_stats(&time_stats) / (nr_mmaps * (nr_samples + 2));
|
||||
time_stddev = stddev_stats(&time_stats) / (nr_mmaps * (nr_samples + 2));
|
||||
printf(" Average time per event: %.3f usec (+- %.3f usec)\n",
|
||||
time_average, time_stddev);
|
||||
|
||||
mem_average = avg_stats(&mem_stats);
|
||||
mem_stddev = stddev_stats(&mem_stats);
|
||||
printf(" Average memory usage: %.0f KB (+- %.0f KB)\n",
|
||||
mem_average, mem_stddev);
|
||||
}
|
||||
|
||||
static int do_inject_loops(struct bench_data *data)
|
||||
{
|
||||
|
||||
srand(time(NULL));
|
||||
symbol__init(NULL);
|
||||
|
||||
bench_sample_type = PERF_SAMPLE_IDENTIFIER | PERF_SAMPLE_IP;
|
||||
bench_sample_type |= PERF_SAMPLE_TID | PERF_SAMPLE_TIME;
|
||||
bench_id_hdr_size = 32;
|
||||
|
||||
collect_dso();
|
||||
if (nr_dsos == 0) {
|
||||
printf(" Cannot collect DSOs for injection\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
do_inject_loop(data, false);
|
||||
do_inject_loop(data, true);
|
||||
|
||||
release_dso();
|
||||
return 0;
|
||||
}
|
||||
|
||||
int bench_inject_build_id(int argc, const char **argv)
|
||||
{
|
||||
struct bench_data data;
|
||||
|
||||
argc = parse_options(argc, argv, options, bench_usage, 0);
|
||||
if (argc) {
|
||||
usage_with_options(bench_usage, options);
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
|
||||
return do_inject_loops(&data);
|
||||
}
|
||||
|
|
@ -137,12 +137,13 @@ struct global_info {
|
|||
u8 *data;
|
||||
|
||||
pthread_mutex_t startup_mutex;
|
||||
pthread_cond_t startup_cond;
|
||||
int nr_tasks_started;
|
||||
|
||||
pthread_mutex_t startup_done_mutex;
|
||||
|
||||
pthread_mutex_t start_work_mutex;
|
||||
pthread_cond_t start_work_cond;
|
||||
int nr_tasks_working;
|
||||
bool start_work;
|
||||
|
||||
pthread_mutex_t stop_work_mutex;
|
||||
u64 bytes_done;
|
||||
|
@ -483,6 +484,18 @@ static void init_global_mutex(pthread_mutex_t *mutex)
|
|||
pthread_mutex_init(mutex, &attr);
|
||||
}
|
||||
|
||||
/*
|
||||
* Return a process-shared (global) condition variable:
|
||||
*/
|
||||
static void init_global_cond(pthread_cond_t *cond)
|
||||
{
|
||||
pthread_condattr_t attr;
|
||||
|
||||
pthread_condattr_init(&attr);
|
||||
pthread_condattr_setpshared(&attr, PTHREAD_PROCESS_SHARED);
|
||||
pthread_cond_init(cond, &attr);
|
||||
}
|
||||
|
||||
static int parse_cpu_list(const char *arg)
|
||||
{
|
||||
p0.cpu_list_str = strdup(arg);
|
||||
|
@ -1136,15 +1149,18 @@ static void *worker_thread(void *__tdata)
|
|||
if (g->p.serialize_startup) {
|
||||
pthread_mutex_lock(&g->startup_mutex);
|
||||
g->nr_tasks_started++;
|
||||
/* The last thread wakes the main process. */
|
||||
if (g->nr_tasks_started == g->p.nr_tasks)
|
||||
pthread_cond_signal(&g->startup_cond);
|
||||
|
||||
pthread_mutex_unlock(&g->startup_mutex);
|
||||
|
||||
/* Here we will wait for the main process to start us all at once: */
|
||||
pthread_mutex_lock(&g->start_work_mutex);
|
||||
g->start_work = false;
|
||||
g->nr_tasks_working++;
|
||||
|
||||
/* Last one wake the main process: */
|
||||
if (g->nr_tasks_working == g->p.nr_tasks)
|
||||
pthread_mutex_unlock(&g->startup_done_mutex);
|
||||
while (!g->start_work)
|
||||
pthread_cond_wait(&g->start_work_cond, &g->start_work_mutex);
|
||||
|
||||
pthread_mutex_unlock(&g->start_work_mutex);
|
||||
}
|
||||
|
@ -1441,8 +1457,9 @@ static int init(void)
|
|||
|
||||
/* Startup serialization: */
|
||||
init_global_mutex(&g->start_work_mutex);
|
||||
init_global_cond(&g->start_work_cond);
|
||||
init_global_mutex(&g->startup_mutex);
|
||||
init_global_mutex(&g->startup_done_mutex);
|
||||
init_global_cond(&g->startup_cond);
|
||||
init_global_mutex(&g->stop_work_mutex);
|
||||
|
||||
init_thread_data();
|
||||
|
@ -1502,9 +1519,6 @@ static int __bench_numa(const char *name)
|
|||
pids = zalloc(g->p.nr_proc * sizeof(*pids));
|
||||
pid = -1;
|
||||
|
||||
/* All threads try to acquire it, this way we can wait for them to start up: */
|
||||
pthread_mutex_lock(&g->start_work_mutex);
|
||||
|
||||
if (g->p.serialize_startup) {
|
||||
tprintf(" #\n");
|
||||
tprintf(" # Startup synchronization: ..."); fflush(stdout);
|
||||
|
@ -1526,22 +1540,29 @@ static int __bench_numa(const char *name)
|
|||
pids[i] = pid;
|
||||
|
||||
}
|
||||
/* Wait for all the threads to start up: */
|
||||
while (g->nr_tasks_started != g->p.nr_tasks)
|
||||
usleep(USEC_PER_MSEC);
|
||||
|
||||
BUG_ON(g->nr_tasks_started != g->p.nr_tasks);
|
||||
|
||||
if (g->p.serialize_startup) {
|
||||
bool threads_ready = false;
|
||||
double startup_sec;
|
||||
|
||||
pthread_mutex_lock(&g->startup_done_mutex);
|
||||
/*
|
||||
* Wait for all the threads to start up. The last thread will
|
||||
* signal this process.
|
||||
*/
|
||||
pthread_mutex_lock(&g->startup_mutex);
|
||||
while (g->nr_tasks_started != g->p.nr_tasks)
|
||||
pthread_cond_wait(&g->startup_cond, &g->startup_mutex);
|
||||
|
||||
/* This will start all threads: */
|
||||
pthread_mutex_unlock(&g->startup_mutex);
|
||||
|
||||
/* Wait for all threads to be at the start_work_cond. */
|
||||
while (!threads_ready) {
|
||||
pthread_mutex_lock(&g->start_work_mutex);
|
||||
threads_ready = (g->nr_tasks_working == g->p.nr_tasks);
|
||||
pthread_mutex_unlock(&g->start_work_mutex);
|
||||
|
||||
/* This mutex is locked - the last started thread will wake us: */
|
||||
pthread_mutex_lock(&g->startup_done_mutex);
|
||||
if (!threads_ready)
|
||||
usleep(1);
|
||||
}
|
||||
|
||||
gettimeofday(&stop, NULL);
|
||||
|
||||
|
@ -1555,7 +1576,11 @@ static int __bench_numa(const char *name)
|
|||
tprintf(" #\n");
|
||||
|
||||
start = stop;
|
||||
pthread_mutex_unlock(&g->startup_done_mutex);
|
||||
/* Start all threads running. */
|
||||
pthread_mutex_lock(&g->start_work_mutex);
|
||||
g->start_work = true;
|
||||
pthread_mutex_unlock(&g->start_work_mutex);
|
||||
pthread_cond_broadcast(&g->start_work_cond);
|
||||
} else {
|
||||
gettimeofday(&start, NULL);
|
||||
}
|
||||
|
|
|
@ -87,6 +87,7 @@ static struct bench epoll_benchmarks[] = {
|
|||
static struct bench internals_benchmarks[] = {
|
||||
{ "synthesize", "Benchmark perf event synthesis", bench_synthesize },
|
||||
{ "kallsyms-parse", "Benchmark kallsyms parsing", bench_kallsyms_parse },
|
||||
{ "inject-build-id", "Benchmark build-id injection", bench_inject_build_id },
|
||||
{ NULL, NULL, NULL }
|
||||
};
|
||||
|
||||
|
|
|
@ -174,19 +174,19 @@ static int build_id_cache__add_kcore(const char *filename, bool force)
|
|||
static int build_id_cache__add_file(const char *filename, struct nsinfo *nsi)
|
||||
{
|
||||
char sbuild_id[SBUILD_ID_SIZE];
|
||||
u8 build_id[BUILD_ID_SIZE];
|
||||
struct build_id bid;
|
||||
int err;
|
||||
struct nscookie nsc;
|
||||
|
||||
nsinfo__mountns_enter(nsi, &nsc);
|
||||
err = filename__read_build_id(filename, &build_id, sizeof(build_id));
|
||||
err = filename__read_build_id(filename, &bid);
|
||||
nsinfo__mountns_exit(&nsc);
|
||||
if (err < 0) {
|
||||
pr_debug("Couldn't read a build-id in %s\n", filename);
|
||||
return -1;
|
||||
}
|
||||
|
||||
build_id__sprintf(build_id, sizeof(build_id), sbuild_id);
|
||||
build_id__sprintf(&bid, sbuild_id);
|
||||
err = build_id_cache__add_s(sbuild_id, filename, nsi,
|
||||
false, false);
|
||||
pr_debug("Adding %s %s: %s\n", sbuild_id, filename,
|
||||
|
@ -196,21 +196,21 @@ static int build_id_cache__add_file(const char *filename, struct nsinfo *nsi)
|
|||
|
||||
static int build_id_cache__remove_file(const char *filename, struct nsinfo *nsi)
|
||||
{
|
||||
u8 build_id[BUILD_ID_SIZE];
|
||||
char sbuild_id[SBUILD_ID_SIZE];
|
||||
struct build_id bid;
|
||||
struct nscookie nsc;
|
||||
|
||||
int err;
|
||||
|
||||
nsinfo__mountns_enter(nsi, &nsc);
|
||||
err = filename__read_build_id(filename, &build_id, sizeof(build_id));
|
||||
err = filename__read_build_id(filename, &bid);
|
||||
nsinfo__mountns_exit(&nsc);
|
||||
if (err < 0) {
|
||||
pr_debug("Couldn't read a build-id in %s\n", filename);
|
||||
return -1;
|
||||
}
|
||||
|
||||
build_id__sprintf(build_id, sizeof(build_id), sbuild_id);
|
||||
build_id__sprintf(&bid, sbuild_id);
|
||||
err = build_id_cache__remove_s(sbuild_id);
|
||||
pr_debug("Removing %s %s: %s\n", sbuild_id, filename,
|
||||
err ? "FAIL" : "Ok");
|
||||
|
@ -274,17 +274,16 @@ static int build_id_cache__purge_all(void)
|
|||
static bool dso__missing_buildid_cache(struct dso *dso, int parm __maybe_unused)
|
||||
{
|
||||
char filename[PATH_MAX];
|
||||
u8 build_id[BUILD_ID_SIZE];
|
||||
struct build_id bid;
|
||||
|
||||
if (dso__build_id_filename(dso, filename, sizeof(filename), false) &&
|
||||
filename__read_build_id(filename, build_id,
|
||||
sizeof(build_id)) != sizeof(build_id)) {
|
||||
filename__read_build_id(filename, &bid) == -1) {
|
||||
if (errno == ENOENT)
|
||||
return false;
|
||||
|
||||
pr_warning("Problems with %s file, consider removing it from the cache\n",
|
||||
filename);
|
||||
} else if (memcmp(dso->build_id, build_id, sizeof(dso->build_id))) {
|
||||
} else if (memcmp(dso->bid.data, bid.data, bid.size)) {
|
||||
pr_warning("Problems with %s file, consider removing it from the cache\n",
|
||||
filename);
|
||||
}
|
||||
|
@ -300,14 +299,14 @@ static int build_id_cache__fprintf_missing(struct perf_session *session, FILE *f
|
|||
|
||||
static int build_id_cache__update_file(const char *filename, struct nsinfo *nsi)
|
||||
{
|
||||
u8 build_id[BUILD_ID_SIZE];
|
||||
char sbuild_id[SBUILD_ID_SIZE];
|
||||
struct build_id bid;
|
||||
struct nscookie nsc;
|
||||
|
||||
int err;
|
||||
|
||||
nsinfo__mountns_enter(nsi, &nsc);
|
||||
err = filename__read_build_id(filename, &build_id, sizeof(build_id));
|
||||
err = filename__read_build_id(filename, &bid);
|
||||
nsinfo__mountns_exit(&nsc);
|
||||
if (err < 0) {
|
||||
pr_debug("Couldn't read a build-id in %s\n", filename);
|
||||
|
@ -315,7 +314,7 @@ static int build_id_cache__update_file(const char *filename, struct nsinfo *nsi)
|
|||
}
|
||||
err = 0;
|
||||
|
||||
build_id__sprintf(build_id, sizeof(build_id), sbuild_id);
|
||||
build_id__sprintf(&bid, sbuild_id);
|
||||
if (build_id_cache__cached(sbuild_id))
|
||||
err = build_id_cache__remove_s(sbuild_id);
|
||||
|
||||
|
|
|
@ -652,45 +652,6 @@ STAT_FN(ld_l2hit)
|
|||
STAT_FN(ld_llchit)
|
||||
STAT_FN(rmt_hit)
|
||||
|
||||
static uint64_t llc_miss(struct c2c_stats *stats)
|
||||
{
|
||||
uint64_t llcmiss;
|
||||
|
||||
llcmiss = stats->lcl_dram +
|
||||
stats->rmt_dram +
|
||||
stats->rmt_hitm +
|
||||
stats->rmt_hit;
|
||||
|
||||
return llcmiss;
|
||||
}
|
||||
|
||||
static int
|
||||
ld_llcmiss_entry(struct perf_hpp_fmt *fmt, struct perf_hpp *hpp,
|
||||
struct hist_entry *he)
|
||||
{
|
||||
struct c2c_hist_entry *c2c_he;
|
||||
int width = c2c_width(fmt, hpp, he->hists);
|
||||
|
||||
c2c_he = container_of(he, struct c2c_hist_entry, he);
|
||||
|
||||
return scnprintf(hpp->buf, hpp->size, "%*lu", width,
|
||||
llc_miss(&c2c_he->stats));
|
||||
}
|
||||
|
||||
static int64_t
|
||||
ld_llcmiss_cmp(struct perf_hpp_fmt *fmt __maybe_unused,
|
||||
struct hist_entry *left, struct hist_entry *right)
|
||||
{
|
||||
struct c2c_hist_entry *c2c_left;
|
||||
struct c2c_hist_entry *c2c_right;
|
||||
|
||||
c2c_left = container_of(left, struct c2c_hist_entry, he);
|
||||
c2c_right = container_of(right, struct c2c_hist_entry, he);
|
||||
|
||||
return (uint64_t) llc_miss(&c2c_left->stats) -
|
||||
(uint64_t) llc_miss(&c2c_right->stats);
|
||||
}
|
||||
|
||||
static uint64_t total_records(struct c2c_stats *stats)
|
||||
{
|
||||
uint64_t lclmiss, ldcnt, total;
|
||||
|
@ -1328,7 +1289,7 @@ static struct c2c_dimension dim_iaddr = {
|
|||
};
|
||||
|
||||
static struct c2c_dimension dim_tot_hitm = {
|
||||
.header = HEADER_SPAN("----- LLC Load Hitm -----", "Total", 2),
|
||||
.header = HEADER_SPAN("------- Load Hitm -------", "Total", 2),
|
||||
.name = "tot_hitm",
|
||||
.cmp = tot_hitm_cmp,
|
||||
.entry = tot_hitm_entry,
|
||||
|
@ -1336,7 +1297,7 @@ static struct c2c_dimension dim_tot_hitm = {
|
|||
};
|
||||
|
||||
static struct c2c_dimension dim_lcl_hitm = {
|
||||
.header = HEADER_SPAN_LOW("Lcl"),
|
||||
.header = HEADER_SPAN_LOW("LclHitm"),
|
||||
.name = "lcl_hitm",
|
||||
.cmp = lcl_hitm_cmp,
|
||||
.entry = lcl_hitm_entry,
|
||||
|
@ -1344,7 +1305,7 @@ static struct c2c_dimension dim_lcl_hitm = {
|
|||
};
|
||||
|
||||
static struct c2c_dimension dim_rmt_hitm = {
|
||||
.header = HEADER_SPAN_LOW("Rmt"),
|
||||
.header = HEADER_SPAN_LOW("RmtHitm"),
|
||||
.name = "rmt_hitm",
|
||||
.cmp = rmt_hitm_cmp,
|
||||
.entry = rmt_hitm_entry,
|
||||
|
@ -1367,16 +1328,16 @@ static struct c2c_dimension dim_cl_lcl_hitm = {
|
|||
.width = 7,
|
||||
};
|
||||
|
||||
static struct c2c_dimension dim_stores = {
|
||||
.header = HEADER_SPAN("---- Store Reference ----", "Total", 2),
|
||||
.name = "stores",
|
||||
static struct c2c_dimension dim_tot_stores = {
|
||||
.header = HEADER_BOTH("Total", "Stores"),
|
||||
.name = "tot_stores",
|
||||
.cmp = store_cmp,
|
||||
.entry = store_entry,
|
||||
.width = 7,
|
||||
};
|
||||
|
||||
static struct c2c_dimension dim_stores_l1hit = {
|
||||
.header = HEADER_SPAN_LOW("L1Hit"),
|
||||
.header = HEADER_SPAN("---- Stores ----", "L1Hit", 1),
|
||||
.name = "stores_l1hit",
|
||||
.cmp = st_l1hit_cmp,
|
||||
.entry = st_l1hit_entry,
|
||||
|
@ -1432,7 +1393,7 @@ static struct c2c_dimension dim_ld_l2hit = {
|
|||
};
|
||||
|
||||
static struct c2c_dimension dim_ld_llchit = {
|
||||
.header = HEADER_SPAN("-- LLC Load Hit --", "Llc", 1),
|
||||
.header = HEADER_SPAN("- LLC Load Hit --", "LclHit", 1),
|
||||
.name = "ld_lclhit",
|
||||
.cmp = ld_llchit_cmp,
|
||||
.entry = ld_llchit_entry,
|
||||
|
@ -1440,21 +1401,13 @@ static struct c2c_dimension dim_ld_llchit = {
|
|||
};
|
||||
|
||||
static struct c2c_dimension dim_ld_rmthit = {
|
||||
.header = HEADER_SPAN_LOW("Rmt"),
|
||||
.header = HEADER_SPAN("- RMT Load Hit --", "RmtHit", 1),
|
||||
.name = "ld_rmthit",
|
||||
.cmp = rmt_hit_cmp,
|
||||
.entry = rmt_hit_entry,
|
||||
.width = 8,
|
||||
};
|
||||
|
||||
static struct c2c_dimension dim_ld_llcmiss = {
|
||||
.header = HEADER_BOTH("LLC", "Ld Miss"),
|
||||
.name = "ld_llcmiss",
|
||||
.cmp = ld_llcmiss_cmp,
|
||||
.entry = ld_llcmiss_entry,
|
||||
.width = 7,
|
||||
};
|
||||
|
||||
static struct c2c_dimension dim_tot_recs = {
|
||||
.header = HEADER_BOTH("Total", "records"),
|
||||
.name = "tot_recs",
|
||||
|
@ -1486,7 +1439,7 @@ static struct c2c_dimension dim_percent_hitm = {
|
|||
};
|
||||
|
||||
static struct c2c_dimension dim_percent_rmt_hitm = {
|
||||
.header = HEADER_SPAN("----- HITM -----", "Rmt", 1),
|
||||
.header = HEADER_SPAN("----- HITM -----", "RmtHitm", 1),
|
||||
.name = "percent_rmt_hitm",
|
||||
.cmp = percent_rmt_hitm_cmp,
|
||||
.entry = percent_rmt_hitm_entry,
|
||||
|
@ -1495,7 +1448,7 @@ static struct c2c_dimension dim_percent_rmt_hitm = {
|
|||
};
|
||||
|
||||
static struct c2c_dimension dim_percent_lcl_hitm = {
|
||||
.header = HEADER_SPAN_LOW("Lcl"),
|
||||
.header = HEADER_SPAN_LOW("LclHitm"),
|
||||
.name = "percent_lcl_hitm",
|
||||
.cmp = percent_lcl_hitm_cmp,
|
||||
.entry = percent_lcl_hitm_entry,
|
||||
|
@ -1648,7 +1601,7 @@ static struct c2c_dimension *dimensions[] = {
|
|||
&dim_rmt_hitm,
|
||||
&dim_cl_lcl_hitm,
|
||||
&dim_cl_rmt_hitm,
|
||||
&dim_stores,
|
||||
&dim_tot_stores,
|
||||
&dim_stores_l1hit,
|
||||
&dim_stores_l1miss,
|
||||
&dim_cl_stores_l1hit,
|
||||
|
@ -1658,7 +1611,6 @@ static struct c2c_dimension *dimensions[] = {
|
|||
&dim_ld_l2hit,
|
||||
&dim_ld_llchit,
|
||||
&dim_ld_rmthit,
|
||||
&dim_ld_llcmiss,
|
||||
&dim_tot_recs,
|
||||
&dim_tot_loads,
|
||||
&dim_percent_hitm,
|
||||
|
@ -2846,15 +2798,16 @@ static int perf_c2c__report(int argc, const char **argv)
|
|||
"dcacheline,"
|
||||
"dcacheline_node,"
|
||||
"dcacheline_count,"
|
||||
"tot_recs,"
|
||||
"percent_hitm,"
|
||||
"tot_hitm,lcl_hitm,rmt_hitm,"
|
||||
"stores,stores_l1hit,stores_l1miss,"
|
||||
"dram_lcl,dram_rmt,"
|
||||
"ld_llcmiss,"
|
||||
"tot_recs,"
|
||||
"tot_loads,"
|
||||
"tot_stores,"
|
||||
"stores_l1hit,stores_l1miss,"
|
||||
"ld_fbhit,ld_l1hit,ld_l2hit,"
|
||||
"ld_lclhit,ld_rmthit",
|
||||
"ld_lclhit,lcl_hitm,"
|
||||
"ld_rmthit,rmt_hitm,"
|
||||
"dram_lcl,dram_rmt",
|
||||
c2c.display == DISPLAY_TOT ? "tot_hitm" :
|
||||
c2c.display == DISPLAY_LCL ? "lcl_hitm" : "rmt_hitm"
|
||||
);
|
||||
|
@ -2916,7 +2869,7 @@ static int perf_c2c__record(int argc, const char **argv)
|
|||
bool event_set = false;
|
||||
struct option options[] = {
|
||||
OPT_CALLBACK('e', "event", &event_set, "event",
|
||||
"event selector. Use 'perf mem record -e list' to list available events",
|
||||
"event selector. Use 'perf c2c record -e list' to list available events",
|
||||
parse_record_events),
|
||||
OPT_BOOLEAN('u', "all-user", &all_user, "collect only user level data"),
|
||||
OPT_BOOLEAN('k', "all-kernel", &all_kernel, "collect only kernel level data"),
|
||||
|
|
|
@ -25,6 +25,7 @@
|
|||
#include "util/map.h"
|
||||
#include "util/spark.h"
|
||||
#include "util/block-info.h"
|
||||
#include "util/stream.h"
|
||||
#include <linux/err.h>
|
||||
#include <linux/zalloc.h>
|
||||
#include <subcmd/pager.h>
|
||||
|
@ -42,6 +43,7 @@ struct perf_diff {
|
|||
int range_size;
|
||||
int range_num;
|
||||
bool has_br_stack;
|
||||
bool stream;
|
||||
};
|
||||
|
||||
/* Diff command specific HPP columns. */
|
||||
|
@ -72,6 +74,7 @@ struct data__file {
|
|||
struct perf_data data;
|
||||
int idx;
|
||||
struct hists *hists;
|
||||
struct evlist_streams *evlist_streams;
|
||||
struct diff_hpp_fmt fmt[PERF_HPP_DIFF__MAX_INDEX];
|
||||
};
|
||||
|
||||
|
@ -106,6 +109,7 @@ enum {
|
|||
COMPUTE_DELTA_ABS,
|
||||
COMPUTE_CYCLES,
|
||||
COMPUTE_MAX,
|
||||
COMPUTE_STREAM, /* After COMPUTE_MAX to avoid use current compute arrays */
|
||||
};
|
||||
|
||||
const char *compute_names[COMPUTE_MAX] = {
|
||||
|
@ -393,6 +397,11 @@ static int diff__process_sample_event(struct perf_tool *tool,
|
|||
struct perf_diff *pdiff = container_of(tool, struct perf_diff, tool);
|
||||
struct addr_location al;
|
||||
struct hists *hists = evsel__hists(evsel);
|
||||
struct hist_entry_iter iter = {
|
||||
.evsel = evsel,
|
||||
.sample = sample,
|
||||
.ops = &hist_iter_normal,
|
||||
};
|
||||
int ret = -1;
|
||||
|
||||
if (perf_time__ranges_skip_sample(pdiff->ptime_range, pdiff->range_num,
|
||||
|
@ -411,14 +420,8 @@ static int diff__process_sample_event(struct perf_tool *tool,
|
|||
goto out_put;
|
||||
}
|
||||
|
||||
if (compute != COMPUTE_CYCLES) {
|
||||
if (!hists__add_entry(hists, &al, NULL, NULL, NULL, sample,
|
||||
true)) {
|
||||
pr_warning("problem incrementing symbol period, "
|
||||
"skipping event\n");
|
||||
goto out_put;
|
||||
}
|
||||
} else {
|
||||
switch (compute) {
|
||||
case COMPUTE_CYCLES:
|
||||
if (!hists__add_entry_ops(hists, &block_hist_ops, &al, NULL,
|
||||
NULL, NULL, sample, true)) {
|
||||
pr_warning("problem incrementing symbol period, "
|
||||
|
@ -428,6 +431,23 @@ static int diff__process_sample_event(struct perf_tool *tool,
|
|||
|
||||
hist__account_cycles(sample->branch_stack, &al, sample, false,
|
||||
NULL);
|
||||
break;
|
||||
|
||||
case COMPUTE_STREAM:
|
||||
if (hist_entry_iter__add(&iter, &al, PERF_MAX_STACK_DEPTH,
|
||||
NULL)) {
|
||||
pr_debug("problem adding hist entry, skipping event\n");
|
||||
goto out_put;
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
if (!hists__add_entry(hists, &al, NULL, NULL, NULL, sample,
|
||||
true)) {
|
||||
pr_warning("problem incrementing symbol period, "
|
||||
"skipping event\n");
|
||||
goto out_put;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -996,10 +1016,55 @@ static void data_process(void)
|
|||
}
|
||||
}
|
||||
|
||||
static int process_base_stream(struct data__file *data_base,
|
||||
struct data__file *data_pair,
|
||||
const char *title __maybe_unused)
|
||||
{
|
||||
struct evlist *evlist_base = data_base->session->evlist;
|
||||
struct evlist *evlist_pair = data_pair->session->evlist;
|
||||
struct evsel *evsel_base, *evsel_pair;
|
||||
struct evsel_streams *es_base, *es_pair;
|
||||
|
||||
evlist__for_each_entry(evlist_base, evsel_base) {
|
||||
evsel_pair = evsel_match(evsel_base, evlist_pair);
|
||||
if (!evsel_pair)
|
||||
continue;
|
||||
|
||||
es_base = evsel_streams__entry(data_base->evlist_streams,
|
||||
evsel_base->idx);
|
||||
if (!es_base)
|
||||
return -1;
|
||||
|
||||
es_pair = evsel_streams__entry(data_pair->evlist_streams,
|
||||
evsel_pair->idx);
|
||||
if (!es_pair)
|
||||
return -1;
|
||||
|
||||
evsel_streams__match(es_base, es_pair);
|
||||
evsel_streams__report(es_base, es_pair);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void stream_process(void)
|
||||
{
|
||||
/*
|
||||
* Stream comparison only supports two data files.
|
||||
* perf.data.old and perf.data. data__files[0] is perf.data.old,
|
||||
* data__files[1] is perf.data.
|
||||
*/
|
||||
process_base_stream(&data__files[0], &data__files[1],
|
||||
"# Output based on old perf data:\n#\n");
|
||||
}
|
||||
|
||||
static void data__free(struct data__file *d)
|
||||
{
|
||||
int col;
|
||||
|
||||
if (d->evlist_streams)
|
||||
evlist_streams__delete(d->evlist_streams);
|
||||
|
||||
for (col = 0; col < PERF_HPP_DIFF__MAX_INDEX; col++) {
|
||||
struct diff_hpp_fmt *fmt = &d->fmt[col];
|
||||
|
||||
|
@ -1153,8 +1218,18 @@ static int __cmd_diff(void)
|
|||
|
||||
if (pdiff.ptime_range)
|
||||
zfree(&pdiff.ptime_range);
|
||||
|
||||
if (compute == COMPUTE_STREAM) {
|
||||
d->evlist_streams = evlist__create_streams(
|
||||
d->session->evlist, 5);
|
||||
if (!d->evlist_streams)
|
||||
goto out_delete;
|
||||
}
|
||||
}
|
||||
|
||||
if (compute == COMPUTE_STREAM)
|
||||
stream_process();
|
||||
else
|
||||
data_process();
|
||||
|
||||
out_delete:
|
||||
|
@ -1228,6 +1303,8 @@ static const struct option options[] = {
|
|||
"only consider symbols in these pids"),
|
||||
OPT_STRING(0, "tid", &symbol_conf.tid_list_str, "tid[,tid...]",
|
||||
"only consider symbols in these tids"),
|
||||
OPT_BOOLEAN(0, "stream", &pdiff.stream,
|
||||
"Enable hot streams comparison."),
|
||||
OPT_END()
|
||||
};
|
||||
|
||||
|
@ -1887,6 +1964,9 @@ int cmd_diff(int argc, const char **argv)
|
|||
if (cycles_hist && (compute != COMPUTE_CYCLES))
|
||||
usage_with_options(diff_usage, options);
|
||||
|
||||
if (pdiff.stream)
|
||||
compute = COMPUTE_STREAM;
|
||||
|
||||
symbol__annotation_init();
|
||||
|
||||
if (symbol__init(NULL) < 0)
|
||||
|
@ -1898,13 +1978,26 @@ int cmd_diff(int argc, const char **argv)
|
|||
if (check_file_brstack() < 0)
|
||||
return -1;
|
||||
|
||||
if (compute == COMPUTE_CYCLES && !pdiff.has_br_stack)
|
||||
if ((compute == COMPUTE_CYCLES || compute == COMPUTE_STREAM)
|
||||
&& !pdiff.has_br_stack) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (compute == COMPUTE_STREAM) {
|
||||
symbol_conf.show_branchflag_count = true;
|
||||
symbol_conf.disable_add2line_warn = true;
|
||||
callchain_param.mode = CHAIN_FLAT;
|
||||
callchain_param.key = CCKEY_SRCLINE;
|
||||
callchain_param.branch_callstack = 1;
|
||||
symbol_conf.use_callchain = true;
|
||||
callchain_register_param(&callchain_param);
|
||||
sort_order = "srcline,symbol,dso";
|
||||
} else {
|
||||
if (ui_init() < 0)
|
||||
return -1;
|
||||
|
||||
sort__mode = SORT_MODE__DIFF;
|
||||
}
|
||||
|
||||
if (setup_sorting(NULL) < 0)
|
||||
usage_with_options(diff_usage, options);
|
||||
|
|
|
@ -25,6 +25,7 @@
|
|||
#include "target.h"
|
||||
#include "cpumap.h"
|
||||
#include "thread_map.h"
|
||||
#include "strfilter.h"
|
||||
#include "util/cap.h"
|
||||
#include "util/config.h"
|
||||
#include "util/units.h"
|
||||
|
@ -36,7 +37,6 @@ struct perf_ftrace {
|
|||
struct evlist *evlist;
|
||||
struct target target;
|
||||
const char *tracer;
|
||||
bool list_avail_functions;
|
||||
struct list_head filters;
|
||||
struct list_head notrace;
|
||||
struct list_head graph_funcs;
|
||||
|
@ -181,6 +181,40 @@ out:
|
|||
return ret;
|
||||
}
|
||||
|
||||
static int read_tracing_file_by_line(const char *name,
|
||||
void (*cb)(char *str, void *arg),
|
||||
void *cb_arg)
|
||||
{
|
||||
char *line = NULL;
|
||||
size_t len = 0;
|
||||
char *file;
|
||||
FILE *fp;
|
||||
|
||||
file = get_tracing_file(name);
|
||||
if (!file) {
|
||||
pr_debug("cannot get tracing file: %s\n", name);
|
||||
return -1;
|
||||
}
|
||||
|
||||
fp = fopen(file, "r");
|
||||
if (fp == NULL) {
|
||||
pr_debug("cannot open tracing file: %s\n", name);
|
||||
put_tracing_file(file);
|
||||
return -1;
|
||||
}
|
||||
|
||||
while (getline(&line, &len, fp) != -1) {
|
||||
cb(line, cb_arg);
|
||||
}
|
||||
|
||||
if (line)
|
||||
free(line);
|
||||
|
||||
fclose(fp);
|
||||
put_tracing_file(file);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int write_tracing_file_int(const char *name, int value)
|
||||
{
|
||||
char buf[16];
|
||||
|
@ -557,9 +591,6 @@ static int __cmd_ftrace(struct perf_ftrace *ftrace, int argc, const char **argv)
|
|||
signal(SIGCHLD, sig_handler);
|
||||
signal(SIGPIPE, sig_handler);
|
||||
|
||||
if (ftrace->list_avail_functions)
|
||||
return read_tracing_file_to_stdout("available_filter_functions");
|
||||
|
||||
if (reset_tracing_files(ftrace) < 0) {
|
||||
pr_err("failed to reset ftrace\n");
|
||||
goto out;
|
||||
|
@ -683,6 +714,46 @@ static int perf_ftrace_config(const char *var, const char *value, void *cb)
|
|||
return -1;
|
||||
}
|
||||
|
||||
static void list_function_cb(char *str, void *arg)
|
||||
{
|
||||
struct strfilter *filter = (struct strfilter *)arg;
|
||||
|
||||
if (strfilter__compare(filter, str))
|
||||
printf("%s", str);
|
||||
}
|
||||
|
||||
static int opt_list_avail_functions(const struct option *opt __maybe_unused,
|
||||
const char *str, int unset)
|
||||
{
|
||||
struct strfilter *filter;
|
||||
const char *err = NULL;
|
||||
int ret;
|
||||
|
||||
if (unset || !str)
|
||||
return -1;
|
||||
|
||||
filter = strfilter__new(str, &err);
|
||||
if (!filter)
|
||||
return err ? -EINVAL : -ENOMEM;
|
||||
|
||||
ret = strfilter__or(filter, str, &err);
|
||||
if (ret == -EINVAL) {
|
||||
pr_err("Filter parse error at %td.\n", err - str + 1);
|
||||
pr_err("Source: \"%s\"\n", str);
|
||||
pr_err(" %*c\n", (int)(err - str + 1), '^');
|
||||
strfilter__delete(filter);
|
||||
return ret;
|
||||
}
|
||||
|
||||
ret = read_tracing_file_by_line("available_filter_functions",
|
||||
list_function_cb, filter);
|
||||
strfilter__delete(filter);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
exit(0);
|
||||
}
|
||||
|
||||
static int parse_filter_func(const struct option *opt, const char *str,
|
||||
int unset __maybe_unused)
|
||||
{
|
||||
|
@ -817,8 +888,9 @@ int cmd_ftrace(int argc, const char **argv)
|
|||
const struct option ftrace_options[] = {
|
||||
OPT_STRING('t', "tracer", &ftrace.tracer, "tracer",
|
||||
"Tracer to use: function_graph(default) or function"),
|
||||
OPT_BOOLEAN('F', "funcs", &ftrace.list_avail_functions,
|
||||
"Show available functions to filter"),
|
||||
OPT_CALLBACK_DEFAULT('F', "funcs", NULL, "[FILTER]",
|
||||
"Show available functions to filter",
|
||||
opt_list_avail_functions, "*"),
|
||||
OPT_STRING('p', "pid", &ftrace.target.pid, "pid",
|
||||
"Trace on existing process id"),
|
||||
/* TODO: Add short option -t after -t/--tracer can be removed. */
|
||||
|
|
|
@ -10,6 +10,7 @@
|
|||
|
||||
#include "util/color.h"
|
||||
#include "util/dso.h"
|
||||
#include "util/vdso.h"
|
||||
#include "util/evlist.h"
|
||||
#include "util/evsel.h"
|
||||
#include "util/map.h"
|
||||
|
@ -23,9 +24,11 @@
|
|||
#include "util/symbol.h"
|
||||
#include "util/synthetic-events.h"
|
||||
#include "util/thread.h"
|
||||
#include <linux/err.h>
|
||||
#include "util/namespaces.h"
|
||||
|
||||
#include <linux/err.h>
|
||||
#include <subcmd/parse-options.h>
|
||||
#include <uapi/linux/mman.h> /* To get things like MAP_HUGETLB even on older libc headers */
|
||||
|
||||
#include <linux/list.h>
|
||||
#include <errno.h>
|
||||
|
@ -35,6 +38,7 @@ struct perf_inject {
|
|||
struct perf_tool tool;
|
||||
struct perf_session *session;
|
||||
bool build_ids;
|
||||
bool build_id_all;
|
||||
bool sched_stat;
|
||||
bool have_auxtrace;
|
||||
bool strip;
|
||||
|
@ -54,6 +58,9 @@ struct event_entry {
|
|||
union perf_event event[];
|
||||
};
|
||||
|
||||
static int dso__inject_build_id(struct dso *dso, struct perf_tool *tool,
|
||||
struct machine *machine, u8 cpumode, u32 flags);
|
||||
|
||||
static int output_bytes(struct perf_inject *inject, void *buf, size_t sz)
|
||||
{
|
||||
ssize_t size;
|
||||
|
@ -97,6 +104,13 @@ static int perf_event__repipe_op2_synth(struct perf_session *session,
|
|||
return perf_event__repipe_synth(session->tool, event);
|
||||
}
|
||||
|
||||
static int perf_event__repipe_op4_synth(struct perf_session *session,
|
||||
union perf_event *event,
|
||||
u64 data __maybe_unused)
|
||||
{
|
||||
return perf_event__repipe_synth(session->tool, event);
|
||||
}
|
||||
|
||||
static int perf_event__repipe_attr(struct perf_tool *tool,
|
||||
union perf_event *event,
|
||||
struct evlist **pevlist)
|
||||
|
@ -115,6 +129,13 @@ static int perf_event__repipe_attr(struct perf_tool *tool,
|
|||
return perf_event__repipe_synth(tool, event);
|
||||
}
|
||||
|
||||
static int perf_event__repipe_event_update(struct perf_tool *tool,
|
||||
union perf_event *event,
|
||||
struct evlist **pevlist __maybe_unused)
|
||||
{
|
||||
return perf_event__repipe_synth(tool, event);
|
||||
}
|
||||
|
||||
#ifdef HAVE_AUXTRACE_SUPPORT
|
||||
|
||||
static int copy_bytes(struct perf_inject *inject, int fd, off_t size)
|
||||
|
@ -303,6 +324,68 @@ static int perf_event__jit_repipe_mmap(struct perf_tool *tool,
|
|||
}
|
||||
#endif
|
||||
|
||||
static struct dso *findnew_dso(int pid, int tid, const char *filename,
|
||||
struct dso_id *id, struct machine *machine)
|
||||
{
|
||||
struct thread *thread;
|
||||
struct nsinfo *nsi = NULL;
|
||||
struct nsinfo *nnsi;
|
||||
struct dso *dso;
|
||||
bool vdso;
|
||||
|
||||
thread = machine__findnew_thread(machine, pid, tid);
|
||||
if (thread == NULL) {
|
||||
pr_err("cannot find or create a task %d/%d.\n", tid, pid);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
vdso = is_vdso_map(filename);
|
||||
nsi = nsinfo__get(thread->nsinfo);
|
||||
|
||||
if (vdso) {
|
||||
/* The vdso maps are always on the host and not the
|
||||
* container. Ensure that we don't use setns to look
|
||||
* them up.
|
||||
*/
|
||||
nnsi = nsinfo__copy(nsi);
|
||||
if (nnsi) {
|
||||
nsinfo__put(nsi);
|
||||
nnsi->need_setns = false;
|
||||
nsi = nnsi;
|
||||
}
|
||||
dso = machine__findnew_vdso(machine, thread);
|
||||
} else {
|
||||
dso = machine__findnew_dso_id(machine, filename, id);
|
||||
}
|
||||
|
||||
if (dso)
|
||||
dso->nsinfo = nsi;
|
||||
else
|
||||
nsinfo__put(nsi);
|
||||
|
||||
thread__put(thread);
|
||||
return dso;
|
||||
}
|
||||
|
||||
static int perf_event__repipe_buildid_mmap(struct perf_tool *tool,
|
||||
union perf_event *event,
|
||||
struct perf_sample *sample,
|
||||
struct machine *machine)
|
||||
{
|
||||
struct dso *dso;
|
||||
|
||||
dso = findnew_dso(event->mmap.pid, event->mmap.tid,
|
||||
event->mmap.filename, NULL, machine);
|
||||
|
||||
if (dso && !dso->hit) {
|
||||
dso->hit = 1;
|
||||
dso__inject_build_id(dso, tool, machine, sample->cpumode, 0);
|
||||
dso__put(dso);
|
||||
}
|
||||
|
||||
return perf_event__repipe(tool, event, sample, machine);
|
||||
}
|
||||
|
||||
static int perf_event__repipe_mmap2(struct perf_tool *tool,
|
||||
union perf_event *event,
|
||||
struct perf_sample *sample,
|
||||
|
@ -341,6 +424,34 @@ static int perf_event__jit_repipe_mmap2(struct perf_tool *tool,
|
|||
}
|
||||
#endif
|
||||
|
||||
static int perf_event__repipe_buildid_mmap2(struct perf_tool *tool,
|
||||
union perf_event *event,
|
||||
struct perf_sample *sample,
|
||||
struct machine *machine)
|
||||
{
|
||||
struct dso_id dso_id = {
|
||||
.maj = event->mmap2.maj,
|
||||
.min = event->mmap2.min,
|
||||
.ino = event->mmap2.ino,
|
||||
.ino_generation = event->mmap2.ino_generation,
|
||||
};
|
||||
struct dso *dso;
|
||||
|
||||
dso = findnew_dso(event->mmap2.pid, event->mmap2.tid,
|
||||
event->mmap2.filename, &dso_id, machine);
|
||||
|
||||
if (dso && !dso->hit) {
|
||||
dso->hit = 1;
|
||||
dso__inject_build_id(dso, tool, machine, sample->cpumode,
|
||||
event->mmap2.flags);
|
||||
dso__put(dso);
|
||||
}
|
||||
|
||||
perf_event__repipe(tool, event, sample, machine);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int perf_event__repipe_fork(struct perf_tool *tool,
|
||||
union perf_event *event,
|
||||
struct perf_sample *sample,
|
||||
|
@ -405,34 +516,36 @@ static int perf_event__repipe_tracing_data(struct perf_session *session,
|
|||
|
||||
static int dso__read_build_id(struct dso *dso)
|
||||
{
|
||||
struct nscookie nsc;
|
||||
|
||||
if (dso->has_build_id)
|
||||
return 0;
|
||||
|
||||
if (filename__read_build_id(dso->long_name, dso->build_id,
|
||||
sizeof(dso->build_id)) > 0) {
|
||||
nsinfo__mountns_enter(dso->nsinfo, &nsc);
|
||||
if (filename__read_build_id(dso->long_name, &dso->bid) > 0)
|
||||
dso->has_build_id = true;
|
||||
return 0;
|
||||
}
|
||||
nsinfo__mountns_exit(&nsc);
|
||||
|
||||
return -1;
|
||||
return dso->has_build_id ? 0 : -1;
|
||||
}
|
||||
|
||||
static int dso__inject_build_id(struct dso *dso, struct perf_tool *tool,
|
||||
struct machine *machine)
|
||||
struct machine *machine, u8 cpumode, u32 flags)
|
||||
{
|
||||
u16 misc = PERF_RECORD_MISC_USER;
|
||||
int err;
|
||||
|
||||
if (is_anon_memory(dso->long_name) || flags & MAP_HUGETLB)
|
||||
return 0;
|
||||
if (is_no_dso_memory(dso->long_name))
|
||||
return 0;
|
||||
|
||||
if (dso__read_build_id(dso) < 0) {
|
||||
pr_debug("no build_id found for %s\n", dso->long_name);
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (dso->kernel)
|
||||
misc = PERF_RECORD_MISC_KERNEL;
|
||||
|
||||
err = perf_event__synthesize_build_id(tool, dso, misc, perf_event__repipe,
|
||||
machine);
|
||||
err = perf_event__synthesize_build_id(tool, dso, cpumode,
|
||||
perf_event__repipe, machine);
|
||||
if (err) {
|
||||
pr_err("Can't synthesize build_id event for %s\n", dso->long_name);
|
||||
return -1;
|
||||
|
@ -441,8 +554,7 @@ static int dso__inject_build_id(struct dso *dso, struct perf_tool *tool,
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int perf_event__inject_buildid(struct perf_tool *tool,
|
||||
union perf_event *event,
|
||||
int perf_event__inject_buildid(struct perf_tool *tool, union perf_event *event,
|
||||
struct perf_sample *sample,
|
||||
struct evsel *evsel __maybe_unused,
|
||||
struct machine *machine)
|
||||
|
@ -460,19 +572,8 @@ static int perf_event__inject_buildid(struct perf_tool *tool,
|
|||
if (thread__find_map(thread, sample->cpumode, sample->ip, &al)) {
|
||||
if (!al.map->dso->hit) {
|
||||
al.map->dso->hit = 1;
|
||||
if (map__load(al.map) >= 0) {
|
||||
dso__inject_build_id(al.map->dso, tool, machine);
|
||||
/*
|
||||
* If this fails, too bad, let the other side
|
||||
* account this as unresolved.
|
||||
*/
|
||||
} else {
|
||||
#ifdef HAVE_LIBELF_SUPPORT
|
||||
pr_warning("no symbols found in %s, maybe "
|
||||
"install a debug package?\n",
|
||||
al.map->dso->long_name);
|
||||
#endif
|
||||
}
|
||||
dso__inject_build_id(al.map->dso, tool, machine,
|
||||
sample->cpumode, al.map->flags);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -606,7 +707,7 @@ static int __cmd_inject(struct perf_inject *inject)
|
|||
signal(SIGINT, sig_handler);
|
||||
|
||||
if (inject->build_ids || inject->sched_stat ||
|
||||
inject->itrace_synth_opts.set) {
|
||||
inject->itrace_synth_opts.set || inject->build_id_all) {
|
||||
inject->tool.mmap = perf_event__repipe_mmap;
|
||||
inject->tool.mmap2 = perf_event__repipe_mmap2;
|
||||
inject->tool.fork = perf_event__repipe_fork;
|
||||
|
@ -615,7 +716,10 @@ static int __cmd_inject(struct perf_inject *inject)
|
|||
|
||||
output_data_offset = session->header.data_offset;
|
||||
|
||||
if (inject->build_ids) {
|
||||
if (inject->build_id_all) {
|
||||
inject->tool.mmap = perf_event__repipe_buildid_mmap;
|
||||
inject->tool.mmap2 = perf_event__repipe_buildid_mmap2;
|
||||
} else if (inject->build_ids) {
|
||||
inject->tool.sample = perf_event__inject_buildid;
|
||||
} else if (inject->sched_stat) {
|
||||
struct evsel *evsel;
|
||||
|
@ -708,9 +812,12 @@ int cmd_inject(int argc, const char **argv)
|
|||
struct perf_inject inject = {
|
||||
.tool = {
|
||||
.sample = perf_event__repipe_sample,
|
||||
.read = perf_event__repipe_sample,
|
||||
.mmap = perf_event__repipe,
|
||||
.mmap2 = perf_event__repipe,
|
||||
.comm = perf_event__repipe,
|
||||
.namespaces = perf_event__repipe,
|
||||
.cgroup = perf_event__repipe,
|
||||
.fork = perf_event__repipe,
|
||||
.exit = perf_event__repipe,
|
||||
.lost = perf_event__repipe,
|
||||
|
@ -718,19 +825,28 @@ int cmd_inject(int argc, const char **argv)
|
|||
.aux = perf_event__repipe,
|
||||
.itrace_start = perf_event__repipe,
|
||||
.context_switch = perf_event__repipe,
|
||||
.read = perf_event__repipe_sample,
|
||||
.throttle = perf_event__repipe,
|
||||
.unthrottle = perf_event__repipe,
|
||||
.ksymbol = perf_event__repipe,
|
||||
.bpf = perf_event__repipe,
|
||||
.text_poke = perf_event__repipe,
|
||||
.attr = perf_event__repipe_attr,
|
||||
.event_update = perf_event__repipe_event_update,
|
||||
.tracing_data = perf_event__repipe_op2_synth,
|
||||
.auxtrace_info = perf_event__repipe_op2_synth,
|
||||
.auxtrace = perf_event__repipe_auxtrace,
|
||||
.auxtrace_error = perf_event__repipe_op2_synth,
|
||||
.time_conv = perf_event__repipe_op2_synth,
|
||||
.finished_round = perf_event__repipe_oe_synth,
|
||||
.build_id = perf_event__repipe_op2_synth,
|
||||
.id_index = perf_event__repipe_op2_synth,
|
||||
.auxtrace_info = perf_event__repipe_op2_synth,
|
||||
.auxtrace_error = perf_event__repipe_op2_synth,
|
||||
.time_conv = perf_event__repipe_op2_synth,
|
||||
.thread_map = perf_event__repipe_op2_synth,
|
||||
.cpu_map = perf_event__repipe_op2_synth,
|
||||
.stat_config = perf_event__repipe_op2_synth,
|
||||
.stat = perf_event__repipe_op2_synth,
|
||||
.stat_round = perf_event__repipe_op2_synth,
|
||||
.feature = perf_event__repipe_op2_synth,
|
||||
.compressed = perf_event__repipe_op4_synth,
|
||||
.auxtrace = perf_event__repipe_auxtrace,
|
||||
},
|
||||
.input_name = "-",
|
||||
.samples = LIST_HEAD_INIT(inject.samples),
|
||||
|
@ -747,6 +863,8 @@ int cmd_inject(int argc, const char **argv)
|
|||
struct option options[] = {
|
||||
OPT_BOOLEAN('b', "build-ids", &inject.build_ids,
|
||||
"Inject build-ids into the output stream"),
|
||||
OPT_BOOLEAN(0, "buildid-all", &inject.build_id_all,
|
||||
"Inject build-ids of all DSOs into the output stream"),
|
||||
OPT_STRING('i', "input", &inject.input_name, "file",
|
||||
"input file name"),
|
||||
OPT_STRING('o', "output", &inject.output.path, "file",
|
||||
|
@ -795,8 +913,6 @@ int cmd_inject(int argc, const char **argv)
|
|||
return -1;
|
||||
}
|
||||
|
||||
inject.tool.ordered_events = inject.sched_stat;
|
||||
|
||||
data.path = inject.input_name;
|
||||
inject.session = perf_session__new(&data, true, &inject.tool);
|
||||
if (IS_ERR(inject.session))
|
||||
|
@ -805,7 +921,7 @@ int cmd_inject(int argc, const char **argv)
|
|||
if (zstd_init(&(inject.session->zstd_data), 0) < 0)
|
||||
pr_warning("Decompression initialization failed.\n");
|
||||
|
||||
if (inject.build_ids) {
|
||||
if (inject.build_ids && !inject.build_id_all) {
|
||||
/*
|
||||
* to make sure the mmap records are ordered correctly
|
||||
* and so that the correct especially due to jitted code
|
||||
|
@ -815,6 +931,11 @@ int cmd_inject(int argc, const char **argv)
|
|||
inject.tool.ordered_events = true;
|
||||
inject.tool.ordering_requires_timestamps = true;
|
||||
}
|
||||
|
||||
if (inject.sched_stat) {
|
||||
inject.tool.ordered_events = true;
|
||||
}
|
||||
|
||||
#ifdef HAVE_JITDUMP
|
||||
if (inject.jit_mode) {
|
||||
inject.tool.mmap2 = perf_event__jit_repipe_mmap2;
|
||||
|
|
|
@ -92,13 +92,6 @@ int cmd_list(int argc, const char **argv)
|
|||
else if ((sep = strchr(argv[i], ':')) != NULL) {
|
||||
int sep_idx;
|
||||
|
||||
if (sep == NULL) {
|
||||
print_events(argv[i], raw_dump, !desc_flag,
|
||||
long_desc_flag,
|
||||
details_flag,
|
||||
deprecated);
|
||||
continue;
|
||||
}
|
||||
sep_idx = sep - argv[i];
|
||||
s = strdup(argv[i]);
|
||||
if (s == NULL)
|
||||
|
|
|
@ -1593,6 +1593,16 @@ static int record__init_clock(struct record *rec)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static void hit_auxtrace_snapshot_trigger(struct record *rec)
|
||||
{
|
||||
if (trigger_is_ready(&auxtrace_snapshot_trigger)) {
|
||||
trigger_hit(&auxtrace_snapshot_trigger);
|
||||
auxtrace_record__snapshot_started = 1;
|
||||
if (auxtrace_record__snapshot_start(rec->itr))
|
||||
trigger_error(&auxtrace_snapshot_trigger);
|
||||
}
|
||||
}
|
||||
|
||||
static int __cmd_record(struct record *rec, int argc, const char **argv)
|
||||
{
|
||||
int err;
|
||||
|
@ -1937,6 +1947,10 @@ static int __cmd_record(struct record *rec, int argc, const char **argv)
|
|||
case EVLIST_CTL_CMD_DISABLE:
|
||||
pr_info(EVLIST_DISABLED_MSG);
|
||||
break;
|
||||
case EVLIST_CTL_CMD_SNAPSHOT:
|
||||
hit_auxtrace_snapshot_trigger(rec);
|
||||
evlist__ctlfd_ack(rec->evlist);
|
||||
break;
|
||||
case EVLIST_CTL_CMD_ACK:
|
||||
case EVLIST_CTL_CMD_UNSUPPORTED:
|
||||
default:
|
||||
|
@ -2234,27 +2248,9 @@ static int parse_control_option(const struct option *opt,
|
|||
const char *str,
|
||||
int unset __maybe_unused)
|
||||
{
|
||||
char *comma = NULL, *endptr = NULL;
|
||||
struct record_opts *config = (struct record_opts *)opt->value;
|
||||
struct record_opts *opts = opt->value;
|
||||
|
||||
if (strncmp(str, "fd:", 3))
|
||||
return -EINVAL;
|
||||
|
||||
config->ctl_fd = strtoul(&str[3], &endptr, 0);
|
||||
if (endptr == &str[3])
|
||||
return -EINVAL;
|
||||
|
||||
comma = strchr(str, ',');
|
||||
if (comma) {
|
||||
if (endptr != comma)
|
||||
return -EINVAL;
|
||||
|
||||
config->ctl_fd_ack = strtoul(comma + 1, &endptr, 0);
|
||||
if (endptr == comma + 1 || *endptr != '\0')
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
return 0;
|
||||
return evlist__parse_control(str, &opts->ctl_fd, &opts->ctl_fd_ack, &opts->ctl_fd_close);
|
||||
}
|
||||
|
||||
static void switch_output_size_warn(struct record *rec)
|
||||
|
@ -2596,9 +2592,11 @@ static struct option __record_options[] = {
|
|||
"libpfm4 event selector. use 'perf list' to list available events",
|
||||
parse_libpfm_events_option),
|
||||
#endif
|
||||
OPT_CALLBACK(0, "control", &record.opts, "fd:ctl-fd[,ack-fd]",
|
||||
"Listen on ctl-fd descriptor for command to control measurement ('enable': enable events, 'disable': disable events).\n"
|
||||
"\t\t\t Optionally send control command completion ('ack\\n') to ack-fd descriptor.",
|
||||
OPT_CALLBACK(0, "control", &record.opts, "fd:ctl-fd[,ack-fd] or fifo:ctl-fifo[,ack-fifo]",
|
||||
"Listen on ctl-fd descriptor for command to control measurement ('enable': enable events, 'disable': disable events,\n"
|
||||
"\t\t\t 'snapshot': AUX area tracing snapshot).\n"
|
||||
"\t\t\t Optionally send control command completion ('ack\\n') to ack-fd descriptor.\n"
|
||||
"\t\t\t Alternatively, ctl-fifo / ack-fifo will be opened and used as ctl-fd / ack-fd.",
|
||||
parse_control_option),
|
||||
OPT_END()
|
||||
};
|
||||
|
@ -2671,12 +2669,14 @@ int cmd_record(int argc, const char **argv)
|
|||
!perf_can_record_switch_events()) {
|
||||
ui__error("kernel does not support recording context switch events\n");
|
||||
parse_options_usage(record_usage, record_options, "switch-events", 0);
|
||||
return -EINVAL;
|
||||
err = -EINVAL;
|
||||
goto out_opts;
|
||||
}
|
||||
|
||||
if (switch_output_setup(rec)) {
|
||||
parse_options_usage(record_usage, record_options, "switch-output", 0);
|
||||
return -EINVAL;
|
||||
err = -EINVAL;
|
||||
goto out_opts;
|
||||
}
|
||||
|
||||
if (rec->switch_output.time) {
|
||||
|
@ -2687,8 +2687,10 @@ int cmd_record(int argc, const char **argv)
|
|||
if (rec->switch_output.num_files) {
|
||||
rec->switch_output.filenames = calloc(sizeof(char *),
|
||||
rec->switch_output.num_files);
|
||||
if (!rec->switch_output.filenames)
|
||||
return -EINVAL;
|
||||
if (!rec->switch_output.filenames) {
|
||||
err = -EINVAL;
|
||||
goto out_opts;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -2704,7 +2706,8 @@ int cmd_record(int argc, const char **argv)
|
|||
rec->affinity_mask.bits = bitmap_alloc(rec->affinity_mask.nbits);
|
||||
if (!rec->affinity_mask.bits) {
|
||||
pr_err("Failed to allocate thread mask for %zd cpus\n", rec->affinity_mask.nbits);
|
||||
return -ENOMEM;
|
||||
err = -ENOMEM;
|
||||
goto out_opts;
|
||||
}
|
||||
pr_debug2("thread mask[%zd]: empty\n", rec->affinity_mask.nbits);
|
||||
}
|
||||
|
@ -2835,6 +2838,8 @@ out:
|
|||
evlist__delete(rec->evlist);
|
||||
symbol__exit();
|
||||
auxtrace_record__free(rec->itr);
|
||||
out_opts:
|
||||
evlist__close_control(rec->opts.ctl_fd, rec->opts.ctl_fd_ack, &rec->opts.ctl_fd_close);
|
||||
return err;
|
||||
}
|
||||
|
||||
|
@ -2842,12 +2847,7 @@ static void snapshot_sig_handler(int sig __maybe_unused)
|
|||
{
|
||||
struct record *rec = &record;
|
||||
|
||||
if (trigger_is_ready(&auxtrace_snapshot_trigger)) {
|
||||
trigger_hit(&auxtrace_snapshot_trigger);
|
||||
auxtrace_record__snapshot_started = 1;
|
||||
if (auxtrace_record__snapshot_start(record.itr))
|
||||
trigger_error(&auxtrace_snapshot_trigger);
|
||||
}
|
||||
hit_auxtrace_snapshot_trigger(rec);
|
||||
|
||||
if (switch_output_signal(rec))
|
||||
trigger_hit(&switch_output_trigger);
|
||||
|
|
|
@ -130,7 +130,8 @@ struct work_atoms {
|
|||
struct thread *thread;
|
||||
struct rb_node node;
|
||||
u64 max_lat;
|
||||
u64 max_lat_at;
|
||||
u64 max_lat_start;
|
||||
u64 max_lat_end;
|
||||
u64 total_lat;
|
||||
u64 nb_atoms;
|
||||
u64 total_runtime;
|
||||
|
@ -1096,7 +1097,8 @@ add_sched_in_event(struct work_atoms *atoms, u64 timestamp)
|
|||
atoms->total_lat += delta;
|
||||
if (delta > atoms->max_lat) {
|
||||
atoms->max_lat = delta;
|
||||
atoms->max_lat_at = timestamp;
|
||||
atoms->max_lat_start = atom->wake_up_time;
|
||||
atoms->max_lat_end = timestamp;
|
||||
}
|
||||
atoms->nb_atoms++;
|
||||
}
|
||||
|
@ -1322,7 +1324,7 @@ static void output_lat_thread(struct perf_sched *sched, struct work_atoms *work_
|
|||
int i;
|
||||
int ret;
|
||||
u64 avg;
|
||||
char max_lat_at[32];
|
||||
char max_lat_start[32], max_lat_end[32];
|
||||
|
||||
if (!work_list->nb_atoms)
|
||||
return;
|
||||
|
@ -1344,13 +1346,14 @@ static void output_lat_thread(struct perf_sched *sched, struct work_atoms *work_
|
|||
printf(" ");
|
||||
|
||||
avg = work_list->total_lat / work_list->nb_atoms;
|
||||
timestamp__scnprintf_usec(work_list->max_lat_at, max_lat_at, sizeof(max_lat_at));
|
||||
timestamp__scnprintf_usec(work_list->max_lat_start, max_lat_start, sizeof(max_lat_start));
|
||||
timestamp__scnprintf_usec(work_list->max_lat_end, max_lat_end, sizeof(max_lat_end));
|
||||
|
||||
printf("|%11.3f ms |%9" PRIu64 " | avg:%9.3f ms | max:%9.3f ms | max at: %13s s\n",
|
||||
printf("|%11.3f ms |%9" PRIu64 " | avg:%8.3f ms | max:%8.3f ms | max start: %12s s | max end: %12s s\n",
|
||||
(double)work_list->total_runtime / NSEC_PER_MSEC,
|
||||
work_list->nb_atoms, (double)avg / NSEC_PER_MSEC,
|
||||
(double)work_list->max_lat / NSEC_PER_MSEC,
|
||||
max_lat_at);
|
||||
max_lat_start, max_lat_end);
|
||||
}
|
||||
|
||||
static int pid_cmp(struct work_atoms *l, struct work_atoms *r)
|
||||
|
@ -3137,7 +3140,8 @@ static void __merge_work_atoms(struct rb_root_cached *root, struct work_atoms *d
|
|||
list_splice(&data->work_list, &this->work_list);
|
||||
if (this->max_lat < data->max_lat) {
|
||||
this->max_lat = data->max_lat;
|
||||
this->max_lat_at = data->max_lat_at;
|
||||
this->max_lat_start = data->max_lat_start;
|
||||
this->max_lat_end = data->max_lat_end;
|
||||
}
|
||||
zfree(&data);
|
||||
return;
|
||||
|
@ -3176,9 +3180,9 @@ static int perf_sched__lat(struct perf_sched *sched)
|
|||
perf_sched__merge_lat(sched);
|
||||
perf_sched__sort_lat(sched);
|
||||
|
||||
printf("\n -----------------------------------------------------------------------------------------------------------------\n");
|
||||
printf(" Task | Runtime ms | Switches | Average delay ms | Maximum delay ms | Maximum delay at |\n");
|
||||
printf(" -----------------------------------------------------------------------------------------------------------------\n");
|
||||
printf("\n -------------------------------------------------------------------------------------------------------------------------------------------\n");
|
||||
printf(" Task | Runtime ms | Switches | Avg delay ms | Max delay ms | Max delay start | Max delay end |\n");
|
||||
printf(" -------------------------------------------------------------------------------------------------------------------------------------------\n");
|
||||
|
||||
next = rb_first_cached(&sched->sorted_atom_root);
|
||||
|
||||
|
|
|
@ -702,12 +702,14 @@ static int perf_sample__fprintf_start(struct perf_script *script,
|
|||
char tstr[128];
|
||||
|
||||
if (PRINT_FIELD(COMM)) {
|
||||
const char *comm = thread ? thread__comm_str(thread) : ":-1";
|
||||
|
||||
if (latency_format)
|
||||
printed += fprintf(fp, "%8.8s ", thread__comm_str(thread));
|
||||
printed += fprintf(fp, "%8.8s ", comm);
|
||||
else if (PRINT_FIELD(IP) && evsel__has_callchain(evsel) && symbol_conf.use_callchain)
|
||||
printed += fprintf(fp, "%s ", thread__comm_str(thread));
|
||||
printed += fprintf(fp, "%s ", comm);
|
||||
else
|
||||
printed += fprintf(fp, "%16s ", thread__comm_str(thread));
|
||||
printed += fprintf(fp, "%16s ", comm);
|
||||
}
|
||||
|
||||
if (PRINT_FIELD(PID) && PRINT_FIELD(TID))
|
||||
|
@ -2238,7 +2240,7 @@ static int print_event_with_time(struct perf_tool *tool,
|
|||
if (tid != -1)
|
||||
thread = machine__findnew_thread(machine, pid, tid);
|
||||
|
||||
if (thread && evsel) {
|
||||
if (evsel) {
|
||||
perf_sample__fprintf_start(script, sample, thread, evsel,
|
||||
event->header.type, stdout);
|
||||
}
|
||||
|
|
|
@ -56,7 +56,7 @@
|
|||
#include "util/cpumap.h"
|
||||
#include "util/thread_map.h"
|
||||
#include "util/counts.h"
|
||||
#include "util/group.h"
|
||||
#include "util/topdown.h"
|
||||
#include "util/session.h"
|
||||
#include "util/tool.h"
|
||||
#include "util/string2.h"
|
||||
|
@ -128,6 +128,15 @@ static const char * topdown_attrs[] = {
|
|||
NULL,
|
||||
};
|
||||
|
||||
static const char *topdown_metric_attrs[] = {
|
||||
"slots",
|
||||
"topdown-retiring",
|
||||
"topdown-bad-spec",
|
||||
"topdown-fe-bound",
|
||||
"topdown-be-bound",
|
||||
NULL,
|
||||
};
|
||||
|
||||
static const char *smi_cost_attrs = {
|
||||
"{"
|
||||
"msr/aperf/,"
|
||||
|
@ -578,6 +587,7 @@ static void process_evlist(struct evlist *evlist, unsigned int interval)
|
|||
process_interval();
|
||||
pr_info(EVLIST_DISABLED_MSG);
|
||||
break;
|
||||
case EVLIST_CTL_CMD_SNAPSHOT:
|
||||
case EVLIST_CTL_CMD_ACK:
|
||||
case EVLIST_CTL_CMD_UNSUPPORTED:
|
||||
default:
|
||||
|
@ -1045,27 +1055,20 @@ static int parse_control_option(const struct option *opt,
|
|||
const char *str,
|
||||
int unset __maybe_unused)
|
||||
{
|
||||
char *comma = NULL, *endptr = NULL;
|
||||
struct perf_stat_config *config = (struct perf_stat_config *)opt->value;
|
||||
struct perf_stat_config *config = opt->value;
|
||||
|
||||
if (strncmp(str, "fd:", 3))
|
||||
return -EINVAL;
|
||||
|
||||
config->ctl_fd = strtoul(&str[3], &endptr, 0);
|
||||
if (endptr == &str[3])
|
||||
return -EINVAL;
|
||||
|
||||
comma = strchr(str, ',');
|
||||
if (comma) {
|
||||
if (endptr != comma)
|
||||
return -EINVAL;
|
||||
|
||||
config->ctl_fd_ack = strtoul(comma + 1, &endptr, 0);
|
||||
if (endptr == comma + 1 || *endptr != '\0')
|
||||
return -EINVAL;
|
||||
return evlist__parse_control(str, &config->ctl_fd, &config->ctl_fd_ack, &config->ctl_fd_close);
|
||||
}
|
||||
|
||||
return 0;
|
||||
static int parse_stat_cgroups(const struct option *opt,
|
||||
const char *str, int unset)
|
||||
{
|
||||
if (stat_config.cgroup_list) {
|
||||
pr_err("--cgroup and --for-each-cgroup cannot be used together\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
return parse_cgroups(opt, str, unset);
|
||||
}
|
||||
|
||||
static struct option stat_options[] = {
|
||||
|
@ -1111,7 +1114,9 @@ static struct option stat_options[] = {
|
|||
OPT_STRING('x', "field-separator", &stat_config.csv_sep, "separator",
|
||||
"print counts with custom separator"),
|
||||
OPT_CALLBACK('G', "cgroup", &evsel_list, "name",
|
||||
"monitor event in cgroup name only", parse_cgroups),
|
||||
"monitor event in cgroup name only", parse_stat_cgroups),
|
||||
OPT_STRING(0, "for-each-cgroup", &stat_config.cgroup_list, "name",
|
||||
"expand events for each cgroup"),
|
||||
OPT_STRING('o', "output", &output_name, "file", "output file name"),
|
||||
OPT_BOOLEAN(0, "append", &append_file, "append to the output file"),
|
||||
OPT_INTEGER(0, "log-fd", &output_fd,
|
||||
|
@ -1171,9 +1176,10 @@ static struct option stat_options[] = {
|
|||
"libpfm4 event selector. use 'perf list' to list available events",
|
||||
parse_libpfm_events_option),
|
||||
#endif
|
||||
OPT_CALLBACK(0, "control", &stat_config, "fd:ctl-fd[,ack-fd]",
|
||||
OPT_CALLBACK(0, "control", &stat_config, "fd:ctl-fd[,ack-fd] or fifo:ctl-fifo[,ack-fifo]",
|
||||
"Listen on ctl-fd descriptor for command to control measurement ('enable': enable events, 'disable': disable events).\n"
|
||||
"\t\t\t Optionally send control command completion ('ack\\n') to ack-fd descriptor.",
|
||||
"\t\t\t Optionally send control command completion ('ack\\n') to ack-fd descriptor.\n"
|
||||
"\t\t\t Alternatively, ctl-fifo / ack-fifo will be opened and used as ctl-fd / ack-fd.",
|
||||
parse_control_option),
|
||||
OPT_END()
|
||||
};
|
||||
|
@ -1497,55 +1503,6 @@ static int perf_stat_init_aggr_mode_file(struct perf_stat *st)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int topdown_filter_events(const char **attr, char **str, bool use_group)
|
||||
{
|
||||
int off = 0;
|
||||
int i;
|
||||
int len = 0;
|
||||
char *s;
|
||||
|
||||
for (i = 0; attr[i]; i++) {
|
||||
if (pmu_have_event("cpu", attr[i])) {
|
||||
len += strlen(attr[i]) + 1;
|
||||
attr[i - off] = attr[i];
|
||||
} else
|
||||
off++;
|
||||
}
|
||||
attr[i - off] = NULL;
|
||||
|
||||
*str = malloc(len + 1 + 2);
|
||||
if (!*str)
|
||||
return -1;
|
||||
s = *str;
|
||||
if (i - off == 0) {
|
||||
*s = 0;
|
||||
return 0;
|
||||
}
|
||||
if (use_group)
|
||||
*s++ = '{';
|
||||
for (i = 0; attr[i]; i++) {
|
||||
strcpy(s, attr[i]);
|
||||
s += strlen(s);
|
||||
*s++ = ',';
|
||||
}
|
||||
if (use_group) {
|
||||
s[-1] = '}';
|
||||
*s = 0;
|
||||
} else
|
||||
s[-1] = 0;
|
||||
return 0;
|
||||
}
|
||||
|
||||
__weak bool arch_topdown_check_group(bool *warn)
|
||||
{
|
||||
*warn = false;
|
||||
return false;
|
||||
}
|
||||
|
||||
__weak void arch_topdown_group_warn(void)
|
||||
{
|
||||
}
|
||||
|
||||
/*
|
||||
* Add default attributes, if there were no attributes specified or
|
||||
* if -d/--detailed, -d -d or -d -d -d is used:
|
||||
|
@ -1742,6 +1699,24 @@ static int add_default_attributes(void)
|
|||
char *str = NULL;
|
||||
bool warn = false;
|
||||
|
||||
if (!force_metric_only)
|
||||
stat_config.metric_only = true;
|
||||
|
||||
if (topdown_filter_events(topdown_metric_attrs, &str, 1) < 0) {
|
||||
pr_err("Out of memory\n");
|
||||
return -1;
|
||||
}
|
||||
if (topdown_metric_attrs[0] && str) {
|
||||
if (!stat_config.interval && !stat_config.metric_only) {
|
||||
fprintf(stat_config.output,
|
||||
"Topdown accuracy may decrease when measuring long periods.\n"
|
||||
"Please print the result regularly, e.g. -I1000\n");
|
||||
}
|
||||
goto setup_metrics;
|
||||
}
|
||||
|
||||
zfree(&str);
|
||||
|
||||
if (stat_config.aggr_mode != AGGR_GLOBAL &&
|
||||
stat_config.aggr_mode != AGGR_CORE) {
|
||||
pr_err("top down event configuration requires --per-core mode\n");
|
||||
|
@ -1753,8 +1728,6 @@ static int add_default_attributes(void)
|
|||
return -1;
|
||||
}
|
||||
|
||||
if (!force_metric_only)
|
||||
stat_config.metric_only = true;
|
||||
if (topdown_filter_events(topdown_attrs, &str,
|
||||
arch_topdown_check_group(&warn)) < 0) {
|
||||
pr_err("Out of memory\n");
|
||||
|
@ -1763,6 +1736,7 @@ static int add_default_attributes(void)
|
|||
if (topdown_attrs[0] && str) {
|
||||
if (warn)
|
||||
arch_topdown_group_warn();
|
||||
setup_metrics:
|
||||
err = parse_events(evsel_list, str, &errinfo);
|
||||
if (err) {
|
||||
fprintf(stderr,
|
||||
|
@ -2063,9 +2037,11 @@ static void setup_system_wide(int forks)
|
|||
struct evsel *counter;
|
||||
|
||||
evlist__for_each_entry(evsel_list, counter) {
|
||||
if (!counter->core.system_wide)
|
||||
if (!counter->core.system_wide &&
|
||||
strcmp(counter->name, "duration_time")) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
if (evsel_list->core.nr_entries)
|
||||
target.system_wide = true;
|
||||
|
@ -2250,6 +2226,19 @@ int cmd_stat(int argc, const char **argv)
|
|||
if (add_default_attributes())
|
||||
goto out;
|
||||
|
||||
if (stat_config.cgroup_list) {
|
||||
if (nr_cgroups > 0) {
|
||||
pr_err("--cgroup and --for-each-cgroup cannot be used together\n");
|
||||
parse_options_usage(stat_usage, stat_options, "G", 1);
|
||||
parse_options_usage(NULL, stat_options, "for-each-cgroup", 0);
|
||||
goto out;
|
||||
}
|
||||
|
||||
if (evlist__expand_cgroup(evsel_list, stat_config.cgroup_list,
|
||||
&stat_config.metric_events, true) < 0)
|
||||
goto out;
|
||||
}
|
||||
|
||||
target__validate(&target);
|
||||
|
||||
if ((stat_config.aggr_mode == AGGR_THREAD) && (target.system_wide))
|
||||
|
@ -2416,6 +2405,7 @@ out:
|
|||
|
||||
metricgroup__rblist_exit(&stat_config.metric_events);
|
||||
runtime_stat_delete(&stat_config);
|
||||
evlist__close_control(stat_config.ctl_fd, stat_config.ctl_fd_ack, &stat_config.ctl_fd_close);
|
||||
|
||||
return status;
|
||||
}
|
||||
|
|
|
@ -1762,7 +1762,11 @@ static int trace__read_syscall_info(struct trace *trace, int id)
|
|||
if (table == NULL)
|
||||
return -ENOMEM;
|
||||
|
||||
memset(table + trace->sctbl->syscalls.max_id, 0, (id - trace->sctbl->syscalls.max_id) * sizeof(*sc));
|
||||
// Need to memset from offset 0 and +1 members if brand new
|
||||
if (trace->syscalls.table == NULL)
|
||||
memset(table, 0, (id + 1) * sizeof(*sc));
|
||||
else
|
||||
memset(table + trace->sctbl->syscalls.max_id + 1, 0, (id - trace->sctbl->syscalls.max_id) * sizeof(*sc));
|
||||
|
||||
trace->syscalls.table = table;
|
||||
trace->sctbl->syscalls.max_id = id;
|
||||
|
|
|
@ -60,7 +60,6 @@ static void library_status(void)
|
|||
STATUS(HAVE_DWARF_SUPPORT, dwarf);
|
||||
STATUS(HAVE_DWARF_GETLOCATIONS_SUPPORT, dwarf_getlocations);
|
||||
STATUS(HAVE_GLIBC_SUPPORT, glibc);
|
||||
STATUS(HAVE_GTK2_SUPPORT, gtk2);
|
||||
#ifndef HAVE_SYSCALL_TABLE_SUPPORT
|
||||
STATUS(HAVE_LIBAUDIT_SUPPORT, libaudit);
|
||||
#endif
|
||||
|
|
|
@ -75,6 +75,15 @@ include/uapi/asm-generic/mman-common.h
|
|||
include/uapi/asm-generic/unistd.h
|
||||
'
|
||||
|
||||
# These copies are under tools/perf/trace/beauty/ as they are not used to in
|
||||
# building object files only by scripts in tools/perf/trace/beauty/ to generate
|
||||
# tables that then gets included in .c files for things like id->string syscall
|
||||
# tables (and the reverse lookup as well: string -> id)
|
||||
|
||||
BEAUTY_FILES='
|
||||
include/linux/socket.h
|
||||
'
|
||||
|
||||
check_2 () {
|
||||
file1=$1
|
||||
file2=$2
|
||||
|
@ -100,6 +109,14 @@ check () {
|
|||
check_2 tools/$file $file $*
|
||||
}
|
||||
|
||||
beauty_check () {
|
||||
file=$1
|
||||
|
||||
shift
|
||||
|
||||
check_2 tools/perf/trace/beauty/$file $file $*
|
||||
}
|
||||
|
||||
# Check if we have the kernel headers (tools/perf/../../include), else
|
||||
# we're probably on a detached tarball, so no point in trying to check
|
||||
# differences.
|
||||
|
@ -128,8 +145,9 @@ check arch/x86/lib/insn.c '-I "^#include [\"<]\(../include/\)*asm/in
|
|||
# diff non-symmetric files
|
||||
check_2 tools/perf/arch/x86/entry/syscalls/syscall_64.tbl arch/x86/entry/syscalls/syscall_64.tbl
|
||||
|
||||
# These will require a beauty_check when we get some more like that
|
||||
check_2 tools/perf/trace/beauty/include/linux/socket.h include/linux/socket.h
|
||||
for i in $BEAUTY_FILES; do
|
||||
beauty_check $i -B
|
||||
done
|
||||
|
||||
# check duplicated library files
|
||||
check_2 tools/perf/util/hashmap.h tools/lib/bpf/hashmap.h
|
||||
|
|
|
@ -9,31 +9,13 @@
|
|||
|
||||
struct perf_event_attr;
|
||||
|
||||
extern bool test_attr__enabled;
|
||||
void test_attr__ready(void);
|
||||
void test_attr__init(void);
|
||||
void test_attr__open(struct perf_event_attr *attr, pid_t pid, int cpu,
|
||||
int fd, int group_fd, unsigned long flags);
|
||||
|
||||
#ifndef HAVE_ATTR_TEST
|
||||
#define HAVE_ATTR_TEST 1
|
||||
#endif
|
||||
|
||||
static inline int
|
||||
sys_perf_event_open(struct perf_event_attr *attr,
|
||||
pid_t pid, int cpu, int group_fd,
|
||||
unsigned long flags)
|
||||
{
|
||||
int fd;
|
||||
|
||||
fd = syscall(__NR_perf_event_open, attr, pid, cpu,
|
||||
return syscall(__NR_perf_event_open, attr, pid, cpu,
|
||||
group_fd, flags);
|
||||
|
||||
#if HAVE_ATTR_TEST
|
||||
if (unlikely(test_attr__enabled))
|
||||
test_attr__open(attr, pid, cpu, fd, group_fd, flags);
|
||||
#endif
|
||||
return fd;
|
||||
}
|
||||
|
||||
#endif /* _PERF_SYS_H */
|
||||
|
|
|
@ -32,8 +32,8 @@
|
|||
{
|
||||
"EventCode": "0x1c04e",
|
||||
"EventName": "PM_DATA_FROM_L2MISS_MOD",
|
||||
"BriefDescription": "The processor's data cache was reloaded from a localtion other than the local core's L2 due to a demand load",
|
||||
"PublicDescription": "The processor's data cache was reloaded from a localtion other than the local core's L2 due to either only demand loads or demand loads plus prefetches if MMCR1[16] is 1"
|
||||
"BriefDescription": "The processor's data cache was reloaded from a location other than the local core's L2 due to a demand load",
|
||||
"PublicDescription": "The processor's data cache was reloaded from a location other than the local core's L2 due to either only demand loads or demand loads plus prefetches if MMCR1[16] is 1"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x3c040",
|
||||
|
@ -74,8 +74,8 @@
|
|||
{
|
||||
"EventCode": "0x4c04e",
|
||||
"EventName": "PM_DATA_FROM_L3MISS_MOD",
|
||||
"BriefDescription": "The processor's data cache was reloaded from a localtion other than the local core's L3 due to a demand load",
|
||||
"PublicDescription": "The processor's data cache was reloaded from a localtion other than the local core's L3 due to either only demand loads or demand loads plus prefetches if MMCR1[16] is 1"
|
||||
"BriefDescription": "The processor's data cache was reloaded from a location other than the local core's L3 due to a demand load",
|
||||
"PublicDescription": "The processor's data cache was reloaded from a location other than the local core's L3 due to either only demand loads or demand loads plus prefetches if MMCR1[16] is 1"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x3c042",
|
||||
|
@ -134,7 +134,7 @@
|
|||
{
|
||||
"EventCode": "0x4e04e",
|
||||
"EventName": "PM_DPTEG_FROM_L3MISS",
|
||||
"BriefDescription": "A Page Table Entry was loaded into the TLB from a localtion other than the local core's L3 due to a data side request",
|
||||
"BriefDescription": "A Page Table Entry was loaded into the TLB from a location other than the local core's L3 due to a data side request",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{
|
||||
|
|
|
@ -116,8 +116,8 @@
|
|||
{
|
||||
"EventCode": "0x1404e",
|
||||
"EventName": "PM_INST_FROM_L2MISS",
|
||||
"BriefDescription": "The processor's Instruction cache was reloaded from a localtion other than the local core's L2 due to an instruction fetch (not prefetch)",
|
||||
"PublicDescription": "The processor's Instruction cache was reloaded from a localtion other than the local core's L2 due to either an instruction fetch or instruction fetch plus prefetch if MMCR1[17] is 1"
|
||||
"BriefDescription": "The processor's Instruction cache was reloaded from a location other than the local core's L2 due to an instruction fetch (not prefetch)",
|
||||
"PublicDescription": "The processor's Instruction cache was reloaded from a location other than the local core's L2 due to either an instruction fetch or instruction fetch plus prefetch if MMCR1[17] is 1"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x34040",
|
||||
|
@ -158,8 +158,8 @@
|
|||
{
|
||||
"EventCode": "0x4404e",
|
||||
"EventName": "PM_INST_FROM_L3MISS_MOD",
|
||||
"BriefDescription": "The processor's Instruction cache was reloaded from a localtion other than the local core's L3 due to a instruction fetch",
|
||||
"PublicDescription": "The processor's Instruction cache was reloaded from a localtion other than the local core's L3 due to either an instruction fetch or instruction fetch plus prefetch if MMCR1[17] is 1"
|
||||
"BriefDescription": "The processor's Instruction cache was reloaded from a location other than the local core's L3 due to a instruction fetch",
|
||||
"PublicDescription": "The processor's Instruction cache was reloaded from a location other than the local core's L3 due to either an instruction fetch or instruction fetch plus prefetch if MMCR1[17] is 1"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x34042",
|
||||
|
@ -320,7 +320,7 @@
|
|||
{
|
||||
"EventCode": "0x1504e",
|
||||
"EventName": "PM_IPTEG_FROM_L2MISS",
|
||||
"BriefDescription": "A Page Table Entry was loaded into the TLB from a localtion other than the local core's L2 due to a instruction side request",
|
||||
"BriefDescription": "A Page Table Entry was loaded into the TLB from a location other than the local core's L2 due to a instruction side request",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{
|
||||
|
@ -344,7 +344,7 @@
|
|||
{
|
||||
"EventCode": "0x4504e",
|
||||
"EventName": "PM_IPTEG_FROM_L3MISS",
|
||||
"BriefDescription": "A Page Table Entry was loaded into the TLB from a localtion other than the local core's L3 due to a instruction side request",
|
||||
"BriefDescription": "A Page Table Entry was loaded into the TLB from a location other than the local core's L3 due to a instruction side request",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{
|
||||
|
|
|
@ -92,7 +92,7 @@
|
|||
{
|
||||
"EventCode": "0x4c12e",
|
||||
"EventName": "PM_MRK_DATA_FROM_L2MISS_CYC",
|
||||
"BriefDescription": "Duration in cycles to reload from a localtion other than the local core's L2 due to a marked load",
|
||||
"BriefDescription": "Duration in cycles to reload from a location other than the local core's L2 due to a marked load",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{
|
||||
|
@ -158,13 +158,13 @@
|
|||
{
|
||||
"EventCode": "0x201e4",
|
||||
"EventName": "PM_MRK_DATA_FROM_L3MISS",
|
||||
"BriefDescription": "The processor's data cache was reloaded from a localtion other than the local core's L3 due to a marked load",
|
||||
"BriefDescription": "The processor's data cache was reloaded from a location other than the local core's L3 due to a marked load",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{
|
||||
"EventCode": "0x2d12e",
|
||||
"EventName": "PM_MRK_DATA_FROM_L3MISS_CYC",
|
||||
"BriefDescription": "Duration in cycles to reload from a localtion other than the local core's L3 due to a marked load",
|
||||
"BriefDescription": "Duration in cycles to reload from a location other than the local core's L3 due to a marked load",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{
|
||||
|
@ -392,7 +392,7 @@
|
|||
{
|
||||
"EventCode": "0x1f14e",
|
||||
"EventName": "PM_MRK_DPTEG_FROM_L2MISS",
|
||||
"BriefDescription": "A Page Table Entry was loaded into the TLB from a localtion other than the local core's L2 due to a marked data side request",
|
||||
"BriefDescription": "A Page Table Entry was loaded into the TLB from a location other than the local core's L2 due to a marked data side request",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{
|
||||
|
@ -416,7 +416,7 @@
|
|||
{
|
||||
"EventCode": "0x4f14e",
|
||||
"EventName": "PM_MRK_DPTEG_FROM_L3MISS",
|
||||
"BriefDescription": "A Page Table Entry was loaded into the TLB from a localtion other than the local core's L3 due to a marked data side request",
|
||||
"BriefDescription": "A Page Table Entry was loaded into the TLB from a location other than the local core's L3 due to a marked data side request",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{
|
||||
|
|
|
@ -410,8 +410,8 @@
|
|||
{
|
||||
"EventCode": "0x61c04e",
|
||||
"EventName": "PM_DATA_ALL_FROM_L2MISS_MOD",
|
||||
"BriefDescription": "The processor's data cache was reloaded from a localtion other than the local core's L2 due to either demand loads or data prefetch",
|
||||
"PublicDescription": "The processor's data cache was reloaded from a localtion other than the local core's L2 due to either only demand loads or demand loads plus prefetches if MMCR1[16] is 1"
|
||||
"BriefDescription": "The processor's data cache was reloaded from a location other than the local core's L2 due to either demand loads or data prefetch",
|
||||
"PublicDescription": "The processor's data cache was reloaded from a location other than the local core's L2 due to either only demand loads or demand loads plus prefetches if MMCR1[16] is 1"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x63c040",
|
||||
|
@ -470,8 +470,8 @@
|
|||
{
|
||||
"EventCode": "0x64c04e",
|
||||
"EventName": "PM_DATA_ALL_FROM_L3MISS_MOD",
|
||||
"BriefDescription": "The processor's data cache was reloaded from a localtion other than the local core's L3 due to either demand loads or data prefetch",
|
||||
"PublicDescription": "The processor's data cache was reloaded from a localtion other than the local core's L3 due to either only demand loads or demand loads plus prefetches if MMCR1[16] is 1"
|
||||
"BriefDescription": "The processor's data cache was reloaded from a location other than the local core's L3 due to either demand loads or data prefetch",
|
||||
"PublicDescription": "The processor's data cache was reloaded from a location other than the local core's L3 due to either only demand loads or demand loads plus prefetches if MMCR1[16] is 1"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x63c042",
|
||||
|
@ -1280,8 +1280,8 @@
|
|||
{
|
||||
"EventCode": "0x51404e",
|
||||
"EventName": "PM_INST_ALL_FROM_L2MISS",
|
||||
"BriefDescription": "The processor's Instruction cache was reloaded from a localtion other than the local core's L2 due to instruction fetches and prefetches",
|
||||
"PublicDescription": "The processor's Instruction cache was reloaded from a localtion other than the local core's L2 due to either an instruction fetch or instruction fetch plus prefetch if MMCR1[17] is 1"
|
||||
"BriefDescription": "The processor's Instruction cache was reloaded from a location other than the local core's L2 due to instruction fetches and prefetches",
|
||||
"PublicDescription": "The processor's Instruction cache was reloaded from a location other than the local core's L2 due to either an instruction fetch or instruction fetch plus prefetch if MMCR1[17] is 1"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x534040",
|
||||
|
@ -1340,8 +1340,8 @@
|
|||
{
|
||||
"EventCode": "0x54404e",
|
||||
"EventName": "PM_INST_ALL_FROM_L3MISS_MOD",
|
||||
"BriefDescription": "The processor's Instruction cache was reloaded from a localtion other than the local core's L3 due to a instruction fetch",
|
||||
"PublicDescription": "The processor's Instruction cache was reloaded from a localtion other than the local core's L3 due to either an instruction fetch or instruction fetch plus prefetch if MMCR1[17] is 1"
|
||||
"BriefDescription": "The processor's Instruction cache was reloaded from a location other than the local core's L3 due to a instruction fetch",
|
||||
"PublicDescription": "The processor's Instruction cache was reloaded from a location other than the local core's L3 due to either an instruction fetch or instruction fetch plus prefetch if MMCR1[17] is 1"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x534042",
|
||||
|
|
|
@ -44,7 +44,7 @@
|
|||
{
|
||||
"EventCode": "0x1e04e",
|
||||
"EventName": "PM_DPTEG_FROM_L2MISS",
|
||||
"BriefDescription": "A Page Table Entry was loaded into the TLB from a localtion other than the local core's L2 due to a data side request",
|
||||
"BriefDescription": "A Page Table Entry was loaded into the TLB from a location other than the local core's L2 due to a data side request",
|
||||
"PublicDescription": ""
|
||||
},
|
||||
{
|
||||
|
|
|
@ -3,35 +3,44 @@
|
|||
"MetricExpr": "(hv_24x7@PM_MCS01_128B_RD_DISP_PORT01\\,chip\\=?@ + hv_24x7@PM_MCS01_128B_RD_DISP_PORT23\\,chip\\=?@ + hv_24x7@PM_MCS23_128B_RD_DISP_PORT01\\,chip\\=?@ + hv_24x7@PM_MCS23_128B_RD_DISP_PORT23\\,chip\\=?@)",
|
||||
"MetricName": "Memory_RD_BW_Chip",
|
||||
"MetricGroup": "Memory_BW",
|
||||
"ScaleUnit": "1.6e-2MB"
|
||||
"ScaleUnit": "1.6e-2MB",
|
||||
"AggregationMode": "PerChip"
|
||||
},
|
||||
{
|
||||
"MetricExpr": "(hv_24x7@PM_MCS01_128B_WR_DISP_PORT01\\,chip\\=?@ + hv_24x7@PM_MCS01_128B_WR_DISP_PORT23\\,chip\\=?@ + hv_24x7@PM_MCS23_128B_WR_DISP_PORT01\\,chip\\=?@ + hv_24x7@PM_MCS23_128B_WR_DISP_PORT23\\,chip\\=?@ )",
|
||||
"MetricName": "Memory_WR_BW_Chip",
|
||||
"MetricGroup": "Memory_BW",
|
||||
"ScaleUnit": "1.6e-2MB"
|
||||
"ScaleUnit": "1.6e-2MB",
|
||||
"AggregationMode": "PerChip"
|
||||
},
|
||||
{
|
||||
"MetricExpr": "(hv_24x7@PM_PB_CYC\\,chip\\=?@ )",
|
||||
"MetricName": "PowerBUS_Frequency",
|
||||
"ScaleUnit": "2.5e-7GHz"
|
||||
"ScaleUnit": "2.5e-7GHz",
|
||||
"AggregationMode": "PerChip"
|
||||
},
|
||||
{
|
||||
"MetricExpr": "(hv_24x7@CPM_CS_32MHZ_CYC\\,domain\\=3\\,core\\=?@ )",
|
||||
"MetricName": "CPM_CS_32MHZ_CYC",
|
||||
"ScaleUnit": "1MHz",
|
||||
"AggregationMode": "PerCore"
|
||||
},
|
||||
{
|
||||
"MetricExpr" : "nest_mcs01_imc@PM_MCS01_128B_RD_DISP_PORT01@ + nest_mcs01_imc@PM_MCS01_128B_RD_DISP_PORT23@",
|
||||
"MetricName" : "mcs01-read",
|
||||
"MetricGroup" : "memory_bw",
|
||||
"MetricGroup" : "memory-bandwidth",
|
||||
"ScaleUnit": "6.1e-5MB"
|
||||
},
|
||||
{
|
||||
"MetricExpr" : "nest_mcs23_imc@PM_MCS23_128B_RD_DISP_PORT01@ + nest_mcs23_imc@PM_MCS23_128B_RD_DISP_PORT23@",
|
||||
"MetricName" : "mcs23-read",
|
||||
"MetricGroup" : "memory_bw",
|
||||
"MetricGroup" : "memory-bandwidth",
|
||||
"ScaleUnit": "6.1e-5MB"
|
||||
},
|
||||
{
|
||||
"MetricExpr" : "nest_mcs01_imc@PM_MCS01_128B_WR_DISP_PORT01@ + nest_mcs01_imc@PM_MCS01_128B_WR_DISP_PORT23@",
|
||||
"MetricName" : "mcs01-write",
|
||||
"MetricGroup" : "memory_bw",
|
||||
"MetricGroup" : "memory-bandwidth",
|
||||
"ScaleUnit": "6.1e-5MB"
|
||||
},
|
||||
{
|
||||
|
@ -48,7 +57,7 @@
|
|||
{
|
||||
"MetricExpr" : "(nest_mcs01_imc@PM_MCS01_128B_RD_DISP_PORT01@ + nest_mcs01_imc@PM_MCS01_128B_RD_DISP_PORT23@ + nest_mcs23_imc@PM_MCS23_128B_RD_DISP_PORT01@ + nest_mcs23_imc@PM_MCS23_128B_RD_DISP_PORT23@ + nest_mcs01_imc@PM_MCS01_128B_WR_DISP_PORT01@ + nest_mcs01_imc@PM_MCS01_128B_WR_DISP_PORT23@ + nest_mcs23_imc@PM_MCS23_128B_WR_DISP_PORT01@ + nest_mcs23_imc@PM_MCS23_128B_WR_DISP_PORT23@)",
|
||||
"MetricName" : "Memory-bandwidth-MCS",
|
||||
"MetricGroup" : "memory_bw",
|
||||
"MetricGroup" : "memory-bandwidth",
|
||||
"ScaleUnit": "6.1e-5MB"
|
||||
}
|
||||
]
|
||||
|
|
|
@ -19,5 +19,10 @@
|
|||
"EventName": "bp_de_redirect",
|
||||
"EventCode": "0x91",
|
||||
"BriefDescription": "Decoder Overrides Existing Branch Prediction (speculative)."
|
||||
},
|
||||
{
|
||||
"EventName": "bp_l1_tlb_fetch_hit",
|
||||
"EventCode": "0x94",
|
||||
"BriefDescription": "The number of instruction fetches that hit in the L1 ITLB."
|
||||
}
|
||||
]
|
||||
|
|
|
@ -117,6 +117,11 @@
|
|||
"BriefDescription": "Miscellaneous events covered in more detail by l2_request_g2 (PMCx061).",
|
||||
"UMask": "0x1"
|
||||
},
|
||||
{
|
||||
"EventName": "l2_request_g1.all_no_prefetch",
|
||||
"EventCode": "0x60",
|
||||
"UMask": "0xf9"
|
||||
},
|
||||
{
|
||||
"EventName": "l2_request_g2.group1",
|
||||
"EventCode": "0x61",
|
||||
|
@ -243,12 +248,48 @@
|
|||
"BriefDescription": "Core to L2 cacheable request access status (not including L2 Prefetch). Instruction cache request miss in L2.",
|
||||
"UMask": "0x1"
|
||||
},
|
||||
{
|
||||
"EventName": "l2_cache_req_stat.ic_access_in_l2",
|
||||
"EventCode": "0x64",
|
||||
"BriefDescription": "Core to L2 cacheable request access status (not including L2 Prefetch). Instruction cache requests in L2.",
|
||||
"UMask": "0x7"
|
||||
},
|
||||
{
|
||||
"EventName": "l2_cache_req_stat.ic_dc_miss_in_l2",
|
||||
"EventCode": "0x64",
|
||||
"BriefDescription": "Core to L2 cacheable request access status (not including L2 Prefetch). Instruction cache request miss in L2 and Data cache request miss in L2 (all types).",
|
||||
"UMask": "0x9"
|
||||
},
|
||||
{
|
||||
"EventName": "l2_cache_req_stat.ic_dc_hit_in_l2",
|
||||
"EventCode": "0x64",
|
||||
"BriefDescription": "Core to L2 cacheable request access status (not including L2 Prefetch). Instruction cache request hit in L2 and Data cache request hit in L2 (all types).",
|
||||
"UMask": "0xf6"
|
||||
},
|
||||
{
|
||||
"EventName": "l2_fill_pending.l2_fill_busy",
|
||||
"EventCode": "0x6d",
|
||||
"BriefDescription": "Cycles with fill pending from L2. Total cycles spent with one or more fill requests in flight from L2.",
|
||||
"UMask": "0x1"
|
||||
},
|
||||
{
|
||||
"EventName": "l2_pf_hit_l2",
|
||||
"EventCode": "0x70",
|
||||
"BriefDescription": "L2 prefetch hit in L2.",
|
||||
"UMask": "0xff"
|
||||
},
|
||||
{
|
||||
"EventName": "l2_pf_miss_l2_hit_l3",
|
||||
"EventCode": "0x71",
|
||||
"BriefDescription": "L2 prefetcher hits in L3. Counts all L2 prefetches accepted by the L2 pipeline which miss the L2 cache and hit the L3.",
|
||||
"UMask": "0xff"
|
||||
},
|
||||
{
|
||||
"EventName": "l2_pf_miss_l2_l3",
|
||||
"EventCode": "0x72",
|
||||
"BriefDescription": "L2 prefetcher misses in L3. All L2 prefetches accepted by the L2 pipeline which miss the L2 and the L3 caches.",
|
||||
"UMask": "0xff"
|
||||
},
|
||||
{
|
||||
"EventName": "l3_request_g1.caching_l3_cache_accesses",
|
||||
"EventCode": "0x01",
|
||||
|
|
|
@ -0,0 +1,98 @@
|
|||
[
|
||||
{
|
||||
"EventName": "remote_outbound_data_controller_0",
|
||||
"PublicDescription": "Remote Link Controller Outbound Packet Types: Data (32B): Remote Link Controller 0",
|
||||
"EventCode": "0x7c7",
|
||||
"UMask": "0x02",
|
||||
"PerPkg": "1",
|
||||
"Unit": "DFPMC"
|
||||
},
|
||||
{
|
||||
"EventName": "remote_outbound_data_controller_1",
|
||||
"PublicDescription": "Remote Link Controller Outbound Packet Types: Data (32B): Remote Link Controller 1",
|
||||
"EventCode": "0x807",
|
||||
"UMask": "0x02",
|
||||
"PerPkg": "1",
|
||||
"Unit": "DFPMC"
|
||||
},
|
||||
{
|
||||
"EventName": "remote_outbound_data_controller_2",
|
||||
"PublicDescription": "Remote Link Controller Outbound Packet Types: Data (32B): Remote Link Controller 2",
|
||||
"EventCode": "0x847",
|
||||
"UMask": "0x02",
|
||||
"PerPkg": "1",
|
||||
"Unit": "DFPMC"
|
||||
},
|
||||
{
|
||||
"EventName": "remote_outbound_data_controller_3",
|
||||
"PublicDescription": "Remote Link Controller Outbound Packet Types: Data (32B): Remote Link Controller 3",
|
||||
"EventCode": "0x887",
|
||||
"UMask": "0x02",
|
||||
"PerPkg": "1",
|
||||
"Unit": "DFPMC"
|
||||
},
|
||||
{
|
||||
"EventName": "dram_channel_data_controller_0",
|
||||
"PublicDescription": "DRAM Channel Controller Request Types: Requests with Data (64B): DRAM Channel Controller 0",
|
||||
"EventCode": "0x07",
|
||||
"UMask": "0x38",
|
||||
"PerPkg": "1",
|
||||
"Unit": "DFPMC"
|
||||
},
|
||||
{
|
||||
"EventName": "dram_channel_data_controller_1",
|
||||
"PublicDescription": "DRAM Channel Controller Request Types: Requests with Data (64B): DRAM Channel Controller 0",
|
||||
"EventCode": "0x47",
|
||||
"UMask": "0x38",
|
||||
"PerPkg": "1",
|
||||
"Unit": "DFPMC"
|
||||
},
|
||||
{
|
||||
"EventName": "dram_channel_data_controller_2",
|
||||
"PublicDescription": "DRAM Channel Controller Request Types: Requests with Data (64B): DRAM Channel Controller 0",
|
||||
"EventCode": "0x87",
|
||||
"UMask": "0x38",
|
||||
"PerPkg": "1",
|
||||
"Unit": "DFPMC"
|
||||
},
|
||||
{
|
||||
"EventName": "dram_channel_data_controller_3",
|
||||
"PublicDescription": "DRAM Channel Controller Request Types: Requests with Data (64B): DRAM Channel Controller 0",
|
||||
"EventCode": "0xc7",
|
||||
"UMask": "0x38",
|
||||
"PerPkg": "1",
|
||||
"Unit": "DFPMC"
|
||||
},
|
||||
{
|
||||
"EventName": "dram_channel_data_controller_4",
|
||||
"PublicDescription": "DRAM Channel Controller Request Types: Requests with Data (64B): DRAM Channel Controller 0",
|
||||
"EventCode": "0x107",
|
||||
"UMask": "0x38",
|
||||
"PerPkg": "1",
|
||||
"Unit": "DFPMC"
|
||||
},
|
||||
{
|
||||
"EventName": "dram_channel_data_controller_5",
|
||||
"PublicDescription": "DRAM Channel Controller Request Types: Requests with Data (64B): DRAM Channel Controller 0",
|
||||
"EventCode": "0x147",
|
||||
"UMask": "0x38",
|
||||
"PerPkg": "1",
|
||||
"Unit": "DFPMC"
|
||||
},
|
||||
{
|
||||
"EventName": "dram_channel_data_controller_6",
|
||||
"PublicDescription": "DRAM Channel Controller Request Types: Requests with Data (64B): DRAM Channel Controller 0",
|
||||
"EventCode": "0x187",
|
||||
"UMask": "0x38",
|
||||
"PerPkg": "1",
|
||||
"Unit": "DFPMC"
|
||||
},
|
||||
{
|
||||
"EventName": "dram_channel_data_controller_7",
|
||||
"PublicDescription": "DRAM Channel Controller Request Types: Requests with Data (64B): DRAM Channel Controller 0",
|
||||
"EventCode": "0x1c7",
|
||||
"UMask": "0x38",
|
||||
"PerPkg": "1",
|
||||
"Unit": "DFPMC"
|
||||
}
|
||||
]
|
|
@ -0,0 +1,178 @@
|
|||
[
|
||||
{
|
||||
"MetricName": "branch_misprediction_ratio",
|
||||
"BriefDescription": "Execution-Time Branch Misprediction Ratio (Non-Speculative)",
|
||||
"MetricExpr": "d_ratio(ex_ret_brn_misp, ex_ret_brn)",
|
||||
"MetricGroup": "branch_prediction",
|
||||
"ScaleUnit": "100%"
|
||||
},
|
||||
{
|
||||
"EventName": "all_dc_accesses",
|
||||
"EventCode": "0x29",
|
||||
"BriefDescription": "All L1 Data Cache Accesses",
|
||||
"UMask": "0x7"
|
||||
},
|
||||
{
|
||||
"MetricName": "all_l2_cache_accesses",
|
||||
"BriefDescription": "All L2 Cache Accesses",
|
||||
"MetricExpr": "l2_request_g1.all_no_prefetch + l2_pf_hit_l2 + l2_pf_miss_l2_hit_l3 + l2_pf_miss_l2_l3",
|
||||
"MetricGroup": "l2_cache"
|
||||
},
|
||||
{
|
||||
"EventName": "l2_cache_accesses_from_ic_misses",
|
||||
"EventCode": "0x60",
|
||||
"BriefDescription": "L2 Cache Accesses from L1 Instruction Cache Misses (including prefetch)",
|
||||
"UMask": "0x10"
|
||||
},
|
||||
{
|
||||
"EventName": "l2_cache_accesses_from_dc_misses",
|
||||
"EventCode": "0x60",
|
||||
"BriefDescription": "L2 Cache Accesses from L1 Data Cache Misses (including prefetch)",
|
||||
"UMask": "0xc8"
|
||||
},
|
||||
{
|
||||
"MetricName": "l2_cache_accesses_from_l2_hwpf",
|
||||
"BriefDescription": "L2 Cache Accesses from L2 HWPF",
|
||||
"MetricExpr": "l2_pf_hit_l2 + l2_pf_miss_l2_hit_l3 + l2_pf_miss_l2_l3",
|
||||
"MetricGroup": "l2_cache"
|
||||
},
|
||||
{
|
||||
"MetricName": "all_l2_cache_misses",
|
||||
"BriefDescription": "All L2 Cache Misses",
|
||||
"MetricExpr": "l2_cache_req_stat.ic_dc_miss_in_l2 + l2_pf_miss_l2_hit_l3 + l2_pf_miss_l2_l3",
|
||||
"MetricGroup": "l2_cache"
|
||||
},
|
||||
{
|
||||
"EventName": "l2_cache_misses_from_ic_miss",
|
||||
"EventCode": "0x64",
|
||||
"BriefDescription": "L2 Cache Misses from L1 Instruction Cache Misses",
|
||||
"UMask": "0x01"
|
||||
},
|
||||
{
|
||||
"EventName": "l2_cache_misses_from_dc_misses",
|
||||
"EventCode": "0x64",
|
||||
"BriefDescription": "L2 Cache Misses from L1 Data Cache Misses",
|
||||
"UMask": "0x08"
|
||||
},
|
||||
{
|
||||
"MetricName": "l2_cache_misses_from_l2_hwpf",
|
||||
"BriefDescription": "L2 Cache Misses from L2 HWPF",
|
||||
"MetricExpr": "l2_pf_miss_l2_hit_l3 + l2_pf_miss_l2_l3",
|
||||
"MetricGroup": "l2_cache"
|
||||
},
|
||||
{
|
||||
"MetricName": "all_l2_cache_hits",
|
||||
"BriefDescription": "All L2 Cache Hits",
|
||||
"MetricExpr": "l2_cache_req_stat.ic_dc_hit_in_l2 + l2_pf_hit_l2",
|
||||
"MetricGroup": "l2_cache"
|
||||
},
|
||||
{
|
||||
"EventName": "l2_cache_hits_from_ic_misses",
|
||||
"EventCode": "0x64",
|
||||
"BriefDescription": "L2 Cache Hits from L1 Instruction Cache Misses",
|
||||
"UMask": "0x06"
|
||||
},
|
||||
{
|
||||
"EventName": "l2_cache_hits_from_dc_misses",
|
||||
"EventCode": "0x64",
|
||||
"BriefDescription": "L2 Cache Hits from L1 Data Cache Misses",
|
||||
"UMask": "0x70"
|
||||
},
|
||||
{
|
||||
"MetricName": "l2_cache_hits_from_l2_hwpf",
|
||||
"BriefDescription": "L2 Cache Hits from L2 HWPF",
|
||||
"MetricExpr": "l2_pf_hit_l2 + l2_pf_miss_l2_hit_l3 + l2_pf_miss_l2_l3",
|
||||
"MetricGroup": "l2_cache"
|
||||
},
|
||||
{
|
||||
"EventName": "l3_accesses",
|
||||
"EventCode": "0x04",
|
||||
"BriefDescription": "L3 Accesses",
|
||||
"UMask": "0xff",
|
||||
"Unit": "L3PMC"
|
||||
},
|
||||
{
|
||||
"EventName": "l3_misses",
|
||||
"EventCode": "0x04",
|
||||
"BriefDescription": "L3 Misses (includes Chg2X)",
|
||||
"UMask": "0x01",
|
||||
"Unit": "L3PMC"
|
||||
},
|
||||
{
|
||||
"MetricName": "l3_read_miss_latency",
|
||||
"BriefDescription": "Average L3 Read Miss Latency (in core clocks)",
|
||||
"MetricExpr": "(xi_sys_fill_latency * 16) / xi_ccx_sdp_req1.all_l3_miss_req_typs",
|
||||
"MetricGroup": "l3_cache",
|
||||
"ScaleUnit": "1core clocks"
|
||||
},
|
||||
{
|
||||
"MetricName": "ic_fetch_miss_ratio",
|
||||
"BriefDescription": "L1 Instruction Cache (32B) Fetch Miss Ratio",
|
||||
"MetricExpr": "d_ratio(l2_cache_req_stat.ic_access_in_l2, bp_l1_tlb_fetch_hit + bp_l1_tlb_miss_l2_hit + bp_l1_tlb_miss_l2_miss)",
|
||||
"MetricGroup": "l2_cache",
|
||||
"ScaleUnit": "100%"
|
||||
},
|
||||
{
|
||||
"MetricName": "l1_itlb_misses",
|
||||
"BriefDescription": "L1 ITLB Misses",
|
||||
"MetricExpr": "bp_l1_tlb_miss_l2_hit + bp_l1_tlb_miss_l2_miss",
|
||||
"MetricGroup": "tlb"
|
||||
},
|
||||
{
|
||||
"EventName": "l2_itlb_misses",
|
||||
"EventCode": "0x85",
|
||||
"BriefDescription": "L2 ITLB Misses & Instruction page walks",
|
||||
"UMask": "0x07"
|
||||
},
|
||||
{
|
||||
"EventName": "l1_dtlb_misses",
|
||||
"EventCode": "0x45",
|
||||
"BriefDescription": "L1 DTLB Misses",
|
||||
"UMask": "0xff"
|
||||
},
|
||||
{
|
||||
"EventName": "l2_dtlb_misses",
|
||||
"EventCode": "0x45",
|
||||
"BriefDescription": "L2 DTLB Misses & Data page walks",
|
||||
"UMask": "0xf0"
|
||||
},
|
||||
{
|
||||
"EventName": "all_tlbs_flushed",
|
||||
"EventCode": "0x78",
|
||||
"BriefDescription": "All TLBs Flushed",
|
||||
"UMask": "0xdf"
|
||||
},
|
||||
{
|
||||
"EventName": "uops_dispatched",
|
||||
"EventCode": "0xaa",
|
||||
"BriefDescription": "Micro-ops Dispatched",
|
||||
"UMask": "0x03"
|
||||
},
|
||||
{
|
||||
"EventName": "sse_avx_stalls",
|
||||
"EventCode": "0x0e",
|
||||
"BriefDescription": "Mixed SSE/AVX Stalls",
|
||||
"UMask": "0x0e"
|
||||
},
|
||||
{
|
||||
"EventName": "uops_retired",
|
||||
"EventCode": "0xc1",
|
||||
"BriefDescription": "Micro-ops Retired"
|
||||
},
|
||||
{
|
||||
"MetricName": "all_remote_links_outbound",
|
||||
"BriefDescription": "Approximate: Outbound data bytes for all Remote Links for a node (die)",
|
||||
"MetricExpr": "remote_outbound_data_controller_0 + remote_outbound_data_controller_1 + remote_outbound_data_controller_2 + remote_outbound_data_controller_3",
|
||||
"MetricGroup": "data_fabric",
|
||||
"PerPkg": "1",
|
||||
"ScaleUnit": "3e-5MiB"
|
||||
},
|
||||
{
|
||||
"MetricName": "nps1_die_to_dram",
|
||||
"BriefDescription": "Approximate: Combined DRAM B/bytes of all channels on a NPS1 node (die) (may need --metric-no-group)",
|
||||
"MetricExpr": "dram_channel_data_controller_0 + dram_channel_data_controller_1 + dram_channel_data_controller_2 + dram_channel_data_controller_3 + dram_channel_data_controller_4 + dram_channel_data_controller_5 + dram_channel_data_controller_6 + dram_channel_data_controller_7",
|
||||
"MetricGroup": "data_fabric",
|
||||
"PerPkg": "1",
|
||||
"ScaleUnit": "6.1e-5MiB"
|
||||
}
|
||||
]
|
|
@ -47,6 +47,11 @@
|
|||
"BriefDescription": "Miscellaneous events covered in more detail by l2_request_g2 (PMCx061).",
|
||||
"UMask": "0x1"
|
||||
},
|
||||
{
|
||||
"EventName": "l2_request_g1.all_no_prefetch",
|
||||
"EventCode": "0x60",
|
||||
"UMask": "0xf9"
|
||||
},
|
||||
{
|
||||
"EventName": "l2_request_g2.group1",
|
||||
"EventCode": "0x61",
|
||||
|
@ -173,6 +178,24 @@
|
|||
"BriefDescription": "Core to L2 cacheable request access status (not including L2 Prefetch). Instruction cache request miss in L2.",
|
||||
"UMask": "0x1"
|
||||
},
|
||||
{
|
||||
"EventName": "l2_cache_req_stat.ic_access_in_l2",
|
||||
"EventCode": "0x64",
|
||||
"BriefDescription": "Core to L2 cacheable request access status (not including L2 Prefetch). Instruction cache requests in L2.",
|
||||
"UMask": "0x7"
|
||||
},
|
||||
{
|
||||
"EventName": "l2_cache_req_stat.ic_dc_miss_in_l2",
|
||||
"EventCode": "0x64",
|
||||
"BriefDescription": "Core to L2 cacheable request access status (not including L2 Prefetch). Instruction cache request miss in L2 and Data cache request miss in L2 (all types).",
|
||||
"UMask": "0x9"
|
||||
},
|
||||
{
|
||||
"EventName": "l2_cache_req_stat.ic_dc_hit_in_l2",
|
||||
"EventCode": "0x64",
|
||||
"BriefDescription": "Core to L2 cacheable request access status (not including L2 Prefetch). Instruction cache request hit in L2 and Data cache request hit in L2 (all types).",
|
||||
"UMask": "0xf6"
|
||||
},
|
||||
{
|
||||
"EventName": "l2_fill_pending.l2_fill_busy",
|
||||
"EventCode": "0x6d",
|
||||
|
|
|
@ -0,0 +1,98 @@
|
|||
[
|
||||
{
|
||||
"EventName": "remote_outbound_data_controller_0",
|
||||
"PublicDescription": "Remote Link Controller Outbound Packet Types: Data (32B): Remote Link Controller 0",
|
||||
"EventCode": "0x7c7",
|
||||
"UMask": "0x02",
|
||||
"PerPkg": "1",
|
||||
"Unit": "DFPMC"
|
||||
},
|
||||
{
|
||||
"EventName": "remote_outbound_data_controller_1",
|
||||
"PublicDescription": "Remote Link Controller Outbound Packet Types: Data (32B): Remote Link Controller 1",
|
||||
"EventCode": "0x807",
|
||||
"UMask": "0x02",
|
||||
"PerPkg": "1",
|
||||
"Unit": "DFPMC"
|
||||
},
|
||||
{
|
||||
"EventName": "remote_outbound_data_controller_2",
|
||||
"PublicDescription": "Remote Link Controller Outbound Packet Types: Data (32B): Remote Link Controller 2",
|
||||
"EventCode": "0x847",
|
||||
"UMask": "0x02",
|
||||
"PerPkg": "1",
|
||||
"Unit": "DFPMC"
|
||||
},
|
||||
{
|
||||
"EventName": "remote_outbound_data_controller_3",
|
||||
"PublicDescription": "Remote Link Controller Outbound Packet Types: Data (32B): Remote Link Controller 3",
|
||||
"EventCode": "0x887",
|
||||
"UMask": "0x02",
|
||||
"PerPkg": "1",
|
||||
"Unit": "DFPMC"
|
||||
},
|
||||
{
|
||||
"EventName": "dram_channel_data_controller_0",
|
||||
"PublicDescription": "DRAM Channel Controller Request Types: Requests with Data (64B): DRAM Channel Controller 0",
|
||||
"EventCode": "0x07",
|
||||
"UMask": "0x38",
|
||||
"PerPkg": "1",
|
||||
"Unit": "DFPMC"
|
||||
},
|
||||
{
|
||||
"EventName": "dram_channel_data_controller_1",
|
||||
"PublicDescription": "DRAM Channel Controller Request Types: Requests with Data (64B): DRAM Channel Controller 0",
|
||||
"EventCode": "0x47",
|
||||
"UMask": "0x38",
|
||||
"PerPkg": "1",
|
||||
"Unit": "DFPMC"
|
||||
},
|
||||
{
|
||||
"EventName": "dram_channel_data_controller_2",
|
||||
"PublicDescription": "DRAM Channel Controller Request Types: Requests with Data (64B): DRAM Channel Controller 0",
|
||||
"EventCode": "0x87",
|
||||
"UMask": "0x38",
|
||||
"PerPkg": "1",
|
||||
"Unit": "DFPMC"
|
||||
},
|
||||
{
|
||||
"EventName": "dram_channel_data_controller_3",
|
||||
"PublicDescription": "DRAM Channel Controller Request Types: Requests with Data (64B): DRAM Channel Controller 0",
|
||||
"EventCode": "0xc7",
|
||||
"UMask": "0x38",
|
||||
"PerPkg": "1",
|
||||
"Unit": "DFPMC"
|
||||
},
|
||||
{
|
||||
"EventName": "dram_channel_data_controller_4",
|
||||
"PublicDescription": "DRAM Channel Controller Request Types: Requests with Data (64B): DRAM Channel Controller 0",
|
||||
"EventCode": "0x107",
|
||||
"UMask": "0x38",
|
||||
"PerPkg": "1",
|
||||
"Unit": "DFPMC"
|
||||
},
|
||||
{
|
||||
"EventName": "dram_channel_data_controller_5",
|
||||
"PublicDescription": "DRAM Channel Controller Request Types: Requests with Data (64B): DRAM Channel Controller 0",
|
||||
"EventCode": "0x147",
|
||||
"UMask": "0x38",
|
||||
"PerPkg": "1",
|
||||
"Unit": "DFPMC"
|
||||
},
|
||||
{
|
||||
"EventName": "dram_channel_data_controller_6",
|
||||
"PublicDescription": "DRAM Channel Controller Request Types: Requests with Data (64B): DRAM Channel Controller 0",
|
||||
"EventCode": "0x187",
|
||||
"UMask": "0x38",
|
||||
"PerPkg": "1",
|
||||
"Unit": "DFPMC"
|
||||
},
|
||||
{
|
||||
"EventName": "dram_channel_data_controller_7",
|
||||
"PublicDescription": "DRAM Channel Controller Request Types: Requests with Data (64B): DRAM Channel Controller 0",
|
||||
"EventCode": "0x1c7",
|
||||
"UMask": "0x38",
|
||||
"PerPkg": "1",
|
||||
"Unit": "DFPMC"
|
||||
}
|
||||
]
|
|
@ -0,0 +1,178 @@
|
|||
[
|
||||
{
|
||||
"MetricName": "branch_misprediction_ratio",
|
||||
"BriefDescription": "Execution-Time Branch Misprediction Ratio (Non-Speculative)",
|
||||
"MetricExpr": "d_ratio(ex_ret_brn_misp, ex_ret_brn)",
|
||||
"MetricGroup": "branch_prediction",
|
||||
"ScaleUnit": "100%"
|
||||
},
|
||||
{
|
||||
"EventName": "all_dc_accesses",
|
||||
"EventCode": "0x29",
|
||||
"BriefDescription": "All L1 Data Cache Accesses",
|
||||
"UMask": "0x7"
|
||||
},
|
||||
{
|
||||
"MetricName": "all_l2_cache_accesses",
|
||||
"BriefDescription": "All L2 Cache Accesses",
|
||||
"MetricExpr": "l2_request_g1.all_no_prefetch + l2_pf_hit_l2 + l2_pf_miss_l2_hit_l3 + l2_pf_miss_l2_l3",
|
||||
"MetricGroup": "l2_cache"
|
||||
},
|
||||
{
|
||||
"EventName": "l2_cache_accesses_from_ic_misses",
|
||||
"EventCode": "0x60",
|
||||
"BriefDescription": "L2 Cache Accesses from L1 Instruction Cache Misses (including prefetch)",
|
||||
"UMask": "0x10"
|
||||
},
|
||||
{
|
||||
"EventName": "l2_cache_accesses_from_dc_misses",
|
||||
"EventCode": "0x60",
|
||||
"BriefDescription": "L2 Cache Accesses from L1 Data Cache Misses (including prefetch)",
|
||||
"UMask": "0xc8"
|
||||
},
|
||||
{
|
||||
"MetricName": "l2_cache_accesses_from_l2_hwpf",
|
||||
"BriefDescription": "L2 Cache Accesses from L2 HWPF",
|
||||
"MetricExpr": "l2_pf_hit_l2 + l2_pf_miss_l2_hit_l3 + l2_pf_miss_l2_l3",
|
||||
"MetricGroup": "l2_cache"
|
||||
},
|
||||
{
|
||||
"MetricName": "all_l2_cache_misses",
|
||||
"BriefDescription": "All L2 Cache Misses",
|
||||
"MetricExpr": "l2_cache_req_stat.ic_dc_miss_in_l2 + l2_pf_miss_l2_hit_l3 + l2_pf_miss_l2_l3",
|
||||
"MetricGroup": "l2_cache"
|
||||
},
|
||||
{
|
||||
"EventName": "l2_cache_misses_from_ic_miss",
|
||||
"EventCode": "0x64",
|
||||
"BriefDescription": "L2 Cache Misses from L1 Instruction Cache Misses",
|
||||
"UMask": "0x01"
|
||||
},
|
||||
{
|
||||
"EventName": "l2_cache_misses_from_dc_misses",
|
||||
"EventCode": "0x64",
|
||||
"BriefDescription": "L2 Cache Misses from L1 Data Cache Misses",
|
||||
"UMask": "0x08"
|
||||
},
|
||||
{
|
||||
"MetricName": "l2_cache_misses_from_l2_hwpf",
|
||||
"BriefDescription": "L2 Cache Misses from L2 HWPF",
|
||||
"MetricExpr": "l2_pf_miss_l2_hit_l3 + l2_pf_miss_l2_l3",
|
||||
"MetricGroup": "l2_cache"
|
||||
},
|
||||
{
|
||||
"MetricName": "all_l2_cache_hits",
|
||||
"BriefDescription": "All L2 Cache Hits",
|
||||
"MetricExpr": "l2_cache_req_stat.ic_dc_hit_in_l2 + l2_pf_hit_l2",
|
||||
"MetricGroup": "l2_cache"
|
||||
},
|
||||
{
|
||||
"EventName": "l2_cache_hits_from_ic_misses",
|
||||
"EventCode": "0x64",
|
||||
"BriefDescription": "L2 Cache Hits from L1 Instruction Cache Misses",
|
||||
"UMask": "0x06"
|
||||
},
|
||||
{
|
||||
"EventName": "l2_cache_hits_from_dc_misses",
|
||||
"EventCode": "0x64",
|
||||
"BriefDescription": "L2 Cache Hits from L1 Data Cache Misses",
|
||||
"UMask": "0x70"
|
||||
},
|
||||
{
|
||||
"MetricName": "l2_cache_hits_from_l2_hwpf",
|
||||
"BriefDescription": "L2 Cache Hits from L2 HWPF",
|
||||
"MetricExpr": "l2_pf_hit_l2 + l2_pf_miss_l2_hit_l3 + l2_pf_miss_l2_l3",
|
||||
"MetricGroup": "l2_cache"
|
||||
},
|
||||
{
|
||||
"EventName": "l3_accesses",
|
||||
"EventCode": "0x04",
|
||||
"BriefDescription": "L3 Accesses",
|
||||
"UMask": "0xff",
|
||||
"Unit": "L3PMC"
|
||||
},
|
||||
{
|
||||
"EventName": "l3_misses",
|
||||
"EventCode": "0x04",
|
||||
"BriefDescription": "L3 Misses (includes Chg2X)",
|
||||
"UMask": "0x01",
|
||||
"Unit": "L3PMC"
|
||||
},
|
||||
{
|
||||
"MetricName": "l3_read_miss_latency",
|
||||
"BriefDescription": "Average L3 Read Miss Latency (in core clocks)",
|
||||
"MetricExpr": "(xi_sys_fill_latency * 16) / xi_ccx_sdp_req1.all_l3_miss_req_typs",
|
||||
"MetricGroup": "l3_cache",
|
||||
"ScaleUnit": "1core clocks"
|
||||
},
|
||||
{
|
||||
"MetricName": "ic_fetch_miss_ratio",
|
||||
"BriefDescription": "L1 Instruction Cache (32B) Fetch Miss Ratio",
|
||||
"MetricExpr": "d_ratio(l2_cache_req_stat.ic_access_in_l2, bp_l1_tlb_fetch_hit + bp_l1_tlb_miss_l2_hit + bp_l1_tlb_miss_l2_tlb_miss)",
|
||||
"MetricGroup": "l2_cache",
|
||||
"ScaleUnit": "100%"
|
||||
},
|
||||
{
|
||||
"MetricName": "l1_itlb_misses",
|
||||
"BriefDescription": "L1 ITLB Misses",
|
||||
"MetricExpr": "bp_l1_tlb_miss_l2_hit + bp_l1_tlb_miss_l2_tlb_miss",
|
||||
"MetricGroup": "tlb"
|
||||
},
|
||||
{
|
||||
"EventName": "l2_itlb_misses",
|
||||
"EventCode": "0x85",
|
||||
"BriefDescription": "L2 ITLB Misses & Instruction page walks",
|
||||
"UMask": "0x07"
|
||||
},
|
||||
{
|
||||
"EventName": "l1_dtlb_misses",
|
||||
"EventCode": "0x45",
|
||||
"BriefDescription": "L1 DTLB Misses",
|
||||
"UMask": "0xff"
|
||||
},
|
||||
{
|
||||
"EventName": "l2_dtlb_misses",
|
||||
"EventCode": "0x45",
|
||||
"BriefDescription": "L2 DTLB Misses & Data page walks",
|
||||
"UMask": "0xf0"
|
||||
},
|
||||
{
|
||||
"EventName": "all_tlbs_flushed",
|
||||
"EventCode": "0x78",
|
||||
"BriefDescription": "All TLBs Flushed",
|
||||
"UMask": "0xdf"
|
||||
},
|
||||
{
|
||||
"EventName": "uops_dispatched",
|
||||
"EventCode": "0xaa",
|
||||
"BriefDescription": "Micro-ops Dispatched",
|
||||
"UMask": "0x03"
|
||||
},
|
||||
{
|
||||
"EventName": "sse_avx_stalls",
|
||||
"EventCode": "0x0e",
|
||||
"BriefDescription": "Mixed SSE/AVX Stalls",
|
||||
"UMask": "0x0e"
|
||||
},
|
||||
{
|
||||
"EventName": "uops_retired",
|
||||
"EventCode": "0xc1",
|
||||
"BriefDescription": "Micro-ops Retired"
|
||||
},
|
||||
{
|
||||
"MetricName": "all_remote_links_outbound",
|
||||
"BriefDescription": "Approximate: Outbound data bytes for all Remote Links for a node (die)",
|
||||
"MetricExpr": "remote_outbound_data_controller_0 + remote_outbound_data_controller_1 + remote_outbound_data_controller_2 + remote_outbound_data_controller_3",
|
||||
"MetricGroup": "data_fabric",
|
||||
"PerPkg": "1",
|
||||
"ScaleUnit": "3e-5MiB"
|
||||
},
|
||||
{
|
||||
"MetricName": "nps1_die_to_dram",
|
||||
"BriefDescription": "Approximate: Combined DRAM B/bytes of all channels on a NPS1 node (die) (may need --metric-no-group)",
|
||||
"MetricExpr": "dram_channel_data_controller_0 + dram_channel_data_controller_1 + dram_channel_data_controller_2 + dram_channel_data_controller_3 + dram_channel_data_controller_4 + dram_channel_data_controller_5 + dram_channel_data_controller_6 + dram_channel_data_controller_7",
|
||||
"MetricGroup": "data_fabric",
|
||||
"PerPkg": "1",
|
||||
"ScaleUnit": "6.1e-5MiB"
|
||||
}
|
||||
]
|
|
@ -8063,6 +8063,20 @@
|
|||
"SampleAfterValue": "100003",
|
||||
"UMask": "0x1"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "This event is deprecated. Refer to new event OCR.DEMAND_CODE_RD.SUPPLIER_NONE.HITM_OTHER_CORE",
|
||||
"Counter": "0,1,2,3",
|
||||
"CounterHTOff": "0,1,2,3",
|
||||
"Deprecated": "1",
|
||||
"EventCode": "0xB7, 0xBB",
|
||||
"EventName": "OFFCORE_RESPONSE.DEMAND_CODE_RD.SUPPLIER_NONE.HITM_OTHER_CORE",
|
||||
"MSRIndex": "0x1a6,0x1a7",
|
||||
"MSRValue": "0x1000020004",
|
||||
"Offcore": "1",
|
||||
"PublicDescription": "Offcore response can be programmed only with a specific pair of event select and counter MSR, and with specific event codes and predefine mask bit value in a dedicated MSR to specify attributes of the offcore transaction.",
|
||||
"SampleAfterValue": "100003",
|
||||
"UMask": "0x1"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "This event is deprecated. Refer to new event OCR.ALL_PF_DATA_RD.L3_HIT_S.HIT_OTHER_CORE_NO_FWD",
|
||||
"Counter": "0,1,2,3",
|
||||
|
@ -9255,20 +9269,6 @@
|
|||
"SampleAfterValue": "100003",
|
||||
"UMask": "0x1"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "This event is deprecated. Refer to new event OCR.DEMAND_CODE_RD.SUPPLIER_NONE.HITM_OTHER_CORE",
|
||||
"Counter": "0,1,2,3",
|
||||
"CounterHTOff": "0,1,2,3",
|
||||
"Deprecated": "1",
|
||||
"EventCode": "0xB7, 0xBB",
|
||||
"EventName": "OFFCORE_RESPONSE.DEMAND_CODE_RD.SUPPLIER_NONE.HITM_OTHER_CORE",
|
||||
"MSRIndex": "0x1a6,0x1a7",
|
||||
"MSRValue": "0x1000020004",
|
||||
"Offcore": "1",
|
||||
"PublicDescription": "Offcore response can be programmed only with a specific pair of event select and counter MSR, and with specific event codes and predefine mask bit value in a dedicated MSR to specify attributes of the offcore transaction.",
|
||||
"SampleAfterValue": "100003",
|
||||
"UMask": "0x1"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "This event is deprecated. Refer to new event OCR.ALL_PF_RFO.SUPPLIER_NONE.HITM_OTHER_CORE",
|
||||
"Counter": "0,1,2,3",
|
||||
|
|
|
@ -4,14 +4,14 @@
|
|||
"MetricExpr": "IDQ_UOPS_NOT_DELIVERED.CORE / (4 * cycles)",
|
||||
"MetricGroup": "TopdownL1",
|
||||
"MetricName": "Frontend_Bound",
|
||||
"PublicDescription": "This category represents fraction of slots where the processor's Frontend undersupplies its Backend. Frontend denotes the first part of the processor core responsible to fetch operations that are executed later on by the Backend part. Within the Frontend; a branch predictor predicts the next address to fetch; cache-lines are fetched from the memory subsystem; parsed into instructions; and lastly decoded into micro-ops (uops). Ideally the Frontend can issue 4 uops every cycle to the Backend. Frontend Bound denotes unutilized issue-slots when there is no Backend stall; i.e. bubbles where Frontend delivered no uops while Backend could have accepted them. For example; stalls due to instruction-cache misses would be categorized under Frontend Bound."
|
||||
"PublicDescription": "This category represents fraction of slots where the processor's Frontend undersupplies its Backend. Frontend denotes the first part of the processor core responsible to fetch operations that are executed later on by the Backend part. Within the Frontend; a branch predictor predicts the next address to fetch; cache-lines are fetched from the memory subsystem; parsed into instructions; and lastly decoded into micro-operations (uops). Ideally the Frontend can issue Machine_Width uops every cycle to the Backend. Frontend Bound denotes unutilized issue-slots when there is no Backend stall; i.e. bubbles where Frontend delivered no uops while Backend could have accepted them. For example; stalls due to instruction-cache misses would be categorized under Frontend Bound."
|
||||
},
|
||||
{
|
||||
"BriefDescription": "This category represents fraction of slots where the processor's Frontend undersupplies its Backend. SMT version; use when SMT is enabled and measuring per logical CPU.",
|
||||
"MetricExpr": "IDQ_UOPS_NOT_DELIVERED.CORE / (4 * (( ( CPU_CLK_UNHALTED.THREAD / 2 ) * ( 1 + CPU_CLK_UNHALTED.ONE_THREAD_ACTIVE / CPU_CLK_UNHALTED.REF_XCLK ) )))",
|
||||
"MetricExpr": "IDQ_UOPS_NOT_DELIVERED.CORE / (4 * ( ( CPU_CLK_UNHALTED.THREAD / 2 ) * ( 1 + CPU_CLK_UNHALTED.ONE_THREAD_ACTIVE / CPU_CLK_UNHALTED.REF_XCLK ) ))",
|
||||
"MetricGroup": "TopdownL1_SMT",
|
||||
"MetricName": "Frontend_Bound_SMT",
|
||||
"PublicDescription": "This category represents fraction of slots where the processor's Frontend undersupplies its Backend. Frontend denotes the first part of the processor core responsible to fetch operations that are executed later on by the Backend part. Within the Frontend; a branch predictor predicts the next address to fetch; cache-lines are fetched from the memory subsystem; parsed into instructions; and lastly decoded into micro-ops (uops). Ideally the Frontend can issue 4 uops every cycle to the Backend. Frontend Bound denotes unutilized issue-slots when there is no Backend stall; i.e. bubbles where Frontend delivered no uops while Backend could have accepted them. For example; stalls due to instruction-cache misses would be categorized under Frontend Bound. SMT version; use when SMT is enabled and measuring per logical CPU."
|
||||
"PublicDescription": "This category represents fraction of slots where the processor's Frontend undersupplies its Backend. Frontend denotes the first part of the processor core responsible to fetch operations that are executed later on by the Backend part. Within the Frontend; a branch predictor predicts the next address to fetch; cache-lines are fetched from the memory subsystem; parsed into instructions; and lastly decoded into micro-operations (uops). Ideally the Frontend can issue Machine_Width uops every cycle to the Backend. Frontend Bound denotes unutilized issue-slots when there is no Backend stall; i.e. bubbles where Frontend delivered no uops while Backend could have accepted them. For example; stalls due to instruction-cache misses would be categorized under Frontend Bound. SMT version; use when SMT is enabled and measuring per logical CPU."
|
||||
},
|
||||
{
|
||||
"BriefDescription": "This category represents fraction of slots wasted due to incorrect speculations",
|
||||
|
@ -22,13 +22,14 @@
|
|||
},
|
||||
{
|
||||
"BriefDescription": "This category represents fraction of slots wasted due to incorrect speculations. SMT version; use when SMT is enabled and measuring per logical CPU.",
|
||||
"MetricExpr": "( UOPS_ISSUED.ANY - UOPS_RETIRED.RETIRE_SLOTS + 4 * (( INT_MISC.RECOVERY_CYCLES_ANY / 2 )) ) / (4 * (( ( CPU_CLK_UNHALTED.THREAD / 2 ) * ( 1 + CPU_CLK_UNHALTED.ONE_THREAD_ACTIVE / CPU_CLK_UNHALTED.REF_XCLK ) )))",
|
||||
"MetricExpr": "( UOPS_ISSUED.ANY - UOPS_RETIRED.RETIRE_SLOTS + 4 * ( INT_MISC.RECOVERY_CYCLES_ANY / 2 ) ) / (4 * ( ( CPU_CLK_UNHALTED.THREAD / 2 ) * ( 1 + CPU_CLK_UNHALTED.ONE_THREAD_ACTIVE / CPU_CLK_UNHALTED.REF_XCLK ) ))",
|
||||
"MetricGroup": "TopdownL1_SMT",
|
||||
"MetricName": "Bad_Speculation_SMT",
|
||||
"PublicDescription": "This category represents fraction of slots wasted due to incorrect speculations. This include slots used to issue uops that do not eventually get retired and slots for which the issue-pipeline was blocked due to recovery from earlier incorrect speculation. For example; wasted work due to miss-predicted branches are categorized under Bad Speculation category. Incorrect data speculation followed by Memory Ordering Nukes is another example. SMT version; use when SMT is enabled and measuring per logical CPU."
|
||||
},
|
||||
{
|
||||
"BriefDescription": "This category represents fraction of slots where no uops are being delivered due to a lack of required resources for accepting new uops in the Backend",
|
||||
"MetricConstraint": "NO_NMI_WATCHDOG",
|
||||
"MetricExpr": "1 - ( (IDQ_UOPS_NOT_DELIVERED.CORE / (4 * cycles)) + (( UOPS_ISSUED.ANY - UOPS_RETIRED.RETIRE_SLOTS + 4 * INT_MISC.RECOVERY_CYCLES ) / (4 * cycles)) + (UOPS_RETIRED.RETIRE_SLOTS / (4 * cycles)) )",
|
||||
"MetricGroup": "TopdownL1",
|
||||
"MetricName": "Backend_Bound",
|
||||
|
@ -36,7 +37,7 @@
|
|||
},
|
||||
{
|
||||
"BriefDescription": "This category represents fraction of slots where no uops are being delivered due to a lack of required resources for accepting new uops in the Backend. SMT version; use when SMT is enabled and measuring per logical CPU.",
|
||||
"MetricExpr": "1 - ( (IDQ_UOPS_NOT_DELIVERED.CORE / (4 * (( ( CPU_CLK_UNHALTED.THREAD / 2 ) * ( 1 + CPU_CLK_UNHALTED.ONE_THREAD_ACTIVE / CPU_CLK_UNHALTED.REF_XCLK ) )))) + (( UOPS_ISSUED.ANY - UOPS_RETIRED.RETIRE_SLOTS + 4 * (( INT_MISC.RECOVERY_CYCLES_ANY / 2 )) ) / (4 * (( ( CPU_CLK_UNHALTED.THREAD / 2 ) * ( 1 + CPU_CLK_UNHALTED.ONE_THREAD_ACTIVE / CPU_CLK_UNHALTED.REF_XCLK ) )))) + (UOPS_RETIRED.RETIRE_SLOTS / (4 * (( ( CPU_CLK_UNHALTED.THREAD / 2 ) * ( 1 + CPU_CLK_UNHALTED.ONE_THREAD_ACTIVE / CPU_CLK_UNHALTED.REF_XCLK ) )))) )",
|
||||
"MetricExpr": "1 - ( (IDQ_UOPS_NOT_DELIVERED.CORE / (4 * ( ( CPU_CLK_UNHALTED.THREAD / 2 ) * ( 1 + CPU_CLK_UNHALTED.ONE_THREAD_ACTIVE / CPU_CLK_UNHALTED.REF_XCLK ) ))) + (( UOPS_ISSUED.ANY - UOPS_RETIRED.RETIRE_SLOTS + 4 * ( INT_MISC.RECOVERY_CYCLES_ANY / 2 ) ) / (4 * ( ( CPU_CLK_UNHALTED.THREAD / 2 ) * ( 1 + CPU_CLK_UNHALTED.ONE_THREAD_ACTIVE / CPU_CLK_UNHALTED.REF_XCLK ) ))) + (UOPS_RETIRED.RETIRE_SLOTS / (4 * ( ( CPU_CLK_UNHALTED.THREAD / 2 ) * ( 1 + CPU_CLK_UNHALTED.ONE_THREAD_ACTIVE / CPU_CLK_UNHALTED.REF_XCLK ) ))) )",
|
||||
"MetricGroup": "TopdownL1_SMT",
|
||||
"MetricName": "Backend_Bound_SMT",
|
||||
"PublicDescription": "This category represents fraction of slots where no uops are being delivered due to a lack of required resources for accepting new uops in the Backend. Backend is the portion of the processor core where the out-of-order scheduler dispatches ready uops into their respective execution units; and once completed these uops get retired according to program order. For example; stalls due to data-cache misses or stalls due to the divider unit being overloaded are both categorized under Backend Bound. Backend Bound is further divided into two main categories: Memory Bound and Core Bound. SMT version; use when SMT is enabled and measuring per logical CPU."
|
||||
|
@ -50,7 +51,7 @@
|
|||
},
|
||||
{
|
||||
"BriefDescription": "This category represents fraction of slots utilized by useful work i.e. issued uops that eventually get retired. SMT version; use when SMT is enabled and measuring per logical CPU.",
|
||||
"MetricExpr": "UOPS_RETIRED.RETIRE_SLOTS / (4 * (( ( CPU_CLK_UNHALTED.THREAD / 2 ) * ( 1 + CPU_CLK_UNHALTED.ONE_THREAD_ACTIVE / CPU_CLK_UNHALTED.REF_XCLK ) )))",
|
||||
"MetricExpr": "UOPS_RETIRED.RETIRE_SLOTS / (4 * ( ( CPU_CLK_UNHALTED.THREAD / 2 ) * ( 1 + CPU_CLK_UNHALTED.ONE_THREAD_ACTIVE / CPU_CLK_UNHALTED.REF_XCLK ) ))",
|
||||
"MetricGroup": "TopdownL1_SMT",
|
||||
"MetricName": "Retiring_SMT",
|
||||
"PublicDescription": "This category represents fraction of slots utilized by useful work i.e. issued uops that eventually get retired. Ideally; all pipeline slots would be attributed to the Retiring category. Retiring of 100% would indicate the maximum 4 uops retired per cycle has been achieved. Maximizing Retiring typically increases the Instruction-Per-Cycle metric. Note that a high Retiring value does not necessary mean there is no room for more performance. For example; Microcode assists are categorized under Retiring. They hurt performance and can often be avoided. SMT version; use when SMT is enabled and measuring per logical CPU."
|
||||
|
@ -58,7 +59,7 @@
|
|||
{
|
||||
"BriefDescription": "Instructions Per Cycle (per Logical Processor)",
|
||||
"MetricExpr": "INST_RETIRED.ANY / CPU_CLK_UNHALTED.THREAD",
|
||||
"MetricGroup": "TopDownL1",
|
||||
"MetricGroup": "Summary",
|
||||
"MetricName": "IPC"
|
||||
},
|
||||
{
|
||||
|
@ -73,24 +74,6 @@
|
|||
"MetricGroup": "Branches;Fetch_BW;PGO",
|
||||
"MetricName": "IpTB"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Branch instructions per taken branch. ",
|
||||
"MetricExpr": "BR_INST_RETIRED.ALL_BRANCHES / BR_INST_RETIRED.NEAR_TAKEN",
|
||||
"MetricGroup": "Branches;PGO",
|
||||
"MetricName": "BpTB"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Rough Estimation of fraction of fetched lines bytes that were likely (includes speculatively fetches) consumed by program instructions",
|
||||
"MetricExpr": "min( 1 , UOPS_ISSUED.ANY / ( (UOPS_RETIRED.RETIRE_SLOTS / INST_RETIRED.ANY) * 64 * ( ICACHE_64B.IFTAG_HIT + ICACHE_64B.IFTAG_MISS ) / 4.1 ) )",
|
||||
"MetricGroup": "PGO;IcMiss",
|
||||
"MetricName": "IFetch_Line_Utilization"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Fraction of Uops delivered by the DSB (aka Decoded ICache; or Uop Cache)",
|
||||
"MetricExpr": "IDQ.DSB_UOPS / (IDQ.DSB_UOPS + LSD.UOPS + IDQ.MITE_UOPS + IDQ.MS_UOPS)",
|
||||
"MetricGroup": "DSB;Fetch_BW",
|
||||
"MetricName": "DSB_Coverage"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Cycles Per Instruction (per Logical Processor)",
|
||||
"MetricExpr": "1 / (INST_RETIRED.ANY / cycles)",
|
||||
|
@ -104,86 +87,110 @@
|
|||
"MetricName": "CLKS"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Total issue-pipeline slots (per-Physical Core)",
|
||||
"BriefDescription": "Total issue-pipeline slots (per-Physical Core till ICL; per-Logical Processor ICL onward)",
|
||||
"MetricExpr": "4 * cycles",
|
||||
"MetricGroup": "TopDownL1",
|
||||
"MetricName": "SLOTS"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Total issue-pipeline slots (per-Physical Core)",
|
||||
"MetricExpr": "4 * (( ( CPU_CLK_UNHALTED.THREAD / 2 ) * ( 1 + CPU_CLK_UNHALTED.ONE_THREAD_ACTIVE / CPU_CLK_UNHALTED.REF_XCLK ) ))",
|
||||
"BriefDescription": "Total issue-pipeline slots (per-Physical Core till ICL; per-Logical Processor ICL onward)",
|
||||
"MetricExpr": "4 * ( ( CPU_CLK_UNHALTED.THREAD / 2 ) * ( 1 + CPU_CLK_UNHALTED.ONE_THREAD_ACTIVE / CPU_CLK_UNHALTED.REF_XCLK ) )",
|
||||
"MetricGroup": "TopDownL1_SMT",
|
||||
"MetricName": "SLOTS_SMT"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Instructions per Load (lower number means higher occurance rate)",
|
||||
"BriefDescription": "Instructions per Load (lower number means higher occurrence rate)",
|
||||
"MetricExpr": "INST_RETIRED.ANY / MEM_INST_RETIRED.ALL_LOADS",
|
||||
"MetricGroup": "Instruction_Type",
|
||||
"MetricName": "IpL"
|
||||
"MetricName": "IpLoad"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Instructions per Store (lower number means higher occurance rate)",
|
||||
"BriefDescription": "Instructions per Store (lower number means higher occurrence rate)",
|
||||
"MetricExpr": "INST_RETIRED.ANY / MEM_INST_RETIRED.ALL_STORES",
|
||||
"MetricGroup": "Instruction_Type",
|
||||
"MetricName": "IpS"
|
||||
"MetricName": "IpStore"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Instructions per Branch (lower number means higher occurance rate)",
|
||||
"BriefDescription": "Instructions per Branch (lower number means higher occurrence rate)",
|
||||
"MetricExpr": "INST_RETIRED.ANY / BR_INST_RETIRED.ALL_BRANCHES",
|
||||
"MetricGroup": "Branches;Instruction_Type",
|
||||
"MetricName": "IpB"
|
||||
"MetricName": "IpBranch"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Instruction per (near) call (lower number means higher occurance rate)",
|
||||
"BriefDescription": "Instructions per (near) call (lower number means higher occurrence rate)",
|
||||
"MetricExpr": "INST_RETIRED.ANY / BR_INST_RETIRED.NEAR_CALL",
|
||||
"MetricGroup": "Branches",
|
||||
"MetricName": "IpCall"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Branch instructions per taken branch. ",
|
||||
"MetricExpr": "BR_INST_RETIRED.ALL_BRANCHES / BR_INST_RETIRED.NEAR_TAKEN",
|
||||
"MetricGroup": "Branches;PGO",
|
||||
"MetricName": "BpTkBranch"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Instructions per Floating Point (FP) Operation (lower number means higher occurrence rate)",
|
||||
"MetricExpr": "INST_RETIRED.ANY / ( 1 * ( FP_ARITH_INST_RETIRED.SCALAR_SINGLE + FP_ARITH_INST_RETIRED.SCALAR_DOUBLE ) + 2 * FP_ARITH_INST_RETIRED.128B_PACKED_DOUBLE + 4 * ( FP_ARITH_INST_RETIRED.128B_PACKED_SINGLE + FP_ARITH_INST_RETIRED.256B_PACKED_DOUBLE ) + 8 * ( FP_ARITH_INST_RETIRED.256B_PACKED_SINGLE + FP_ARITH_INST_RETIRED.512B_PACKED_DOUBLE ) + 16 * FP_ARITH_INST_RETIRED.512B_PACKED_SINGLE )",
|
||||
"MetricGroup": "FLOPS;FP_Arith;Instruction_Type",
|
||||
"MetricName": "IpFLOP"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Total number of retired Instructions",
|
||||
"MetricExpr": "INST_RETIRED.ANY",
|
||||
"MetricGroup": "Summary",
|
||||
"MetricGroup": "Summary;TopDownL1",
|
||||
"MetricName": "Instructions"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Fraction of Uops delivered by the LSD (Loop Stream Detector; aka Loop Cache)",
|
||||
"MetricExpr": "LSD.UOPS / (IDQ.DSB_UOPS + LSD.UOPS + IDQ.MITE_UOPS + IDQ.MS_UOPS)",
|
||||
"MetricGroup": "LSD",
|
||||
"MetricName": "LSD_Coverage"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Fraction of Uops delivered by the DSB (aka Decoded ICache; or Uop Cache)",
|
||||
"MetricExpr": "IDQ.DSB_UOPS / (IDQ.DSB_UOPS + LSD.UOPS + IDQ.MITE_UOPS + IDQ.MS_UOPS)",
|
||||
"MetricGroup": "DSB;Fetch_BW",
|
||||
"MetricName": "DSB_Coverage"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Instructions Per Cycle (per physical core)",
|
||||
"MetricExpr": "INST_RETIRED.ANY / cycles",
|
||||
"MetricGroup": "SMT",
|
||||
"MetricGroup": "SMT;TopDownL1",
|
||||
"MetricName": "CoreIPC"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Instructions Per Cycle (per physical core)",
|
||||
"MetricExpr": "INST_RETIRED.ANY / (( ( CPU_CLK_UNHALTED.THREAD / 2 ) * ( 1 + CPU_CLK_UNHALTED.ONE_THREAD_ACTIVE / CPU_CLK_UNHALTED.REF_XCLK ) ))",
|
||||
"MetricGroup": "SMT",
|
||||
"MetricExpr": "INST_RETIRED.ANY / ( ( CPU_CLK_UNHALTED.THREAD / 2 ) * ( 1 + CPU_CLK_UNHALTED.ONE_THREAD_ACTIVE / CPU_CLK_UNHALTED.REF_XCLK ) )",
|
||||
"MetricGroup": "SMT;TopDownL1",
|
||||
"MetricName": "CoreIPC_SMT"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Floating Point Operations Per Cycle",
|
||||
"MetricExpr": "(( 1 * ( FP_ARITH_INST_RETIRED.SCALAR_SINGLE + FP_ARITH_INST_RETIRED.SCALAR_DOUBLE ) + 2 * FP_ARITH_INST_RETIRED.128B_PACKED_DOUBLE + 4 * ( FP_ARITH_INST_RETIRED.128B_PACKED_SINGLE + FP_ARITH_INST_RETIRED.256B_PACKED_DOUBLE ) + 8 * ( FP_ARITH_INST_RETIRED.256B_PACKED_SINGLE + FP_ARITH_INST_RETIRED.512B_PACKED_DOUBLE ) + 16 * FP_ARITH_INST_RETIRED.512B_PACKED_SINGLE )) / cycles",
|
||||
"MetricExpr": "( 1 * ( FP_ARITH_INST_RETIRED.SCALAR_SINGLE + FP_ARITH_INST_RETIRED.SCALAR_DOUBLE ) + 2 * FP_ARITH_INST_RETIRED.128B_PACKED_DOUBLE + 4 * ( FP_ARITH_INST_RETIRED.128B_PACKED_SINGLE + FP_ARITH_INST_RETIRED.256B_PACKED_DOUBLE ) + 8 * ( FP_ARITH_INST_RETIRED.256B_PACKED_SINGLE + FP_ARITH_INST_RETIRED.512B_PACKED_DOUBLE ) + 16 * FP_ARITH_INST_RETIRED.512B_PACKED_SINGLE ) / cycles",
|
||||
"MetricGroup": "FLOPS",
|
||||
"MetricName": "FLOPc"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Floating Point Operations Per Cycle",
|
||||
"MetricExpr": "(( 1 * ( FP_ARITH_INST_RETIRED.SCALAR_SINGLE + FP_ARITH_INST_RETIRED.SCALAR_DOUBLE ) + 2 * FP_ARITH_INST_RETIRED.128B_PACKED_DOUBLE + 4 * ( FP_ARITH_INST_RETIRED.128B_PACKED_SINGLE + FP_ARITH_INST_RETIRED.256B_PACKED_DOUBLE ) + 8 * ( FP_ARITH_INST_RETIRED.256B_PACKED_SINGLE + FP_ARITH_INST_RETIRED.512B_PACKED_DOUBLE ) + 16 * FP_ARITH_INST_RETIRED.512B_PACKED_SINGLE )) / (( ( CPU_CLK_UNHALTED.THREAD / 2 ) * ( 1 + CPU_CLK_UNHALTED.ONE_THREAD_ACTIVE / CPU_CLK_UNHALTED.REF_XCLK ) ))",
|
||||
"MetricExpr": "( 1 * ( FP_ARITH_INST_RETIRED.SCALAR_SINGLE + FP_ARITH_INST_RETIRED.SCALAR_DOUBLE ) + 2 * FP_ARITH_INST_RETIRED.128B_PACKED_DOUBLE + 4 * ( FP_ARITH_INST_RETIRED.128B_PACKED_SINGLE + FP_ARITH_INST_RETIRED.256B_PACKED_DOUBLE ) + 8 * ( FP_ARITH_INST_RETIRED.256B_PACKED_SINGLE + FP_ARITH_INST_RETIRED.512B_PACKED_DOUBLE ) + 16 * FP_ARITH_INST_RETIRED.512B_PACKED_SINGLE ) / ( ( CPU_CLK_UNHALTED.THREAD / 2 ) * ( 1 + CPU_CLK_UNHALTED.ONE_THREAD_ACTIVE / CPU_CLK_UNHALTED.REF_XCLK ) )",
|
||||
"MetricGroup": "FLOPS_SMT",
|
||||
"MetricName": "FLOPc_SMT"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Instruction-Level-Parallelism (average number of uops executed when there is at least 1 uop executed)",
|
||||
"MetricExpr": "UOPS_EXECUTED.THREAD / (( UOPS_EXECUTED.CORE_CYCLES_GE_1 / 2 ) if #SMT_on else UOPS_EXECUTED.CORE_CYCLES_GE_1)",
|
||||
"MetricGroup": "Pipeline",
|
||||
"MetricExpr": "UOPS_EXECUTED.THREAD / ( UOPS_EXECUTED.CORE_CYCLES_GE_1 / 2 )",
|
||||
"MetricGroup": "Pipeline;Ports_Utilization",
|
||||
"MetricName": "ILP"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Branch Misprediction Cost: Fraction of TopDown slots wasted per non-speculative branch misprediction (jeclear)",
|
||||
"MetricExpr": "( ((BR_MISP_RETIRED.ALL_BRANCHES / ( BR_MISP_RETIRED.ALL_BRANCHES + MACHINE_CLEARS.COUNT )) * (( UOPS_ISSUED.ANY - UOPS_RETIRED.RETIRE_SLOTS + 4 * INT_MISC.RECOVERY_CYCLES ) / (4 * cycles))) + (4 * IDQ_UOPS_NOT_DELIVERED.CYCLES_0_UOPS_DELIV.CORE / (4 * cycles)) * (( INT_MISC.CLEAR_RESTEER_CYCLES + 9 * BACLEARS.ANY ) / cycles) / (4 * IDQ_UOPS_NOT_DELIVERED.CYCLES_0_UOPS_DELIV.CORE / (4 * cycles)) ) * (4 * cycles) / BR_MISP_RETIRED.ALL_BRANCHES",
|
||||
"MetricExpr": "( ((BR_MISP_RETIRED.ALL_BRANCHES / ( BR_MISP_RETIRED.ALL_BRANCHES + MACHINE_CLEARS.COUNT )) * (( UOPS_ISSUED.ANY - UOPS_RETIRED.RETIRE_SLOTS + 4 * INT_MISC.RECOVERY_CYCLES ) / (4 * cycles))) + (4 * ( IDQ_UOPS_NOT_DELIVERED.CYCLES_0_UOPS_DELIV.CORE - ( FRONTEND_RETIRED.LATENCY_GE_1 - FRONTEND_RETIRED.LATENCY_GE_2 ) / (UOPS_RETIRED.RETIRE_SLOTS / UOPS_ISSUED.ANY) ) / (4 * cycles)) * (( INT_MISC.CLEAR_RESTEER_CYCLES + 9 * BACLEARS.ANY ) / cycles) / (4 * ( IDQ_UOPS_NOT_DELIVERED.CYCLES_0_UOPS_DELIV.CORE - ( FRONTEND_RETIRED.LATENCY_GE_1 - FRONTEND_RETIRED.LATENCY_GE_2 ) / (UOPS_RETIRED.RETIRE_SLOTS / UOPS_ISSUED.ANY) ) / (4 * cycles)) ) * (4 * cycles) / BR_MISP_RETIRED.ALL_BRANCHES",
|
||||
"MetricGroup": "BrMispredicts",
|
||||
"MetricName": "Branch_Misprediction_Cost"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Branch Misprediction Cost: Fraction of TopDown slots wasted per non-speculative branch misprediction (jeclear)",
|
||||
"MetricExpr": "( ((BR_MISP_RETIRED.ALL_BRANCHES / ( BR_MISP_RETIRED.ALL_BRANCHES + MACHINE_CLEARS.COUNT )) * (( UOPS_ISSUED.ANY - UOPS_RETIRED.RETIRE_SLOTS + 4 * (( INT_MISC.RECOVERY_CYCLES_ANY / 2 )) ) / (4 * (( ( CPU_CLK_UNHALTED.THREAD / 2 ) * ( 1 + CPU_CLK_UNHALTED.ONE_THREAD_ACTIVE / CPU_CLK_UNHALTED.REF_XCLK ) ))))) + (4 * IDQ_UOPS_NOT_DELIVERED.CYCLES_0_UOPS_DELIV.CORE / (4 * (( ( CPU_CLK_UNHALTED.THREAD / 2 ) * ( 1 + CPU_CLK_UNHALTED.ONE_THREAD_ACTIVE / CPU_CLK_UNHALTED.REF_XCLK ) )))) * (( INT_MISC.CLEAR_RESTEER_CYCLES + 9 * BACLEARS.ANY ) / cycles) / (4 * IDQ_UOPS_NOT_DELIVERED.CYCLES_0_UOPS_DELIV.CORE / (4 * (( ( CPU_CLK_UNHALTED.THREAD / 2 ) * ( 1 + CPU_CLK_UNHALTED.ONE_THREAD_ACTIVE / CPU_CLK_UNHALTED.REF_XCLK ) )))) ) * (4 * (( ( CPU_CLK_UNHALTED.THREAD / 2 ) * ( 1 + CPU_CLK_UNHALTED.ONE_THREAD_ACTIVE / CPU_CLK_UNHALTED.REF_XCLK ) ))) / BR_MISP_RETIRED.ALL_BRANCHES",
|
||||
"MetricExpr": "( ((BR_MISP_RETIRED.ALL_BRANCHES / ( BR_MISP_RETIRED.ALL_BRANCHES + MACHINE_CLEARS.COUNT )) * (( UOPS_ISSUED.ANY - UOPS_RETIRED.RETIRE_SLOTS + 4 * ( INT_MISC.RECOVERY_CYCLES_ANY / 2 ) ) / (4 * ( ( CPU_CLK_UNHALTED.THREAD / 2 ) * ( 1 + CPU_CLK_UNHALTED.ONE_THREAD_ACTIVE / CPU_CLK_UNHALTED.REF_XCLK ) )))) + (4 * ( IDQ_UOPS_NOT_DELIVERED.CYCLES_0_UOPS_DELIV.CORE - ( FRONTEND_RETIRED.LATENCY_GE_1 - FRONTEND_RETIRED.LATENCY_GE_2 ) / (UOPS_RETIRED.RETIRE_SLOTS / UOPS_ISSUED.ANY) ) / (4 * ( ( CPU_CLK_UNHALTED.THREAD / 2 ) * ( 1 + CPU_CLK_UNHALTED.ONE_THREAD_ACTIVE / CPU_CLK_UNHALTED.REF_XCLK ) ))) * (( INT_MISC.CLEAR_RESTEER_CYCLES + 9 * BACLEARS.ANY ) / cycles) / (4 * ( IDQ_UOPS_NOT_DELIVERED.CYCLES_0_UOPS_DELIV.CORE - ( FRONTEND_RETIRED.LATENCY_GE_1 - FRONTEND_RETIRED.LATENCY_GE_2 ) / (UOPS_RETIRED.RETIRE_SLOTS / UOPS_ISSUED.ANY) ) / (4 * ( ( CPU_CLK_UNHALTED.THREAD / 2 ) * ( 1 + CPU_CLK_UNHALTED.ONE_THREAD_ACTIVE / CPU_CLK_UNHALTED.REF_XCLK ) ))) ) * (4 * ( ( CPU_CLK_UNHALTED.THREAD / 2 ) * ( 1 + CPU_CLK_UNHALTED.ONE_THREAD_ACTIVE / CPU_CLK_UNHALTED.REF_XCLK ) )) / BR_MISP_RETIRED.ALL_BRANCHES",
|
||||
"MetricGroup": "BrMispredicts_SMT",
|
||||
"MetricName": "Branch_Misprediction_Cost_SMT"
|
||||
},
|
||||
|
@ -213,14 +220,14 @@
|
|||
},
|
||||
{
|
||||
"BriefDescription": "Utilization of the core's Page Walker(s) serving STLB misses triggered by instruction/Load/Store accesses",
|
||||
"MetricConstraint": "NO_NMI_WATCHDOG",
|
||||
"MetricExpr": "( ITLB_MISSES.WALK_PENDING + DTLB_LOAD_MISSES.WALK_PENDING + DTLB_STORE_MISSES.WALK_PENDING + EPT.WALK_PENDING ) / ( 2 * cycles )",
|
||||
"MetricGroup": "TLB",
|
||||
"MetricName": "Page_Walks_Utilization",
|
||||
"MetricConstraint": "NO_NMI_WATCHDOG"
|
||||
"MetricName": "Page_Walks_Utilization"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Utilization of the core's Page Walker(s) serving STLB misses triggered by instruction/Load/Store accesses",
|
||||
"MetricExpr": "( ITLB_MISSES.WALK_PENDING + DTLB_LOAD_MISSES.WALK_PENDING + DTLB_STORE_MISSES.WALK_PENDING + EPT.WALK_PENDING ) / ( 2 * (( ( CPU_CLK_UNHALTED.THREAD / 2 ) * ( 1 + CPU_CLK_UNHALTED.ONE_THREAD_ACTIVE / CPU_CLK_UNHALTED.REF_XCLK ) )) )",
|
||||
"MetricExpr": "( ITLB_MISSES.WALK_PENDING + DTLB_LOAD_MISSES.WALK_PENDING + DTLB_STORE_MISSES.WALK_PENDING + EPT.WALK_PENDING ) / ( 2 * ( ( CPU_CLK_UNHALTED.THREAD / 2 ) * ( 1 + CPU_CLK_UNHALTED.ONE_THREAD_ACTIVE / CPU_CLK_UNHALTED.REF_XCLK ) ) )",
|
||||
"MetricGroup": "TLB_SMT",
|
||||
"MetricName": "Page_Walks_Utilization_SMT"
|
||||
},
|
||||
|
@ -245,7 +252,7 @@
|
|||
{
|
||||
"BriefDescription": "Average per-core data fill bandwidth to the L3 cache [GB / sec]",
|
||||
"MetricExpr": "64 * OFFCORE_REQUESTS.ALL_REQUESTS / 1000000000 / duration_time",
|
||||
"MetricGroup": "Memory_BW",
|
||||
"MetricGroup": "Memory_BW;Offcore",
|
||||
"MetricName": "L3_Cache_Access_BW"
|
||||
},
|
||||
{
|
||||
|
@ -263,7 +270,7 @@
|
|||
{
|
||||
"BriefDescription": "L2 cache misses per kilo instruction for all request types (including speculative)",
|
||||
"MetricExpr": "1000 * L2_RQSTS.MISS / INST_RETIRED.ANY",
|
||||
"MetricGroup": "Cache_Misses",
|
||||
"MetricGroup": "Cache_Misses;Offcore",
|
||||
"MetricName": "L2MPKI_All"
|
||||
},
|
||||
{
|
||||
|
@ -298,7 +305,7 @@
|
|||
},
|
||||
{
|
||||
"BriefDescription": "Giga Floating Point Operations Per Second",
|
||||
"MetricExpr": "( (( 1 * ( FP_ARITH_INST_RETIRED.SCALAR_SINGLE + FP_ARITH_INST_RETIRED.SCALAR_DOUBLE ) + 2 * FP_ARITH_INST_RETIRED.128B_PACKED_DOUBLE + 4 * ( FP_ARITH_INST_RETIRED.128B_PACKED_SINGLE + FP_ARITH_INST_RETIRED.256B_PACKED_DOUBLE ) + 8 * ( FP_ARITH_INST_RETIRED.256B_PACKED_SINGLE + FP_ARITH_INST_RETIRED.512B_PACKED_DOUBLE ) + 16 * FP_ARITH_INST_RETIRED.512B_PACKED_SINGLE )) / 1000000000 ) / duration_time",
|
||||
"MetricExpr": "( ( 1 * ( FP_ARITH_INST_RETIRED.SCALAR_SINGLE + FP_ARITH_INST_RETIRED.SCALAR_DOUBLE ) + 2 * FP_ARITH_INST_RETIRED.128B_PACKED_DOUBLE + 4 * ( FP_ARITH_INST_RETIRED.128B_PACKED_SINGLE + FP_ARITH_INST_RETIRED.256B_PACKED_DOUBLE ) + 8 * ( FP_ARITH_INST_RETIRED.256B_PACKED_SINGLE + FP_ARITH_INST_RETIRED.512B_PACKED_DOUBLE ) + 16 * FP_ARITH_INST_RETIRED.512B_PACKED_SINGLE ) / 1000000000 ) / duration_time",
|
||||
"MetricGroup": "FLOPS;Summary",
|
||||
"MetricName": "GFLOPs"
|
||||
},
|
||||
|
@ -310,62 +317,74 @@
|
|||
},
|
||||
{
|
||||
"BriefDescription": "Fraction of cycles where both hardware Logical Processors were active",
|
||||
"MetricExpr": "1 - CPU_CLK_THREAD_UNHALTED.ONE_THREAD_ACTIVE / ( CPU_CLK_THREAD_UNHALTED.REF_XCLK_ANY / 2 ) if #SMT_on else 0",
|
||||
"MetricExpr": "1 - CPU_CLK_THREAD_UNHALTED.ONE_THREAD_ACTIVE / ( CPU_CLK_THREAD_UNHALTED.REF_XCLK_ANY / 2 )",
|
||||
"MetricGroup": "SMT;Summary",
|
||||
"MetricName": "SMT_2T_Utilization"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Fraction of cycles spent in Kernel mode",
|
||||
"BriefDescription": "Fraction of cycles spent in the Operating System (OS) Kernel mode",
|
||||
"MetricExpr": "CPU_CLK_UNHALTED.THREAD:k / CPU_CLK_UNHALTED.THREAD",
|
||||
"MetricGroup": "Summary",
|
||||
"MetricGroup": "OS",
|
||||
"MetricName": "Kernel_Utilization"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Average external Memory Bandwidth Use for reads and writes [GB / sec]",
|
||||
"MetricExpr": "( 64 * ( uncore_imc@cas_count_read@ + uncore_imc@cas_count_write@ ) / 1000000000 ) / duration_time",
|
||||
"MetricGroup": "Memory_BW",
|
||||
"MetricGroup": "Memory_BW;SoC",
|
||||
"MetricName": "DRAM_BW_Use"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Average latency of data read request to external memory (in nanoseconds). Accounts for demand loads and L1/L2 prefetches",
|
||||
"MetricExpr": "1000000000 * ( cha@event\\=0x36\\,umask\\=0x21@ / cha@event\\=0x35\\,umask\\=0x21@ ) / ( cha_0@event\\=0x0@ / duration_time )",
|
||||
"MetricGroup": "Memory_Lat",
|
||||
"MetricName": "DRAM_Read_Latency"
|
||||
"MetricExpr": "1000000000 * ( cha@event\\=0x36\\,umask\\=0x21\\,config\\=0x40433@ / cha@event\\=0x35\\,umask\\=0x21\\,config\\=0x40433@ ) / ( cha_0@event\\=0x0@ / duration_time )",
|
||||
"MetricGroup": "Memory_Lat;SoC",
|
||||
"MetricName": "MEM_Read_Latency"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Average number of parallel data read requests to external memory. Accounts for demand loads and L1/L2 prefetches",
|
||||
"MetricExpr": "cha@event\\=0x36\\,umask\\=0x21@ / cha@event\\=0x36\\,umask\\=0x21\\,thresh\\=1@",
|
||||
"MetricGroup": "Memory_BW",
|
||||
"MetricName": "DRAM_Parallel_Reads"
|
||||
"MetricExpr": "cha@event\\=0x36\\,umask\\=0x21\\,config\\=0x40433@ / cha@event\\=0x36\\,umask\\=0x21\\,config\\=0x40433\\,thresh\\=1@",
|
||||
"MetricGroup": "Memory_BW;SoC",
|
||||
"MetricName": "MEM_Parallel_Reads"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Average latency of data read request to external 3D X-Point memory [in nanoseconds]. Accounts for demand loads and L1/L2 data-read prefetches",
|
||||
"MetricExpr": "( 1000000000 * ( imc@event\\=0xe0\\,umask\\=0x1@ / imc@event\\=0xe3@ ) / imc_0@event\\=0x0@ )",
|
||||
"MetricGroup": "Memory_Lat",
|
||||
"MetricGroup": "Memory_Lat;SoC;Server",
|
||||
"MetricName": "MEM_PMM_Read_Latency"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Average 3DXP Memory Bandwidth Use for reads [GB / sec]",
|
||||
"MetricExpr": "( ( 64 * imc@event\\=0xe3@ / 1000000000 ) / duration_time )",
|
||||
"MetricGroup": "Memory_BW",
|
||||
"MetricGroup": "Memory_BW;SoC;Server",
|
||||
"MetricName": "PMM_Read_BW"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Average 3DXP Memory Bandwidth Use for Writes [GB / sec]",
|
||||
"MetricExpr": "( ( 64 * imc@event\\=0xe7@ / 1000000000 ) / duration_time )",
|
||||
"MetricGroup": "Memory_BW",
|
||||
"MetricGroup": "Memory_BW;SoC;Server",
|
||||
"MetricName": "PMM_Write_BW"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Average IO (network or disk) Bandwidth Use for Writes [GB / sec]",
|
||||
"MetricExpr": "( UNC_IIO_DATA_REQ_OF_CPU.MEM_READ.PART0 + UNC_IIO_DATA_REQ_OF_CPU.MEM_READ.PART1 + UNC_IIO_DATA_REQ_OF_CPU.MEM_READ.PART2 + UNC_IIO_DATA_REQ_OF_CPU.MEM_READ.PART3 ) * 4 / 1000000000 / duration_time",
|
||||
"MetricGroup": "IO_BW;SoC;Server",
|
||||
"MetricName": "IO_Write_BW"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Average IO (network or disk) Bandwidth Use for Reads [GB / sec]",
|
||||
"MetricExpr": "( UNC_IIO_DATA_REQ_OF_CPU.MEM_WRITE.PART0 + UNC_IIO_DATA_REQ_OF_CPU.MEM_WRITE.PART1 + UNC_IIO_DATA_REQ_OF_CPU.MEM_WRITE.PART2 + UNC_IIO_DATA_REQ_OF_CPU.MEM_WRITE.PART3 ) * 4 / 1000000000 / duration_time",
|
||||
"MetricGroup": "IO_BW;SoC;Server",
|
||||
"MetricName": "IO_Read_BW"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Socket actual clocks when any core is active on that socket",
|
||||
"MetricExpr": "cha_0@event\\=0x0@",
|
||||
"MetricGroup": "",
|
||||
"MetricGroup": "SoC",
|
||||
"MetricName": "Socket_CLKS"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Instructions per Far Branch ( Far Branches apply upon transition from application to operating system, handling interrupts, exceptions. )",
|
||||
"BriefDescription": "Instructions per Far Branch ( Far Branches apply upon transition from application to operating system, handling interrupts, exceptions) [lower number means higher occurrence rate]",
|
||||
"MetricExpr": "INST_RETIRED.ANY / ( BR_INST_RETIRED.FAR_BRANCH / 2 )",
|
||||
"MetricGroup": "",
|
||||
"MetricGroup": "Branches;OS",
|
||||
"MetricName": "IpFarBranch"
|
||||
},
|
||||
{
|
||||
|
|
|
@ -246,6 +246,30 @@
|
|||
"SampleAfterValue": "2000003",
|
||||
"UMask": "0x10"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Decode Stream Buffer (DSB)-to-MITE switches",
|
||||
"Counter": "0,1,2,3",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0xAB",
|
||||
"EventName": "DSB2MITE_SWITCHES.COUNT",
|
||||
"PublicDescription": "This event counts the number of the Decode Stream Buffer (DSB)-to-MITE switches including all misses because of missing Decode Stream Buffer (DSB) cache and u-arch forced misses.\nNote: Invoking MITE requires two or three cycles delay.",
|
||||
"SampleAfterValue": "2000003",
|
||||
"UMask": "0x1"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Retired instructions after front-end starvation of at least 1 cycle",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0xc6",
|
||||
"EventName": "FRONTEND_RETIRED.LATENCY_GE_1",
|
||||
"MSRIndex": "0x3F7",
|
||||
"MSRValue": "0x400106",
|
||||
"PEBS": "2",
|
||||
"PublicDescription": "Retired instructions that are fetched after an interval where the front-end delivered no uops for a period of at least 1 cycle which was not interrupted by a back-end stall.",
|
||||
"SampleAfterValue": "100007",
|
||||
"TakenAlone": "1",
|
||||
"UMask": "0x1"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Instruction fetch tag lookups that miss in the instruction cache (L1I). Counts at 64-byte cache-line granularity.",
|
||||
"Counter": "0,1,2,3",
|
||||
|
@ -359,6 +383,16 @@
|
|||
"SampleAfterValue": "2000003",
|
||||
"UMask": "0x24"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Counts the total number when the front end is resteered, mainly when the BPU cannot provide a correct prediction and this is corrected by other branch handling mechanisms at the front end.",
|
||||
"Counter": "0,1,2,3",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0xE6",
|
||||
"EventName": "BACLEARS.ANY",
|
||||
"PublicDescription": "Counts the number of times the front-end is resteered when it finds a branch instruction in a fetch line. This occurs for the first time a branch instruction is fetched or when the branch is not tracked by the BPU (Branch Prediction Unit) anymore.",
|
||||
"SampleAfterValue": "100003",
|
||||
"UMask": "0x1"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Retired instructions that are fetched after an interval where the front-end delivered no uops for a period of 16 cycles which was not interrupted by a back-end stall.",
|
||||
"Counter": "0,1,2,3",
|
||||
|
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
|
@ -826,16 +826,6 @@
|
|||
"SampleAfterValue": "2000003",
|
||||
"UMask": "0x2"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Counts the total number when the front end is resteered, mainly when the BPU cannot provide a correct prediction and this is corrected by other branch handling mechanisms at the front end.",
|
||||
"Counter": "0,1,2,3",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0xE6",
|
||||
"EventName": "BACLEARS.ANY",
|
||||
"PublicDescription": "Counts the number of times the front-end is resteered when it finds a branch instruction in a fetch line. This occurs for the first time a branch instruction is fetched or when the branch is not tracked by the BPU (Branch Prediction Unit) anymore.",
|
||||
"SampleAfterValue": "100003",
|
||||
"UMask": "0x1"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Loads blocked due to overlapping with a preceding store that cannot be forwarded.",
|
||||
"Counter": "0,1,2,3",
|
||||
|
|
|
@ -90,32 +90,32 @@
|
|||
"Unit": "iMC"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Intel Optane DC persistent memory bandwidth read (MB/sec). Derived from unc_m_pmm_rpq_inserts",
|
||||
"BriefDescription": "Intel Optane DC persistent memory bandwidth read (MB). Derived from unc_m_pmm_rpq_inserts",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventCode": "0xE3",
|
||||
"EventName": "UNC_M_PMM_BANDWIDTH.READ",
|
||||
"PerPkg": "1",
|
||||
"ScaleUnit": "6.103515625E-5MB/sec",
|
||||
"ScaleUnit": "6.103515625E-5MB",
|
||||
"Unit": "iMC"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Intel Optane DC persistent memory bandwidth write (MB/sec). Derived from unc_m_pmm_wpq_inserts",
|
||||
"BriefDescription": "Intel Optane DC persistent memory bandwidth write (MB). Derived from unc_m_pmm_wpq_inserts",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventCode": "0xE7",
|
||||
"EventName": "UNC_M_PMM_BANDWIDTH.WRITE",
|
||||
"PerPkg": "1",
|
||||
"ScaleUnit": "6.103515625E-5MB/sec",
|
||||
"ScaleUnit": "6.103515625E-5MB",
|
||||
"Unit": "iMC"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Intel Optane DC persistent memory bandwidth total (MB/sec). Derived from unc_m_pmm_rpq_inserts",
|
||||
"BriefDescription": "Intel Optane DC persistent memory bandwidth total (MB). Derived from unc_m_pmm_rpq_inserts",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventCode": "0xE3",
|
||||
"EventName": "UNC_M_PMM_BANDWIDTH.TOTAL",
|
||||
"MetricExpr": "UNC_M_PMM_RPQ_INSERTS + UNC_M_PMM_WPQ_INSERTS",
|
||||
"MetricName": "UNC_M_PMM_BANDWIDTH.TOTAL",
|
||||
"PerPkg": "1",
|
||||
"ScaleUnit": "6.103515625E-5MB/sec",
|
||||
"ScaleUnit": "6.103515625E-5MB",
|
||||
"Unit": "iMC"
|
||||
},
|
||||
{
|
||||
|
|
|
@ -537,6 +537,27 @@
|
|||
"UMask": "0x10",
|
||||
"Unit": "CHA"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "TOR Inserts : DRds issued by iA Cores that Missed the LLC",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventCode": "0x35",
|
||||
"EventName": "UNC_CHA_TOR_INSERTS.IA_MISS_DRD",
|
||||
"Filter": "config1=0x40433",
|
||||
"PerPkg": "1",
|
||||
"PublicDescription": "TOR Inserts : DRds issued by iA Cores that Missed the LLC : Counts the number of entries successfully inserted into the TOR that match qualifications specified by the subevent. Does not include addressless requests such as locks and interrupts.",
|
||||
"UMask": "0x21",
|
||||
"Unit": "CHA"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "TOR Occupancy : DRds issued by iA Cores that Missed the LLC",
|
||||
"EventCode": "0x36",
|
||||
"EventName": "UNC_CHA_TOR_OCCUPANCY.IA_MISS_DRD",
|
||||
"Filter": "config1=0x40433",
|
||||
"PerPkg": "1",
|
||||
"PublicDescription": "TOR Occupancy : DRds issued by iA Cores that Missed the LLC : For each cycle, this event accumulates the number of valid entries in the TOR that match qualifications specified by the subevent. Does not include addressless requests such as locks and interrupts.",
|
||||
"UMask": "0x21",
|
||||
"Unit": "CHA"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Clockticks of the IIO Traffic Controller",
|
||||
"Counter": "0,1,2,3",
|
||||
|
|
|
@ -38,3 +38,4 @@ GenuineIntel-6-7E,v1,icelake,core
|
|||
GenuineIntel-6-86,v1,tremontx,core
|
||||
AuthenticAMD-23-([12][0-9A-F]|[0-9A-F]),v2,amdzen1,core
|
||||
AuthenticAMD-23-[[:xdigit:]]+,v1,amdzen2,core
|
||||
AuthenticAMD-25-[[:xdigit:]]+,v1,amdzen2,core
|
||||
|
|
|
File diff suppressed because it is too large
Load Diff
|
@ -1,85 +1,85 @@
|
|||
[
|
||||
{
|
||||
"EventCode": "0xC7",
|
||||
"UMask": "0x1",
|
||||
"BriefDescription": "Number of SSE/AVX computational scalar double precision floating-point instructions retired. Each count represents 1 computation. Applies to SSE* and AVX* scalar double precision floating-point instructions: ADD SUB MUL DIV MIN MAX SQRT FM(N)ADD/SUB. FM(N)ADD/SUB instructions count twice as they perform multiple calculations per element.",
|
||||
"BriefDescription": "Number of SSE/AVX computational 128-bit packed double precision floating-point instructions retired; some instructions will count twice as noted below. Each count represents 2 computation operations, one for each element. Applies to SSE* and AVX* packed double precision floating-point instructions: ADD SUB HADD HSUB SUBADD MUL DIV MIN MAX SQRT RSQRT14 RCP14 DPP FM(N)ADD/SUB. DPP and FM(N)ADD/SUB instructions count twice as they perform 2 calculations per element.",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventName": "FP_ARITH_INST_RETIRED.SCALAR_DOUBLE",
|
||||
"SampleAfterValue": "2000003",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
},
|
||||
{
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0xC7",
|
||||
"UMask": "0x2",
|
||||
"BriefDescription": "Number of SSE/AVX computational scalar single precision floating-point instructions retired. Each count represents 1 computation. Applies to SSE* and AVX* scalar single precision floating-point instructions: ADD SUB MUL DIV MIN MAX RCP RSQRT SQRT FM(N)ADD/SUB. FM(N)ADD/SUB instructions count twice as they perform multiple calculations per element.",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventName": "FP_ARITH_INST_RETIRED.SCALAR_SINGLE",
|
||||
"SampleAfterValue": "2000003",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
},
|
||||
{
|
||||
"EventCode": "0xC7",
|
||||
"UMask": "0x4",
|
||||
"BriefDescription": "Number of SSE/AVX computational 128-bit packed double precision floating-point instructions retired. Each count represents 2 computations. Applies to SSE* and AVX* packed double precision floating-point instructions: ADD SUB MUL DIV MIN MAX SQRT DPP FM(N)ADD/SUB. DPP and FM(N)ADD/SUB instructions count twice as they perform multiple calculations per element.",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventName": "FP_ARITH_INST_RETIRED.128B_PACKED_DOUBLE",
|
||||
"SampleAfterValue": "2000003",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
"UMask": "0x4"
|
||||
},
|
||||
{
|
||||
"EventCode": "0xC7",
|
||||
"UMask": "0x8",
|
||||
"BriefDescription": "Number of SSE/AVX computational 128-bit packed single precision floating-point instructions retired. Each count represents 4 computations. Applies to SSE* and AVX* packed single precision floating-point instructions: ADD SUB MUL DIV MIN MAX RCP RSQRT SQRT DPP FM(N)ADD/SUB. DPP and FM(N)ADD/SUB instructions count twice as they perform multiple calculations per element.",
|
||||
"BriefDescription": "Number of SSE/AVX computational 512-bit packed double precision floating-point instructions retired; some instructions will count twice as noted below. Each count represents 8 computation operations, one for each element. Applies to SSE* and AVX* packed double precision floating-point instructions: ADD SUB MUL DIV MIN MAX RCP14 RSQRT14 SQRT DPP FM(N)ADD/SUB. DPP and FM(N)ADD/SUB instructions count twice as they perform 8 calculations per element.",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventName": "FP_ARITH_INST_RETIRED.128B_PACKED_SINGLE",
|
||||
"SampleAfterValue": "2000003",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
},
|
||||
{
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0xC7",
|
||||
"UMask": "0x10",
|
||||
"BriefDescription": "Number of SSE/AVX computational 256-bit packed double precision floating-point instructions retired. Each count represents 4 computations. Applies to SSE* and AVX* packed double precision floating-point instructions: ADD SUB MUL DIV MIN MAX SQRT DPP FM(N)ADD/SUB. DPP and FM(N)ADD/SUB instructions count twice as they perform multiple calculations per element.",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventName": "FP_ARITH_INST_RETIRED.256B_PACKED_DOUBLE",
|
||||
"SampleAfterValue": "2000003",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
},
|
||||
{
|
||||
"EventCode": "0xC7",
|
||||
"UMask": "0x20",
|
||||
"BriefDescription": "Number of SSE/AVX computational 256-bit packed single precision floating-point instructions retired. Each count represents 8 computations. Applies to SSE* and AVX* packed single precision floating-point instructions: ADD SUB MUL DIV MIN MAX RCP RSQRT SQRT DPP FM(N)ADD/SUB. DPP and FM(N)ADD/SUB instructions count twice as they perform multiple calculations per element.",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventName": "FP_ARITH_INST_RETIRED.256B_PACKED_SINGLE",
|
||||
"SampleAfterValue": "2000003",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
},
|
||||
{
|
||||
"EventCode": "0xC7",
|
||||
"UMask": "0x40",
|
||||
"BriefDescription": "Number of Packed Double-Precision FP arithmetic instructions (Use operation multiplier of 8)",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventName": "FP_ARITH_INST_RETIRED.512B_PACKED_DOUBLE",
|
||||
"SampleAfterValue": "2000003",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
"UMask": "0x40"
|
||||
},
|
||||
{
|
||||
"EventCode": "0xC7",
|
||||
"UMask": "0x80",
|
||||
"BriefDescription": "Number of Packed Single-Precision FP arithmetic instructions (Use operation multiplier of 16)",
|
||||
"BriefDescription": "Number of SSE/AVX computational scalar single precision floating-point instructions retired; some instructions will count twice as noted below. Each count represents 1 computation. Applies to SSE* and AVX* scalar single precision floating-point instructions: ADD SUB MUL DIV MIN MAX RCP14 RSQRT14 SQRT DPP FM(N)ADD/SUB. DPP and FM(N)ADD/SUB instructions count twice as they perform 2 calculations per element.",
|
||||
"Counter": "0,1,2,3",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0xC7",
|
||||
"EventName": "FP_ARITH_INST_RETIRED.SCALAR_SINGLE",
|
||||
"SampleAfterValue": "2000003",
|
||||
"UMask": "0x2"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Number of SSE/AVX computational 256-bit packed double precision floating-point instructions retired; some instructions will count twice as noted below. Each count represents 4 computation operations, one for each element. Applies to SSE* and AVX* packed double precision floating-point instructions: ADD SUB MUL DIV MIN MAX RCP14 RSQRT14 SQRT DPP FM(N)ADD/SUB. DPP and FM(N)ADD/SUB instructions count twice as they perform 2 calculations per element.",
|
||||
"Counter": "0,1,2,3",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0xC7",
|
||||
"EventName": "FP_ARITH_INST_RETIRED.256B_PACKED_DOUBLE",
|
||||
"SampleAfterValue": "2000003",
|
||||
"UMask": "0x10"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Number of SSE/AVX computational 512-bit packed single precision floating-point instructions retired; some instructions will count twice as noted below. Each count represents 16 computation operations, one for each element. Applies to SSE* and AVX* packed single precision floating-point instructions: ADD SUB MUL DIV MIN MAX RCP14 RSQRT14 SQRT DPP FM(N)ADD/SUB. DPP and FM(N)ADD/SUB instructions count twice as they perform 16 calculations per element.",
|
||||
"Counter": "0,1,2,3",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0xC7",
|
||||
"EventName": "FP_ARITH_INST_RETIRED.512B_PACKED_SINGLE",
|
||||
"SampleAfterValue": "2000003",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
"UMask": "0x80"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Number of SSE/AVX computational 256-bit packed single precision floating-point instructions retired; some instructions will count twice as noted below. Each count represents 8 computation operations, one for each element. Applies to SSE* and AVX* packed single precision floating-point instructions: ADD SUB MUL DIV MIN MAX RCP14 RSQRT14 SQRT DPP FM(N)ADD/SUB. DPP and FM(N)ADD/SUB instructions count twice as they perform 2 calculations per element.",
|
||||
"Counter": "0,1,2,3",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0xC7",
|
||||
"EventName": "FP_ARITH_INST_RETIRED.256B_PACKED_SINGLE",
|
||||
"SampleAfterValue": "2000003",
|
||||
"UMask": "0x20"
|
||||
},
|
||||
{
|
||||
"EventCode": "0xCA",
|
||||
"UMask": "0x1e",
|
||||
"BriefDescription": "Cycles with any input/output SSE or FP assist",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventName": "FP_ASSIST.ANY",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7",
|
||||
"CounterMask": "1",
|
||||
"EventCode": "0xCA",
|
||||
"EventName": "FP_ASSIST.ANY",
|
||||
"PublicDescription": "Counts cycles with any input and output SSE or x87 FP assist. If an input and output assist are detected on the same cycle the event increments by 1.",
|
||||
"SampleAfterValue": "100003",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
"UMask": "0x1e"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Number of SSE/AVX computational scalar double precision floating-point instructions retired; some instructions will count twice as noted below. Each count represents 1 computation. Applies to SSE* and AVX* scalar double precision floating-point instructions: ADD SUB MUL DIV MIN MAX RCP14 RSQRT14 SQRT DPP FM(N)ADD/SUB. DPP and FM(N)ADD/SUB instructions count twice as they perform 2 calculations per element.",
|
||||
"Counter": "0,1,2,3",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0xC7",
|
||||
"EventName": "FP_ARITH_INST_RETIRED.SCALAR_DOUBLE",
|
||||
"SampleAfterValue": "2000003",
|
||||
"UMask": "0x1"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Number of SSE/AVX computational 128-bit packed single precision floating-point instructions retired; some instructions will count twice as noted below. Each count represents 4 computation operations, one for each element. Applies to SSE* and AVX* packed single precision floating-point instructions: ADD SUB MUL DIV MIN MAX RCP14 RSQRT14 SQRT DPP FM(N)ADD/SUB. DPP and FM(N)ADD/SUB instructions count twice as they perform 2 calculations per element.",
|
||||
"Counter": "0,1,2,3",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0xC7",
|
||||
"EventName": "FP_ARITH_INST_RETIRED.128B_PACKED_SINGLE",
|
||||
"SampleAfterValue": "2000003",
|
||||
"UMask": "0x8"
|
||||
}
|
||||
]
|
|
@ -1,482 +1,516 @@
|
|||
[
|
||||
{
|
||||
"EventCode": "0x79",
|
||||
"UMask": "0x4",
|
||||
"BriefDescription": "Cycles when uops are being delivered to Instruction Decode Queue (IDQ) from MITE path",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventName": "IDQ.MITE_CYCLES",
|
||||
"CounterMask": "1",
|
||||
"PublicDescription": "Counts cycles during which uops are being delivered to Instruction Decode Queue (IDQ) from the MITE path. Counting includes uops that may 'bypass' the IDQ.",
|
||||
"SampleAfterValue": "2000003",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x79",
|
||||
"UMask": "0x4",
|
||||
"BriefDescription": "Uops delivered to Instruction Decode Queue (IDQ) from MITE path",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventName": "IDQ.MITE_UOPS",
|
||||
"PublicDescription": "Counts the number of uops delivered to Instruction Decode Queue (IDQ) from the MITE path. Counting includes uops that may 'bypass' the IDQ. This also means that uops are not being delivered from the Decode Stream Buffer (DSB).",
|
||||
"SampleAfterValue": "2000003",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x79",
|
||||
"UMask": "0x8",
|
||||
"BriefDescription": "Cycles when uops are being delivered to Instruction Decode Queue (IDQ) from Decode Stream Buffer (DSB) path",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventName": "IDQ.DSB_CYCLES",
|
||||
"CounterMask": "1",
|
||||
"PublicDescription": "Counts cycles during which uops are being delivered to Instruction Decode Queue (IDQ) from the Decode Stream Buffer (DSB) path. Counting includes uops that may 'bypass' the IDQ.",
|
||||
"SampleAfterValue": "2000003",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x79",
|
||||
"UMask": "0x8",
|
||||
"BriefDescription": "Uops delivered to Instruction Decode Queue (IDQ) from the Decode Stream Buffer (DSB) path",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventName": "IDQ.DSB_UOPS",
|
||||
"PublicDescription": "Counts the number of uops delivered to Instruction Decode Queue (IDQ) from the Decode Stream Buffer (DSB) path. Counting includes uops that may 'bypass' the IDQ.",
|
||||
"SampleAfterValue": "2000003",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x79",
|
||||
"UMask": "0x10",
|
||||
"BriefDescription": "Cycles when uops initiated by Decode Stream Buffer (DSB) are being delivered to Instruction Decode Queue (IDQ) while Microcode Sequenser (MS) is busy",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventName": "IDQ.MS_DSB_CYCLES",
|
||||
"CounterMask": "1",
|
||||
"PublicDescription": "Counts cycles during which uops initiated by Decode Stream Buffer (DSB) are being delivered to Instruction Decode Queue (IDQ) while the Microcode Sequencer (MS) is busy. Counting includes uops that may 'bypass' the IDQ.",
|
||||
"SampleAfterValue": "2000003",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x79",
|
||||
"UMask": "0x18",
|
||||
"BriefDescription": "Cycles Decode Stream Buffer (DSB) is delivering any Uop",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventName": "IDQ.ALL_DSB_CYCLES_ANY_UOPS",
|
||||
"CounterMask": "1",
|
||||
"PublicDescription": "Counts the number of cycles uops were delivered to Instruction Decode Queue (IDQ) from the Decode Stream Buffer (DSB) path. Count includes uops that may 'bypass' the IDQ.",
|
||||
"SampleAfterValue": "2000003",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x79",
|
||||
"UMask": "0x18",
|
||||
"BriefDescription": "Cycles Decode Stream Buffer (DSB) is delivering 4 Uops",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventName": "IDQ.ALL_DSB_CYCLES_4_UOPS",
|
||||
"CounterMask": "4",
|
||||
"PublicDescription": "Counts the number of cycles 4 uops were delivered to Instruction Decode Queue (IDQ) from the Decode Stream Buffer (DSB) path. Count includes uops that may 'bypass' the IDQ.",
|
||||
"SampleAfterValue": "2000003",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x79",
|
||||
"UMask": "0x20",
|
||||
"BriefDescription": "Uops initiated by MITE and delivered to Instruction Decode Queue (IDQ) while Microcode Sequenser (MS) is busy",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventName": "IDQ.MS_MITE_UOPS",
|
||||
"PublicDescription": "Counts the number of uops initiated by MITE and delivered to Instruction Decode Queue (IDQ) while the Microcode Sequencer (MS) is busy. Counting includes uops that may 'bypass' the IDQ.",
|
||||
"SampleAfterValue": "2000003",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x79",
|
||||
"UMask": "0x24",
|
||||
"BriefDescription": "Cycles MITE is delivering any Uop",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventName": "IDQ.ALL_MITE_CYCLES_ANY_UOPS",
|
||||
"CounterMask": "1",
|
||||
"PublicDescription": "Counts the number of cycles uops were delivered to the Instruction Decode Queue (IDQ) from the MITE (legacy decode pipeline) path. Counting includes uops that may 'bypass' the IDQ. During these cycles uops are not being delivered from the Decode Stream Buffer (DSB).",
|
||||
"SampleAfterValue": "2000003",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x79",
|
||||
"UMask": "0x24",
|
||||
"BriefDescription": "Cycles MITE is delivering 4 Uops",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventName": "IDQ.ALL_MITE_CYCLES_4_UOPS",
|
||||
"CounterMask": "4",
|
||||
"PublicDescription": "Counts the number of cycles 4 uops were delivered to the Instruction Decode Queue (IDQ) from the MITE (legacy decode pipeline) path. Counting includes uops that may 'bypass' the IDQ. During these cycles uops are not being delivered from the Decode Stream Buffer (DSB).",
|
||||
"SampleAfterValue": "2000003",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x79",
|
||||
"UMask": "0x30",
|
||||
"BriefDescription": "Cycles when uops are being delivered to Instruction Decode Queue (IDQ) while Microcode Sequenser (MS) is busy",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventName": "IDQ.MS_CYCLES",
|
||||
"CounterMask": "1",
|
||||
"PublicDescription": "Counts cycles during which uops are being delivered to Instruction Decode Queue (IDQ) while the Microcode Sequencer (MS) is busy. Counting includes uops that may 'bypass' the IDQ. Uops maybe initiated by Decode Stream Buffer (DSB) or MITE.",
|
||||
"SampleAfterValue": "2000003",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x79",
|
||||
"UMask": "0x30",
|
||||
"BriefDescription": "Uops delivered to Instruction Decode Queue (IDQ) while Microcode Sequenser (MS) is busy",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventName": "IDQ.MS_UOPS",
|
||||
"PublicDescription": "Counts the total number of uops delivered by the Microcode Sequencer (MS). Any instruction over 4 uops will be delivered by the MS. Some instructions such as transcendentals may additionally generate uops from the MS.",
|
||||
"SampleAfterValue": "2000003",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
},
|
||||
{
|
||||
"EdgeDetect": "1",
|
||||
"EventCode": "0x79",
|
||||
"UMask": "0x30",
|
||||
"BriefDescription": "Number of switches from DSB (Decode Stream Buffer) or MITE (legacy decode pipeline) to the Microcode Sequencer",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventName": "IDQ.MS_SWITCHES",
|
||||
"CounterMask": "1",
|
||||
"PublicDescription": "Number of switches from DSB (Decode Stream Buffer) or MITE (legacy decode pipeline) to the Microcode Sequencer.",
|
||||
"SampleAfterValue": "2000003",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x80",
|
||||
"UMask": "0x4",
|
||||
"BriefDescription": "Cycles where a code fetch is stalled due to L1 instruction cache miss.",
|
||||
"Counter": "0,1,2,3",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0x80",
|
||||
"EventName": "ICACHE_16B.IFDATA_STALL",
|
||||
"PublicDescription": "Cycles where a code line fetch is stalled due to an L1 instruction cache miss. The legacy decode pipeline works at a 16 Byte granularity.",
|
||||
"SampleAfterValue": "2000003",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
"UMask": "0x4"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x83",
|
||||
"UMask": "0x1",
|
||||
"BriefDescription": "Instruction fetch tag lookups that hit in the instruction cache (L1I). Counts at 64-byte cache-line granularity.",
|
||||
"BriefDescription": "Retired Instructions who experienced iTLB true miss.",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventName": "ICACHE_64B.IFTAG_HIT",
|
||||
"SampleAfterValue": "200003",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x83",
|
||||
"UMask": "0x2",
|
||||
"BriefDescription": "Instruction fetch tag lookups that miss in the instruction cache (L1I). Counts at 64-byte cache-line granularity.",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventName": "ICACHE_64B.IFTAG_MISS",
|
||||
"SampleAfterValue": "200003",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x83",
|
||||
"UMask": "0x4",
|
||||
"BriefDescription": "Cycles where a code fetch is stalled due to L1 instruction cache tag miss.",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventName": "ICACHE_64B.IFTAG_STALL",
|
||||
"SampleAfterValue": "200003",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
},
|
||||
{
|
||||
"Invert": "1",
|
||||
"EventCode": "0x9C",
|
||||
"UMask": "0x1",
|
||||
"BriefDescription": "Counts cycles FE delivered 4 uops or Resource Allocation Table (RAT) was stalling FE.",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventName": "IDQ_UOPS_NOT_DELIVERED.CYCLES_FE_WAS_OK",
|
||||
"CounterMask": "1",
|
||||
"SampleAfterValue": "2000003",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x9C",
|
||||
"UMask": "0x1",
|
||||
"BriefDescription": "Cycles with less than 3 uops delivered by the front end.",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventName": "IDQ_UOPS_NOT_DELIVERED.CYCLES_LE_3_UOP_DELIV.CORE",
|
||||
"CounterMask": "1",
|
||||
"PublicDescription": "Cycles with less than 3 uops delivered by the front-end.",
|
||||
"SampleAfterValue": "2000003",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x9C",
|
||||
"UMask": "0x1",
|
||||
"BriefDescription": "Cycles with less than 2 uops delivered by the front end.",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventName": "IDQ_UOPS_NOT_DELIVERED.CYCLES_LE_2_UOP_DELIV.CORE",
|
||||
"CounterMask": "2",
|
||||
"PublicDescription": "Cycles with less than 2 uops delivered by the front-end.",
|
||||
"SampleAfterValue": "2000003",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x9C",
|
||||
"UMask": "0x1",
|
||||
"BriefDescription": "Cycles per thread when 3 or more uops are not delivered to Resource Allocation Table (RAT) when backend of the machine is not stalled",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventName": "IDQ_UOPS_NOT_DELIVERED.CYCLES_LE_1_UOP_DELIV.CORE",
|
||||
"CounterMask": "3",
|
||||
"PublicDescription": "Counts, on the per-thread basis, cycles when less than 1 uop is delivered to Resource Allocation Table (RAT). IDQ_Uops_Not_Delivered.core >= 3.",
|
||||
"SampleAfterValue": "2000003",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x9C",
|
||||
"UMask": "0x1",
|
||||
"BriefDescription": "Cycles per thread when 4 or more uops are not delivered to Resource Allocation Table (RAT) when backend of the machine is not stalled",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventName": "IDQ_UOPS_NOT_DELIVERED.CYCLES_0_UOPS_DELIV.CORE",
|
||||
"CounterMask": "4",
|
||||
"PublicDescription": "Counts, on the per-thread basis, cycles when no uops are delivered to Resource Allocation Table (RAT). IDQ_Uops_Not_Delivered.core =4.",
|
||||
"SampleAfterValue": "2000003",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x9C",
|
||||
"UMask": "0x1",
|
||||
"BriefDescription": "Uops not delivered to Resource Allocation Table (RAT) per thread when backend of the machine is not stalled",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventName": "IDQ_UOPS_NOT_DELIVERED.CORE",
|
||||
"PublicDescription": "Counts the number of uops not delivered to Resource Allocation Table (RAT) per thread adding \u201c4 \u2013 x\u201d when Resource Allocation Table (RAT) is not stalled and Instruction Decode Queue (IDQ) delivers x uops to Resource Allocation Table (RAT) (where x belongs to {0,1,2,3}). Counting does not cover cases when: a. IDQ-Resource Allocation Table (RAT) pipe serves the other thread. b. Resource Allocation Table (RAT) is stalled for the thread (including uop drops and clear BE conditions). c. Instruction Decode Queue (IDQ) delivers four uops.",
|
||||
"SampleAfterValue": "2000003",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
},
|
||||
{
|
||||
"EventCode": "0xAB",
|
||||
"UMask": "0x2",
|
||||
"BriefDescription": "Decode Stream Buffer (DSB)-to-MITE switch true penalty cycles.",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventName": "DSB2MITE_SWITCHES.PENALTY_CYCLES",
|
||||
"PublicDescription": "Counts Decode Stream Buffer (DSB)-to-MITE switch true penalty cycles. These cycles do not include uops routed through because of the switch itself, for example, when Instruction Decode Queue (IDQ) pre-allocation is unavailable, or Instruction Decode Queue (IDQ) is full. SBD-to-MITE switch true penalty cycles happen after the merge mux (MM) receives Decode Stream Buffer (DSB) Sync-indication until receiving the first MITE uop. MM is placed before Instruction Decode Queue (IDQ) to merge uops being fed from the MITE and Decode Stream Buffer (DSB) paths. Decode Stream Buffer (DSB) inserts the Sync-indication whenever a Decode Stream Buffer (DSB)-to-MITE switch occurs.Penalty: A Decode Stream Buffer (DSB) hit followed by a Decode Stream Buffer (DSB) miss can cost up to six cycles in which no uops are delivered to the IDQ. Most often, such switches from the Decode Stream Buffer (DSB) to the legacy pipeline cost 0\u20132 cycles.",
|
||||
"SampleAfterValue": "2000003",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
},
|
||||
{
|
||||
"CounterHTOff": "0,1,2,3",
|
||||
"EventCode": "0xC6",
|
||||
"UMask": "0x1",
|
||||
"BriefDescription": "Retired instructions that are fetched after an interval where the front-end delivered no uops for a period of 4 cycles which was not interrupted by a back-end stall. Precise Event.",
|
||||
"PEBS": "1",
|
||||
"MSRValue": "0x400406",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventName": "FRONTEND_RETIRED.LATENCY_GE_4",
|
||||
"MSRIndex": "0x3F7",
|
||||
"TakenAlone": "1",
|
||||
"SampleAfterValue": "100007",
|
||||
"CounterHTOff": "0,1,2,3"
|
||||
},
|
||||
{
|
||||
"EventCode": "0xC6",
|
||||
"UMask": "0x1",
|
||||
"BriefDescription": "Retired instructions that are fetched after an interval where the front-end had at least 2 bubble-slots for a period of 2 cycles which was not interrupted by a back-end stall. Precise Event.",
|
||||
"PEBS": "1",
|
||||
"MSRValue": "0x200206",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventName": "FRONTEND_RETIRED.LATENCY_GE_2_BUBBLES_GE_2",
|
||||
"MSRIndex": "0x3F7",
|
||||
"TakenAlone": "1",
|
||||
"SampleAfterValue": "100007",
|
||||
"CounterHTOff": "0,1,2,3"
|
||||
},
|
||||
{
|
||||
"EventCode": "0xC6",
|
||||
"UMask": "0x1",
|
||||
"BriefDescription": "Retired instructions that are fetched after an interval where the front-end delivered no uops for a period of 2 cycles which was not interrupted by a back-end stall. Precise Event.",
|
||||
"PEBS": "1",
|
||||
"MSRValue": "0x400206",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventName": "FRONTEND_RETIRED.LATENCY_GE_2",
|
||||
"MSRIndex": "0x3F7",
|
||||
"TakenAlone": "1",
|
||||
"SampleAfterValue": "100007",
|
||||
"CounterHTOff": "0,1,2,3"
|
||||
},
|
||||
{
|
||||
"EventCode": "0xC6",
|
||||
"UMask": "0x1",
|
||||
"BriefDescription": "Retired Instructions who experienced STLB (2nd level TLB) true miss. Precise Event.",
|
||||
"PEBS": "1",
|
||||
"MSRValue": "0x15",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventName": "FRONTEND_RETIRED.STLB_MISS",
|
||||
"MSRIndex": "0x3F7",
|
||||
"PublicDescription": "Counts retired Instructions that experienced STLB (2nd level TLB) true miss.",
|
||||
"TakenAlone": "1",
|
||||
"SampleAfterValue": "100007",
|
||||
"CounterHTOff": "0,1,2,3"
|
||||
},
|
||||
{
|
||||
"EventCode": "0xC6",
|
||||
"UMask": "0x1",
|
||||
"BriefDescription": "Retired Instructions who experienced iTLB true miss. Precise Event.",
|
||||
"PEBS": "1",
|
||||
"MSRValue": "0x14",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventName": "FRONTEND_RETIRED.ITLB_MISS",
|
||||
"MSRIndex": "0x3F7",
|
||||
"MSRValue": "0x14",
|
||||
"PEBS": "1",
|
||||
"PublicDescription": "Counts retired Instructions that experienced iTLB (Instruction TLB) true miss.",
|
||||
"TakenAlone": "1",
|
||||
"SampleAfterValue": "100007",
|
||||
"CounterHTOff": "0,1,2,3"
|
||||
"TakenAlone": "1",
|
||||
"UMask": "0x1"
|
||||
},
|
||||
{
|
||||
"EventCode": "0xC6",
|
||||
"UMask": "0x1",
|
||||
"BriefDescription": "Retired Instructions who experienced Instruction L2 Cache true miss. Precise Event.",
|
||||
"PEBS": "1",
|
||||
"MSRValue": "0x13",
|
||||
"BriefDescription": "Retired instructions that are fetched after an interval where the front-end delivered no uops for a period of 128 cycles which was not interrupted by a back-end stall.",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventName": "FRONTEND_RETIRED.L2_MISS",
|
||||
"MSRIndex": "0x3F7",
|
||||
"TakenAlone": "1",
|
||||
"SampleAfterValue": "100007",
|
||||
"CounterHTOff": "0,1,2,3"
|
||||
},
|
||||
{
|
||||
"CounterHTOff": "0,1,2,3",
|
||||
"EventCode": "0xC6",
|
||||
"UMask": "0x1",
|
||||
"BriefDescription": "Retired Instructions who experienced Instruction L1 Cache true miss. Precise Event.",
|
||||
"PEBS": "1",
|
||||
"MSRValue": "0x12",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventName": "FRONTEND_RETIRED.L1I_MISS",
|
||||
"MSRIndex": "0x3F7",
|
||||
"TakenAlone": "1",
|
||||
"SampleAfterValue": "100007",
|
||||
"CounterHTOff": "0,1,2,3"
|
||||
},
|
||||
{
|
||||
"EventCode": "0xC6",
|
||||
"UMask": "0x1",
|
||||
"BriefDescription": "Retired Instructions who experienced decode stream buffer (DSB - the decoded instruction-cache) miss. Precise Event.",
|
||||
"PEBS": "1",
|
||||
"MSRValue": "0x11",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventName": "FRONTEND_RETIRED.DSB_MISS",
|
||||
"MSRIndex": "0x3F7",
|
||||
"PublicDescription": "Counts retired Instructions that experienced DSB (Decode stream buffer i.e. the decoded instruction-cache) miss.",
|
||||
"TakenAlone": "1",
|
||||
"SampleAfterValue": "100007",
|
||||
"CounterHTOff": "0,1,2,3"
|
||||
},
|
||||
{
|
||||
"EventCode": "0xC6",
|
||||
"UMask": "0x1",
|
||||
"BriefDescription": "Retired instructions that are fetched after an interval where the front-end had at least 3 bubble-slots for a period of 2 cycles which was not interrupted by a back-end stall. Precise Event.",
|
||||
"PEBS": "1",
|
||||
"MSRValue": "0x300206",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventName": "FRONTEND_RETIRED.LATENCY_GE_2_BUBBLES_GE_3",
|
||||
"MSRIndex": "0x3F7",
|
||||
"TakenAlone": "1",
|
||||
"SampleAfterValue": "100007",
|
||||
"CounterHTOff": "0,1,2,3"
|
||||
},
|
||||
{
|
||||
"EventCode": "0xC6",
|
||||
"UMask": "0x1",
|
||||
"BriefDescription": "Retired instructions that are fetched after an interval where the front-end had at least 1 bubble-slot for a period of 2 cycles which was not interrupted by a back-end stall. Precise Event.",
|
||||
"PEBS": "1",
|
||||
"MSRValue": "0x100206",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventName": "FRONTEND_RETIRED.LATENCY_GE_2_BUBBLES_GE_1",
|
||||
"MSRIndex": "0x3F7",
|
||||
"PublicDescription": "Counts retired instructions that are delivered to the back-end after the front-end had at least 1 bubble-slot for a period of 2 cycles. A bubble-slot is an empty issue-pipeline slot while there was no RAT stall.",
|
||||
"TakenAlone": "1",
|
||||
"SampleAfterValue": "100007",
|
||||
"CounterHTOff": "0,1,2,3"
|
||||
},
|
||||
{
|
||||
"EventCode": "0xC6",
|
||||
"UMask": "0x1",
|
||||
"BriefDescription": "Retired instructions that are fetched after an interval where the front-end delivered no uops for a period of 512 cycles which was not interrupted by a back-end stall. Precise Event.",
|
||||
"PEBS": "1",
|
||||
"MSRValue": "0x420006",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventName": "FRONTEND_RETIRED.LATENCY_GE_512",
|
||||
"MSRIndex": "0x3F7",
|
||||
"TakenAlone": "1",
|
||||
"SampleAfterValue": "100007",
|
||||
"CounterHTOff": "0,1,2,3"
|
||||
},
|
||||
{
|
||||
"EventCode": "0xC6",
|
||||
"UMask": "0x1",
|
||||
"BriefDescription": "Retired instructions that are fetched after an interval where the front-end delivered no uops for a period of 256 cycles which was not interrupted by a back-end stall. Precise Event.",
|
||||
"PEBS": "1",
|
||||
"MSRValue": "0x410006",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventName": "FRONTEND_RETIRED.LATENCY_GE_256",
|
||||
"MSRIndex": "0x3F7",
|
||||
"TakenAlone": "1",
|
||||
"SampleAfterValue": "100007",
|
||||
"CounterHTOff": "0,1,2,3"
|
||||
},
|
||||
{
|
||||
"EventCode": "0xC6",
|
||||
"UMask": "0x1",
|
||||
"BriefDescription": "Retired instructions that are fetched after an interval where the front-end delivered no uops for a period of 128 cycles which was not interrupted by a back-end stall. Precise Event.",
|
||||
"PEBS": "1",
|
||||
"MSRValue": "0x408006",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventName": "FRONTEND_RETIRED.LATENCY_GE_128",
|
||||
"MSRIndex": "0x3F7",
|
||||
"TakenAlone": "1",
|
||||
"MSRValue": "0x408006",
|
||||
"PEBS": "1",
|
||||
"SampleAfterValue": "100007",
|
||||
"CounterHTOff": "0,1,2,3"
|
||||
"TakenAlone": "1",
|
||||
"UMask": "0x1"
|
||||
},
|
||||
{
|
||||
"EventCode": "0xC6",
|
||||
"UMask": "0x1",
|
||||
"BriefDescription": "Retired instructions that are fetched after an interval where the front-end delivered no uops for a period of 64 cycles which was not interrupted by a back-end stall. Precise Event.",
|
||||
"PEBS": "1",
|
||||
"MSRValue": "0x404006",
|
||||
"BriefDescription": "Cycles with less than 3 uops delivered by the front end.",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventName": "FRONTEND_RETIRED.LATENCY_GE_64",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7",
|
||||
"CounterMask": "1",
|
||||
"EventCode": "0x9C",
|
||||
"EventName": "IDQ_UOPS_NOT_DELIVERED.CYCLES_LE_3_UOP_DELIV.CORE",
|
||||
"PublicDescription": "Cycles with less than 3 uops delivered by the front-end.",
|
||||
"SampleAfterValue": "2000003",
|
||||
"UMask": "0x1"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Cycles when uops are being delivered to Instruction Decode Queue (IDQ) from Decode Stream Buffer (DSB) path",
|
||||
"Counter": "0,1,2,3",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7",
|
||||
"CounterMask": "1",
|
||||
"EventCode": "0x79",
|
||||
"EventName": "IDQ.DSB_CYCLES",
|
||||
"PublicDescription": "Counts cycles during which uops are being delivered to Instruction Decode Queue (IDQ) from the Decode Stream Buffer (DSB) path. Counting includes uops that may 'bypass' the IDQ.",
|
||||
"SampleAfterValue": "2000003",
|
||||
"UMask": "0x8"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Cycles per thread when 3 or more uops are not delivered to Resource Allocation Table (RAT) when backend of the machine is not stalled",
|
||||
"Counter": "0,1,2,3",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7",
|
||||
"CounterMask": "3",
|
||||
"EventCode": "0x9C",
|
||||
"EventName": "IDQ_UOPS_NOT_DELIVERED.CYCLES_LE_1_UOP_DELIV.CORE",
|
||||
"PublicDescription": "Counts, on the per-thread basis, cycles when less than 1 uop is delivered to Resource Allocation Table (RAT). IDQ_Uops_Not_Delivered.core >= 3.",
|
||||
"SampleAfterValue": "2000003",
|
||||
"UMask": "0x1"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Counts the total number when the front end is resteered, mainly when the BPU cannot provide a correct prediction and this is corrected by other branch handling mechanisms at the front end.",
|
||||
"Counter": "0,1,2,3",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0xE6",
|
||||
"EventName": "BACLEARS.ANY",
|
||||
"PublicDescription": "Counts the number of times the front-end is resteered when it finds a branch instruction in a fetch line. This occurs for the first time a branch instruction is fetched or when the branch is not tracked by the BPU (Branch Prediction Unit) anymore.",
|
||||
"SampleAfterValue": "100003",
|
||||
"UMask": "0x1"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Retired Instructions who experienced decode stream buffer (DSB - the decoded instruction-cache) miss.",
|
||||
"Counter": "0,1,2,3",
|
||||
"CounterHTOff": "0,1,2,3",
|
||||
"EventCode": "0xC6",
|
||||
"EventName": "FRONTEND_RETIRED.DSB_MISS",
|
||||
"MSRIndex": "0x3F7",
|
||||
"TakenAlone": "1",
|
||||
"MSRValue": "0x11",
|
||||
"PEBS": "1",
|
||||
"PublicDescription": "Counts retired Instructions that experienced DSB (Decode stream buffer i.e. the decoded instruction-cache) miss.",
|
||||
"SampleAfterValue": "100007",
|
||||
"CounterHTOff": "0,1,2,3"
|
||||
"TakenAlone": "1",
|
||||
"UMask": "0x1"
|
||||
},
|
||||
{
|
||||
"EventCode": "0xC6",
|
||||
"UMask": "0x1",
|
||||
"BriefDescription": "Retired instructions that are fetched after an interval where the front-end delivered no uops for a period of 32 cycles which was not interrupted by a back-end stall. Precise Event.",
|
||||
"PEBS": "1",
|
||||
"MSRValue": "0x402006",
|
||||
"BriefDescription": "Cycles per thread when 4 or more uops are not delivered to Resource Allocation Table (RAT) when backend of the machine is not stalled",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventName": "FRONTEND_RETIRED.LATENCY_GE_32",
|
||||
"MSRIndex": "0x3F7",
|
||||
"PublicDescription": "Counts retired instructions that are delivered to the back-end after a front-end stall of at least 32 cycles. During this period the front-end delivered no uops.",
|
||||
"TakenAlone": "1",
|
||||
"SampleAfterValue": "100007",
|
||||
"CounterHTOff": "0,1,2,3"
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7",
|
||||
"CounterMask": "4",
|
||||
"EventCode": "0x9C",
|
||||
"EventName": "IDQ_UOPS_NOT_DELIVERED.CYCLES_0_UOPS_DELIV.CORE",
|
||||
"PublicDescription": "Counts, on the per-thread basis, cycles when no uops are delivered to Resource Allocation Table (RAT). IDQ_Uops_Not_Delivered.core =4.",
|
||||
"SampleAfterValue": "2000003",
|
||||
"UMask": "0x1"
|
||||
},
|
||||
{
|
||||
"EventCode": "0xC6",
|
||||
"UMask": "0x1",
|
||||
"BriefDescription": "Retired instructions that are fetched after an interval where the front-end delivered no uops for a period of 16 cycles which was not interrupted by a back-end stall. Precise Event.",
|
||||
"PEBS": "1",
|
||||
"MSRValue": "0x401006",
|
||||
"BriefDescription": "Retired instructions that are fetched after an interval where the front-end delivered no uops for a period of 16 cycles which was not interrupted by a back-end stall.",
|
||||
"Counter": "0,1,2,3",
|
||||
"CounterHTOff": "0,1,2,3",
|
||||
"EventCode": "0xC6",
|
||||
"EventName": "FRONTEND_RETIRED.LATENCY_GE_16",
|
||||
"MSRIndex": "0x3F7",
|
||||
"MSRValue": "0x401006",
|
||||
"PEBS": "1",
|
||||
"PublicDescription": "Counts retired instructions that are delivered to the back-end after a front-end stall of at least 16 cycles. During this period the front-end delivered no uops.",
|
||||
"TakenAlone": "1",
|
||||
"SampleAfterValue": "100007",
|
||||
"CounterHTOff": "0,1,2,3"
|
||||
"TakenAlone": "1",
|
||||
"UMask": "0x1"
|
||||
},
|
||||
{
|
||||
"EventCode": "0xC6",
|
||||
"UMask": "0x1",
|
||||
"BriefDescription": "Retired instructions that are fetched after an interval where the front-end delivered no uops for a period of 8 cycles which was not interrupted by a back-end stall.",
|
||||
"PEBS": "1",
|
||||
"MSRValue": "0x400806",
|
||||
"BriefDescription": "Uops delivered to Instruction Decode Queue (IDQ) from MITE path",
|
||||
"Counter": "0,1,2,3",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0x79",
|
||||
"EventName": "IDQ.MITE_UOPS",
|
||||
"PublicDescription": "Counts the number of uops delivered to Instruction Decode Queue (IDQ) from the MITE path. Counting includes uops that may 'bypass' the IDQ. This also means that uops are not being delivered from the Decode Stream Buffer (DSB).",
|
||||
"SampleAfterValue": "2000003",
|
||||
"UMask": "0x4"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Cycles with less than 2 uops delivered by the front end.",
|
||||
"Counter": "0,1,2,3",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7",
|
||||
"CounterMask": "2",
|
||||
"EventCode": "0x9C",
|
||||
"EventName": "IDQ_UOPS_NOT_DELIVERED.CYCLES_LE_2_UOP_DELIV.CORE",
|
||||
"PublicDescription": "Cycles with less than 2 uops delivered by the front-end.",
|
||||
"SampleAfterValue": "2000003",
|
||||
"UMask": "0x1"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Cycles when uops are being delivered to Instruction Decode Queue (IDQ) while Microcode Sequenser (MS) is busy",
|
||||
"Counter": "0,1,2,3",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7",
|
||||
"CounterMask": "1",
|
||||
"EventCode": "0x79",
|
||||
"EventName": "IDQ.MS_CYCLES",
|
||||
"PublicDescription": "Counts cycles during which uops are being delivered to Instruction Decode Queue (IDQ) while the Microcode Sequencer (MS) is busy. Counting includes uops that may 'bypass' the IDQ. Uops maybe initiated by Decode Stream Buffer (DSB) or MITE.",
|
||||
"SampleAfterValue": "2000003",
|
||||
"UMask": "0x30"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Cycles MITE is delivering any Uop",
|
||||
"Counter": "0,1,2,3",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7",
|
||||
"CounterMask": "1",
|
||||
"EventCode": "0x79",
|
||||
"EventName": "IDQ.ALL_MITE_CYCLES_ANY_UOPS",
|
||||
"PublicDescription": "Counts the number of cycles uops were delivered to the Instruction Decode Queue (IDQ) from the MITE (legacy decode pipeline) path. Counting includes uops that may 'bypass' the IDQ. During these cycles uops are not being delivered from the Decode Stream Buffer (DSB).",
|
||||
"SampleAfterValue": "2000003",
|
||||
"UMask": "0x24"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Instruction fetch tag lookups that hit in the instruction cache (L1I). Counts at 64-byte cache-line granularity.",
|
||||
"Counter": "0,1,2,3",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0x83",
|
||||
"EventName": "ICACHE_64B.IFTAG_HIT",
|
||||
"SampleAfterValue": "200003",
|
||||
"UMask": "0x1"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Number of switches from DSB (Decode Stream Buffer) or MITE (legacy decode pipeline) to the Microcode Sequencer",
|
||||
"Counter": "0,1,2,3",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7",
|
||||
"CounterMask": "1",
|
||||
"EdgeDetect": "1",
|
||||
"EventCode": "0x79",
|
||||
"EventName": "IDQ.MS_SWITCHES",
|
||||
"PublicDescription": "Number of switches from DSB (Decode Stream Buffer) or MITE (legacy decode pipeline) to the Microcode Sequencer.",
|
||||
"SampleAfterValue": "2000003",
|
||||
"UMask": "0x30"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Retired Instructions who experienced Instruction L2 Cache true miss.",
|
||||
"Counter": "0,1,2,3",
|
||||
"CounterHTOff": "0,1,2,3",
|
||||
"EventCode": "0xC6",
|
||||
"EventName": "FRONTEND_RETIRED.L2_MISS",
|
||||
"MSRIndex": "0x3F7",
|
||||
"MSRValue": "0x13",
|
||||
"PEBS": "1",
|
||||
"SampleAfterValue": "100007",
|
||||
"TakenAlone": "1",
|
||||
"UMask": "0x1"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Cycles when uops are being delivered to Instruction Decode Queue (IDQ) from MITE path",
|
||||
"Counter": "0,1,2,3",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7",
|
||||
"CounterMask": "1",
|
||||
"EventCode": "0x79",
|
||||
"EventName": "IDQ.MITE_CYCLES",
|
||||
"PublicDescription": "Counts cycles during which uops are being delivered to Instruction Decode Queue (IDQ) from the MITE path. Counting includes uops that may 'bypass' the IDQ.",
|
||||
"SampleAfterValue": "2000003",
|
||||
"UMask": "0x4"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Retired instructions that are fetched after an interval where the front-end delivered no uops for a period of 64 cycles which was not interrupted by a back-end stall.",
|
||||
"Counter": "0,1,2,3",
|
||||
"CounterHTOff": "0,1,2,3",
|
||||
"EventCode": "0xC6",
|
||||
"EventName": "FRONTEND_RETIRED.LATENCY_GE_64",
|
||||
"MSRIndex": "0x3F7",
|
||||
"MSRValue": "0x404006",
|
||||
"PEBS": "1",
|
||||
"SampleAfterValue": "100007",
|
||||
"TakenAlone": "1",
|
||||
"UMask": "0x1"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Uops not delivered to Resource Allocation Table (RAT) per thread when backend of the machine is not stalled",
|
||||
"Counter": "0,1,2,3",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0x9C",
|
||||
"EventName": "IDQ_UOPS_NOT_DELIVERED.CORE",
|
||||
"PublicDescription": "Counts the number of uops not delivered to Resource Allocation Table (RAT) per thread adding 4 x when Resource Allocation Table (RAT) is not stalled and Instruction Decode Queue (IDQ) delivers x uops to Resource Allocation Table (RAT) (where x belongs to {0,1,2,3}). Counting does not cover cases when: a. IDQ-Resource Allocation Table (RAT) pipe serves the other thread. b. Resource Allocation Table (RAT) is stalled for the thread (including uop drops and clear BE conditions). c. Instruction Decode Queue (IDQ) delivers four uops.",
|
||||
"SampleAfterValue": "2000003",
|
||||
"UMask": "0x1"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Uops initiated by MITE and delivered to Instruction Decode Queue (IDQ) while Microcode Sequenser (MS) is busy",
|
||||
"Counter": "0,1,2,3",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0x79",
|
||||
"EventName": "IDQ.MS_MITE_UOPS",
|
||||
"PublicDescription": "Counts the number of uops initiated by MITE and delivered to Instruction Decode Queue (IDQ) while the Microcode Sequencer (MS) is busy. Counting includes uops that may 'bypass' the IDQ.",
|
||||
"SampleAfterValue": "2000003",
|
||||
"UMask": "0x20"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Cycles where a code fetch is stalled due to L1 instruction cache tag miss.",
|
||||
"Counter": "0,1,2,3",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0x83",
|
||||
"EventName": "ICACHE_64B.IFTAG_STALL",
|
||||
"SampleAfterValue": "200003",
|
||||
"UMask": "0x4"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Decode Stream Buffer (DSB)-to-MITE switch true penalty cycles.",
|
||||
"Counter": "0,1,2,3",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0xAB",
|
||||
"EventName": "DSB2MITE_SWITCHES.PENALTY_CYCLES",
|
||||
"PublicDescription": "Counts Decode Stream Buffer (DSB)-to-MITE switch true penalty cycles. These cycles do not include uops routed through because of the switch itself, for example, when Instruction Decode Queue (IDQ) pre-allocation is unavailable, or Instruction Decode Queue (IDQ) is full. SBD-to-MITE switch true penalty cycles happen after the merge mux (MM) receives Decode Stream Buffer (DSB) Sync-indication until receiving the first MITE uop. MM is placed before Instruction Decode Queue (IDQ) to merge uops being fed from the MITE and Decode Stream Buffer (DSB) paths. Decode Stream Buffer (DSB) inserts the Sync-indication whenever a Decode Stream Buffer (DSB)-to-MITE switch occurs.Penalty: A Decode Stream Buffer (DSB) hit followed by a Decode Stream Buffer (DSB) miss can cost up to six cycles in which no uops are delivered to the IDQ. Most often, such switches from the Decode Stream Buffer (DSB) to the legacy pipeline cost 02 cycles.",
|
||||
"SampleAfterValue": "2000003",
|
||||
"UMask": "0x2"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Cycles Decode Stream Buffer (DSB) is delivering any Uop",
|
||||
"Counter": "0,1,2,3",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7",
|
||||
"CounterMask": "1",
|
||||
"EventCode": "0x79",
|
||||
"EventName": "IDQ.ALL_DSB_CYCLES_ANY_UOPS",
|
||||
"PublicDescription": "Counts the number of cycles uops were delivered to Instruction Decode Queue (IDQ) from the Decode Stream Buffer (DSB) path. Count includes uops that may 'bypass' the IDQ.",
|
||||
"SampleAfterValue": "2000003",
|
||||
"UMask": "0x18"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Retired Instructions who experienced STLB (2nd level TLB) true miss.",
|
||||
"Counter": "0,1,2,3",
|
||||
"CounterHTOff": "0,1,2,3",
|
||||
"EventCode": "0xC6",
|
||||
"EventName": "FRONTEND_RETIRED.STLB_MISS",
|
||||
"MSRIndex": "0x3F7",
|
||||
"MSRValue": "0x15",
|
||||
"PEBS": "1",
|
||||
"PublicDescription": "Counts retired Instructions that experienced STLB (2nd level TLB) true miss.",
|
||||
"SampleAfterValue": "100007",
|
||||
"TakenAlone": "1",
|
||||
"UMask": "0x1"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Uops delivered to Instruction Decode Queue (IDQ) from the Decode Stream Buffer (DSB) path",
|
||||
"Counter": "0,1,2,3",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0x79",
|
||||
"EventName": "IDQ.DSB_UOPS",
|
||||
"PublicDescription": "Counts the number of uops delivered to Instruction Decode Queue (IDQ) from the Decode Stream Buffer (DSB) path. Counting includes uops that may 'bypass' the IDQ.",
|
||||
"SampleAfterValue": "2000003",
|
||||
"UMask": "0x8"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Retired instructions that are fetched after an interval where the front-end delivered no uops for a period of 512 cycles which was not interrupted by a back-end stall.",
|
||||
"Counter": "0,1,2,3",
|
||||
"CounterHTOff": "0,1,2,3",
|
||||
"EventCode": "0xC6",
|
||||
"EventName": "FRONTEND_RETIRED.LATENCY_GE_512",
|
||||
"MSRIndex": "0x3F7",
|
||||
"MSRValue": "0x420006",
|
||||
"PEBS": "1",
|
||||
"SampleAfterValue": "100007",
|
||||
"TakenAlone": "1",
|
||||
"UMask": "0x1"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Retired instructions that are fetched after an interval where the front-end delivered no uops for a period of 8 cycles which was not interrupted by a back-end stall.",
|
||||
"Counter": "0,1,2,3",
|
||||
"CounterHTOff": "0,1,2,3",
|
||||
"EventCode": "0xC6",
|
||||
"EventName": "FRONTEND_RETIRED.LATENCY_GE_8",
|
||||
"MSRIndex": "0x3F7",
|
||||
"MSRValue": "0x400806",
|
||||
"PEBS": "1",
|
||||
"PublicDescription": "Counts retired instructions that are delivered to the back-end after a front-end stall of at least 8 cycles. During this period the front-end delivered no uops.",
|
||||
"TakenAlone": "1",
|
||||
"SampleAfterValue": "100007",
|
||||
"CounterHTOff": "0,1,2,3"
|
||||
"TakenAlone": "1",
|
||||
"UMask": "0x1"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Retired instructions after front-end starvation of at least 1 cycle",
|
||||
"Counter": "0,1,2,3,4,5,6,7",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0xc6",
|
||||
"EventName": "FRONTEND_RETIRED.LATENCY_GE_1",
|
||||
"MSRIndex": "0x3F7",
|
||||
"MSRValue": "0x400106",
|
||||
"PEBS": "2",
|
||||
"PublicDescription": "Retired instructions that are fetched after an interval where the front-end delivered no uops for a period of at least 1 cycle which was not interrupted by a back-end stall.",
|
||||
"SampleAfterValue": "100007",
|
||||
"TakenAlone": "1",
|
||||
"UMask": "0x1"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Retired instructions that are fetched after an interval where the front-end delivered no uops for a period of 2 cycles which was not interrupted by a back-end stall.",
|
||||
"Counter": "0,1,2,3",
|
||||
"CounterHTOff": "0,1,2,3",
|
||||
"EventCode": "0xC6",
|
||||
"EventName": "FRONTEND_RETIRED.LATENCY_GE_2",
|
||||
"MSRIndex": "0x3F7",
|
||||
"MSRValue": "0x400206",
|
||||
"PEBS": "1",
|
||||
"SampleAfterValue": "100007",
|
||||
"TakenAlone": "1",
|
||||
"UMask": "0x1"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Retired instructions that are fetched after an interval where the front-end delivered no uops for a period of 4 cycles which was not interrupted by a back-end stall.",
|
||||
"Counter": "0,1,2,3",
|
||||
"CounterHTOff": "0,1,2,3",
|
||||
"EventCode": "0xC6",
|
||||
"EventName": "FRONTEND_RETIRED.LATENCY_GE_4",
|
||||
"MSRIndex": "0x3F7",
|
||||
"MSRValue": "0x400406",
|
||||
"PEBS": "1",
|
||||
"SampleAfterValue": "100007",
|
||||
"TakenAlone": "1",
|
||||
"UMask": "0x1"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Cycles MITE is delivering 4 Uops",
|
||||
"Counter": "0,1,2,3",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7",
|
||||
"CounterMask": "4",
|
||||
"EventCode": "0x79",
|
||||
"EventName": "IDQ.ALL_MITE_CYCLES_4_UOPS",
|
||||
"PublicDescription": "Counts the number of cycles 4 uops were delivered to the Instruction Decode Queue (IDQ) from the MITE (legacy decode pipeline) path. Counting includes uops that may 'bypass' the IDQ. During these cycles uops are not being delivered from the Decode Stream Buffer (DSB).",
|
||||
"SampleAfterValue": "2000003",
|
||||
"UMask": "0x24"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Cycles when uops initiated by Decode Stream Buffer (DSB) are being delivered to Instruction Decode Queue (IDQ) while Microcode Sequenser (MS) is busy",
|
||||
"Counter": "0,1,2,3",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7",
|
||||
"CounterMask": "1",
|
||||
"EventCode": "0x79",
|
||||
"EventName": "IDQ.MS_DSB_CYCLES",
|
||||
"PublicDescription": "Counts cycles during which uops initiated by Decode Stream Buffer (DSB) are being delivered to Instruction Decode Queue (IDQ) while the Microcode Sequencer (MS) is busy. Counting includes uops that may 'bypass' the IDQ.",
|
||||
"SampleAfterValue": "2000003",
|
||||
"UMask": "0x10"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Uops delivered to Instruction Decode Queue (IDQ) while Microcode Sequenser (MS) is busy",
|
||||
"Counter": "0,1,2,3",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0x79",
|
||||
"EventName": "IDQ.MS_UOPS",
|
||||
"PublicDescription": "Counts the total number of uops delivered by the Microcode Sequencer (MS). Any instruction over 4 uops will be delivered by the MS. Some instructions such as transcendentals may additionally generate uops from the MS.",
|
||||
"SampleAfterValue": "2000003",
|
||||
"UMask": "0x30"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Retired instructions that are fetched after an interval where the front-end delivered no uops for a period of 256 cycles which was not interrupted by a back-end stall.",
|
||||
"Counter": "0,1,2,3",
|
||||
"CounterHTOff": "0,1,2,3",
|
||||
"EventCode": "0xC6",
|
||||
"EventName": "FRONTEND_RETIRED.LATENCY_GE_256",
|
||||
"MSRIndex": "0x3F7",
|
||||
"MSRValue": "0x410006",
|
||||
"PEBS": "1",
|
||||
"SampleAfterValue": "100007",
|
||||
"TakenAlone": "1",
|
||||
"UMask": "0x1"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Retired instructions that are fetched after an interval where the front-end had at least 2 bubble-slots for a period of 2 cycles which was not interrupted by a back-end stall.",
|
||||
"Counter": "0,1,2,3",
|
||||
"CounterHTOff": "0,1,2,3",
|
||||
"EventCode": "0xC6",
|
||||
"EventName": "FRONTEND_RETIRED.LATENCY_GE_2_BUBBLES_GE_2",
|
||||
"MSRIndex": "0x3F7",
|
||||
"MSRValue": "0x200206",
|
||||
"PEBS": "1",
|
||||
"SampleAfterValue": "100007",
|
||||
"TakenAlone": "1",
|
||||
"UMask": "0x1"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Retired instructions that are fetched after an interval where the front-end had at least 3 bubble-slots for a period of 2 cycles which was not interrupted by a back-end stall.",
|
||||
"Counter": "0,1,2,3",
|
||||
"CounterHTOff": "0,1,2,3",
|
||||
"EventCode": "0xC6",
|
||||
"EventName": "FRONTEND_RETIRED.LATENCY_GE_2_BUBBLES_GE_3",
|
||||
"MSRIndex": "0x3F7",
|
||||
"MSRValue": "0x300206",
|
||||
"PEBS": "1",
|
||||
"SampleAfterValue": "100007",
|
||||
"TakenAlone": "1",
|
||||
"UMask": "0x1"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Retired instructions that are fetched after an interval where the front-end had at least 1 bubble-slot for a period of 2 cycles which was not interrupted by a back-end stall.",
|
||||
"Counter": "0,1,2,3",
|
||||
"CounterHTOff": "0,1,2,3",
|
||||
"EventCode": "0xC6",
|
||||
"EventName": "FRONTEND_RETIRED.LATENCY_GE_2_BUBBLES_GE_1",
|
||||
"MSRIndex": "0x3F7",
|
||||
"MSRValue": "0x100206",
|
||||
"PEBS": "1",
|
||||
"PublicDescription": "Counts retired instructions that are delivered to the back-end after the front-end had at least 1 bubble-slot for a period of 2 cycles. A bubble-slot is an empty issue-pipeline slot while there was no RAT stall.",
|
||||
"SampleAfterValue": "100007",
|
||||
"TakenAlone": "1",
|
||||
"UMask": "0x1"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Cycles Decode Stream Buffer (DSB) is delivering 4 Uops",
|
||||
"Counter": "0,1,2,3",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7",
|
||||
"CounterMask": "4",
|
||||
"EventCode": "0x79",
|
||||
"EventName": "IDQ.ALL_DSB_CYCLES_4_UOPS",
|
||||
"PublicDescription": "Counts the number of cycles 4 uops were delivered to Instruction Decode Queue (IDQ) from the Decode Stream Buffer (DSB) path. Count includes uops that may 'bypass' the IDQ.",
|
||||
"SampleAfterValue": "2000003",
|
||||
"UMask": "0x18"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Decode Stream Buffer (DSB)-to-MITE switches",
|
||||
"Counter": "0,1,2,3",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0xAB",
|
||||
"EventName": "DSB2MITE_SWITCHES.COUNT",
|
||||
"PublicDescription": "This event counts the number of the Decode Stream Buffer (DSB)-to-MITE switches including all misses because of missing Decode Stream Buffer (DSB) cache and u-arch forced misses.\nNote: Invoking MITE requires two or three cycles delay.",
|
||||
"SampleAfterValue": "2000003",
|
||||
"UMask": "0x1"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Retired instructions that are fetched after an interval where the front-end delivered no uops for a period of 32 cycles which was not interrupted by a back-end stall.",
|
||||
"Counter": "0,1,2,3",
|
||||
"CounterHTOff": "0,1,2,3",
|
||||
"EventCode": "0xC6",
|
||||
"EventName": "FRONTEND_RETIRED.LATENCY_GE_32",
|
||||
"MSRIndex": "0x3F7",
|
||||
"MSRValue": "0x402006",
|
||||
"PEBS": "1",
|
||||
"PublicDescription": "Counts retired instructions that are delivered to the back-end after a front-end stall of at least 32 cycles. During this period the front-end delivered no uops.",
|
||||
"SampleAfterValue": "100007",
|
||||
"TakenAlone": "1",
|
||||
"UMask": "0x1"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Counts cycles FE delivered 4 uops or Resource Allocation Table (RAT) was stalling FE.",
|
||||
"Counter": "0,1,2,3",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7",
|
||||
"CounterMask": "1",
|
||||
"EventCode": "0x9C",
|
||||
"EventName": "IDQ_UOPS_NOT_DELIVERED.CYCLES_FE_WAS_OK",
|
||||
"Invert": "1",
|
||||
"SampleAfterValue": "2000003",
|
||||
"UMask": "0x1"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Instruction fetch tag lookups that miss in the instruction cache (L1I). Counts at 64-byte cache-line granularity.",
|
||||
"Counter": "0,1,2,3",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0x83",
|
||||
"EventName": "ICACHE_64B.IFTAG_MISS",
|
||||
"SampleAfterValue": "200003",
|
||||
"UMask": "0x2"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Retired Instructions who experienced Instruction L1 Cache true miss.",
|
||||
"Counter": "0,1,2,3",
|
||||
"CounterHTOff": "0,1,2,3",
|
||||
"EventCode": "0xC6",
|
||||
"EventName": "FRONTEND_RETIRED.L1I_MISS",
|
||||
"MSRIndex": "0x3F7",
|
||||
"MSRValue": "0x12",
|
||||
"PEBS": "1",
|
||||
"SampleAfterValue": "100007",
|
||||
"TakenAlone": "1",
|
||||
"UMask": "0x1"
|
||||
}
|
||||
]
|
File diff suppressed because it is too large
Load Diff
|
@ -1,164 +1,116 @@
|
|||
[
|
||||
{
|
||||
"EventCode": "0x28",
|
||||
"UMask": "0x7",
|
||||
"BriefDescription": "Core cycles where the core was running in a manner where Turbo may be clipped to the Non-AVX turbo schedule.",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventName": "CORE_POWER.LVL0_TURBO_LICENSE",
|
||||
"PublicDescription": "Core cycles where the core was running with power-delivery for baseline license level 0. This includes non-AVX codes, SSE, AVX 128-bit, and low-current AVX 256-bit codes.",
|
||||
"SampleAfterValue": "200003",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x28",
|
||||
"UMask": "0x18",
|
||||
"BriefDescription": "Core cycles where the core was running in a manner where Turbo may be clipped to the AVX2 turbo schedule.",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventName": "CORE_POWER.LVL1_TURBO_LICENSE",
|
||||
"PublicDescription": "Core cycles where the core was running with power-delivery for license level 1. This includes high current AVX 256-bit instructions as well as low current AVX 512-bit instructions.",
|
||||
"SampleAfterValue": "200003",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x28",
|
||||
"UMask": "0x20",
|
||||
"BriefDescription": "Core cycles where the core was running in a manner where Turbo may be clipped to the AVX512 turbo schedule.",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventName": "CORE_POWER.LVL2_TURBO_LICENSE",
|
||||
"PublicDescription": "Core cycles where the core was running with power-delivery for license level 2 (introduced in Skylake Server michroarchtecture). This includes high current AVX 512-bit instructions.",
|
||||
"SampleAfterValue": "200003",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x28",
|
||||
"UMask": "0x40",
|
||||
"BriefDescription": "Core cycles the core was throttled due to a pending power level request.",
|
||||
"Counter": "0,1,2,3",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0x28",
|
||||
"EventName": "CORE_POWER.THROTTLE",
|
||||
"PublicDescription": "Core cycles the out-of-order engine was throttled due to a pending power level request.",
|
||||
"SampleAfterValue": "200003",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
"UMask": "0x40"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x32",
|
||||
"UMask": "0x1",
|
||||
"BriefDescription": "Number of PREFETCHNTA instructions executed.",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventName": "SW_PREFETCH_ACCESS.NTA",
|
||||
"SampleAfterValue": "2000003",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x32",
|
||||
"UMask": "0x2",
|
||||
"BriefDescription": "Number of PREFETCHT0 instructions executed.",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventName": "SW_PREFETCH_ACCESS.T0",
|
||||
"SampleAfterValue": "2000003",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x32",
|
||||
"UMask": "0x4",
|
||||
"BriefDescription": "Number of PREFETCHT1 or PREFETCHT2 instructions executed.",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventName": "SW_PREFETCH_ACCESS.T1_T2",
|
||||
"SampleAfterValue": "2000003",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x32",
|
||||
"UMask": "0x8",
|
||||
"BriefDescription": "Number of PREFETCHW instructions executed.",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventName": "SW_PREFETCH_ACCESS.PREFETCHW",
|
||||
"SampleAfterValue": "2000003",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
},
|
||||
{
|
||||
"EventCode": "0xCB",
|
||||
"UMask": "0x1",
|
||||
"BriefDescription": "Number of hardware interrupts received by the processor.",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventName": "HW_INTERRUPTS.RECEIVED",
|
||||
"PublicDescription": "Counts the number of hardware interruptions received by the processor.",
|
||||
"SampleAfterValue": "203",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
},
|
||||
{
|
||||
"EventCode": "0xEF",
|
||||
"UMask": "0x1",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventName": "CORE_SNOOP_RESPONSE.RSP_IHITI",
|
||||
"SampleAfterValue": "2000003",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
},
|
||||
{
|
||||
"EventCode": "0xEF",
|
||||
"UMask": "0x2",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventName": "CORE_SNOOP_RESPONSE.RSP_IHITFSE",
|
||||
"SampleAfterValue": "2000003",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
},
|
||||
{
|
||||
"EventCode": "0xEF",
|
||||
"UMask": "0x4",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventName": "CORE_SNOOP_RESPONSE.RSP_SHITFSE",
|
||||
"SampleAfterValue": "2000003",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
},
|
||||
{
|
||||
"EventCode": "0xEF",
|
||||
"UMask": "0x8",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventName": "CORE_SNOOP_RESPONSE.RSP_SFWDM",
|
||||
"SampleAfterValue": "2000003",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
},
|
||||
{
|
||||
"EventCode": "0xEF",
|
||||
"UMask": "0x10",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventName": "CORE_SNOOP_RESPONSE.RSP_IFWDM",
|
||||
"SampleAfterValue": "2000003",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
},
|
||||
{
|
||||
"EventCode": "0xEF",
|
||||
"UMask": "0x20",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventName": "CORE_SNOOP_RESPONSE.RSP_IFWDFE",
|
||||
"SampleAfterValue": "2000003",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
},
|
||||
{
|
||||
"EventCode": "0xEF",
|
||||
"UMask": "0x40",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventName": "CORE_SNOOP_RESPONSE.RSP_SFWDFE",
|
||||
"SampleAfterValue": "2000003",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
},
|
||||
{
|
||||
"EventCode": "0xFE",
|
||||
"UMask": "0x2",
|
||||
"BriefDescription": "Counts number of cache lines that are allocated and written back to L3 with the intention that they are more likely to be reused shortly",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventName": "IDI_MISC.WB_UPGRADE",
|
||||
"PublicDescription": "Counts number of cache lines that are allocated and written back to L3 with the intention that they are more likely to be reused shortly.",
|
||||
"SampleAfterValue": "100003",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
},
|
||||
{
|
||||
"EventCode": "0xFE",
|
||||
"UMask": "0x4",
|
||||
"BriefDescription": "Counts number of cache lines that are dropped and not written back to L3 as they are deemed to be less likely to be reused shortly",
|
||||
"Counter": "0,1,2,3",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0xFE",
|
||||
"EventName": "IDI_MISC.WB_DOWNGRADE",
|
||||
"PublicDescription": "Counts number of cache lines that are dropped and not written back to L3 as they are deemed to be less likely to be reused shortly.",
|
||||
"SampleAfterValue": "100003",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
"UMask": "0x4"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Number of PREFETCHW instructions executed.",
|
||||
"Counter": "0,1,2,3",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0x32",
|
||||
"EventName": "SW_PREFETCH_ACCESS.PREFETCHW",
|
||||
"SampleAfterValue": "2000003",
|
||||
"UMask": "0x8"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Core cycles where the core was running in a manner where Turbo may be clipped to the Non-AVX turbo schedule.",
|
||||
"Counter": "0,1,2,3",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0x28",
|
||||
"EventName": "CORE_POWER.LVL0_TURBO_LICENSE",
|
||||
"PublicDescription": "Core cycles where the core was running with power-delivery for baseline license level 0. This includes non-AVX codes, SSE, AVX 128-bit, and low-current AVX 256-bit codes.",
|
||||
"SampleAfterValue": "200003",
|
||||
"UMask": "0x7"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Core cycles where the core was running in a manner where Turbo may be clipped to the AVX2 turbo schedule.",
|
||||
"Counter": "0,1,2,3",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0x28",
|
||||
"EventName": "CORE_POWER.LVL1_TURBO_LICENSE",
|
||||
"PublicDescription": "Core cycles where the core was running with power-delivery for license level 1. This includes high current AVX 256-bit instructions as well as low current AVX 512-bit instructions.",
|
||||
"SampleAfterValue": "200003",
|
||||
"UMask": "0x18"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Number of PREFETCHT0 instructions executed.",
|
||||
"Counter": "0,1,2,3",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0x32",
|
||||
"EventName": "SW_PREFETCH_ACCESS.T0",
|
||||
"SampleAfterValue": "2000003",
|
||||
"UMask": "0x2"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Number of hardware interrupts received by the processor.",
|
||||
"Counter": "0,1,2,3",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0xCB",
|
||||
"EventName": "HW_INTERRUPTS.RECEIVED",
|
||||
"PublicDescription": "Counts the number of hardware interruptions received by the processor.",
|
||||
"SampleAfterValue": "203",
|
||||
"UMask": "0x1"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Core cycles where the core was running in a manner where Turbo may be clipped to the AVX512 turbo schedule.",
|
||||
"Counter": "0,1,2,3",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0x28",
|
||||
"EventName": "CORE_POWER.LVL2_TURBO_LICENSE",
|
||||
"PublicDescription": "Core cycles where the core was running with power-delivery for license level 2 (introduced in Skylake Server michroarchtecture). This includes high current AVX 512-bit instructions.",
|
||||
"SampleAfterValue": "200003",
|
||||
"UMask": "0x20"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Number of PREFETCHNTA instructions executed.",
|
||||
"Counter": "0,1,2,3",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0x32",
|
||||
"EventName": "SW_PREFETCH_ACCESS.NTA",
|
||||
"SampleAfterValue": "2000003",
|
||||
"UMask": "0x1"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Number of PREFETCHT1 or PREFETCHT2 instructions executed.",
|
||||
"Counter": "0,1,2,3",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0x32",
|
||||
"EventName": "SW_PREFETCH_ACCESS.T1_T2",
|
||||
"SampleAfterValue": "2000003",
|
||||
"UMask": "0x4"
|
||||
},
|
||||
{
|
||||
"Counter": "0,1,2,3",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0x09",
|
||||
"EventName": "MEMORY_DISAMBIGUATION.HISTORY_RESET",
|
||||
"SampleAfterValue": "2000003",
|
||||
"UMask": "0x1"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Counts number of cache lines that are allocated and written back to L3 with the intention that they are more likely to be reused shortly",
|
||||
"Counter": "0,1,2,3",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0xFE",
|
||||
"EventName": "IDI_MISC.WB_UPGRADE",
|
||||
"PublicDescription": "Counts number of cache lines that are allocated and written back to L3 with the intention that they are more likely to be reused shortly.",
|
||||
"SampleAfterValue": "100003",
|
||||
"UMask": "0x2"
|
||||
}
|
||||
]
|
File diff suppressed because it is too large
Load Diff
|
@ -4,14 +4,14 @@
|
|||
"MetricExpr": "IDQ_UOPS_NOT_DELIVERED.CORE / (4 * cycles)",
|
||||
"MetricGroup": "TopdownL1",
|
||||
"MetricName": "Frontend_Bound",
|
||||
"PublicDescription": "This category represents fraction of slots where the processor's Frontend undersupplies its Backend. Frontend denotes the first part of the processor core responsible to fetch operations that are executed later on by the Backend part. Within the Frontend; a branch predictor predicts the next address to fetch; cache-lines are fetched from the memory subsystem; parsed into instructions; and lastly decoded into micro-ops (uops). Ideally the Frontend can issue 4 uops every cycle to the Backend. Frontend Bound denotes unutilized issue-slots when there is no Backend stall; i.e. bubbles where Frontend delivered no uops while Backend could have accepted them. For example; stalls due to instruction-cache misses would be categorized under Frontend Bound."
|
||||
"PublicDescription": "This category represents fraction of slots where the processor's Frontend undersupplies its Backend. Frontend denotes the first part of the processor core responsible to fetch operations that are executed later on by the Backend part. Within the Frontend; a branch predictor predicts the next address to fetch; cache-lines are fetched from the memory subsystem; parsed into instructions; and lastly decoded into micro-operations (uops). Ideally the Frontend can issue Machine_Width uops every cycle to the Backend. Frontend Bound denotes unutilized issue-slots when there is no Backend stall; i.e. bubbles where Frontend delivered no uops while Backend could have accepted them. For example; stalls due to instruction-cache misses would be categorized under Frontend Bound."
|
||||
},
|
||||
{
|
||||
"BriefDescription": "This category represents fraction of slots where the processor's Frontend undersupplies its Backend. SMT version; use when SMT is enabled and measuring per logical CPU.",
|
||||
"MetricExpr": "IDQ_UOPS_NOT_DELIVERED.CORE / (4 * (( ( CPU_CLK_UNHALTED.THREAD / 2 ) * ( 1 + CPU_CLK_UNHALTED.ONE_THREAD_ACTIVE / CPU_CLK_UNHALTED.REF_XCLK ) )))",
|
||||
"MetricExpr": "IDQ_UOPS_NOT_DELIVERED.CORE / (4 * ( ( CPU_CLK_UNHALTED.THREAD / 2 ) * ( 1 + CPU_CLK_UNHALTED.ONE_THREAD_ACTIVE / CPU_CLK_UNHALTED.REF_XCLK ) ))",
|
||||
"MetricGroup": "TopdownL1_SMT",
|
||||
"MetricName": "Frontend_Bound_SMT",
|
||||
"PublicDescription": "This category represents fraction of slots where the processor's Frontend undersupplies its Backend. Frontend denotes the first part of the processor core responsible to fetch operations that are executed later on by the Backend part. Within the Frontend; a branch predictor predicts the next address to fetch; cache-lines are fetched from the memory subsystem; parsed into instructions; and lastly decoded into micro-ops (uops). Ideally the Frontend can issue 4 uops every cycle to the Backend. Frontend Bound denotes unutilized issue-slots when there is no Backend stall; i.e. bubbles where Frontend delivered no uops while Backend could have accepted them. For example; stalls due to instruction-cache misses would be categorized under Frontend Bound. SMT version; use when SMT is enabled and measuring per logical CPU."
|
||||
"PublicDescription": "This category represents fraction of slots where the processor's Frontend undersupplies its Backend. Frontend denotes the first part of the processor core responsible to fetch operations that are executed later on by the Backend part. Within the Frontend; a branch predictor predicts the next address to fetch; cache-lines are fetched from the memory subsystem; parsed into instructions; and lastly decoded into micro-operations (uops). Ideally the Frontend can issue Machine_Width uops every cycle to the Backend. Frontend Bound denotes unutilized issue-slots when there is no Backend stall; i.e. bubbles where Frontend delivered no uops while Backend could have accepted them. For example; stalls due to instruction-cache misses would be categorized under Frontend Bound. SMT version; use when SMT is enabled and measuring per logical CPU."
|
||||
},
|
||||
{
|
||||
"BriefDescription": "This category represents fraction of slots wasted due to incorrect speculations",
|
||||
|
@ -22,13 +22,14 @@
|
|||
},
|
||||
{
|
||||
"BriefDescription": "This category represents fraction of slots wasted due to incorrect speculations. SMT version; use when SMT is enabled and measuring per logical CPU.",
|
||||
"MetricExpr": "( UOPS_ISSUED.ANY - UOPS_RETIRED.RETIRE_SLOTS + 4 * (( INT_MISC.RECOVERY_CYCLES_ANY / 2 )) ) / (4 * (( ( CPU_CLK_UNHALTED.THREAD / 2 ) * ( 1 + CPU_CLK_UNHALTED.ONE_THREAD_ACTIVE / CPU_CLK_UNHALTED.REF_XCLK ) )))",
|
||||
"MetricExpr": "( UOPS_ISSUED.ANY - UOPS_RETIRED.RETIRE_SLOTS + 4 * ( INT_MISC.RECOVERY_CYCLES_ANY / 2 ) ) / (4 * ( ( CPU_CLK_UNHALTED.THREAD / 2 ) * ( 1 + CPU_CLK_UNHALTED.ONE_THREAD_ACTIVE / CPU_CLK_UNHALTED.REF_XCLK ) ))",
|
||||
"MetricGroup": "TopdownL1_SMT",
|
||||
"MetricName": "Bad_Speculation_SMT",
|
||||
"PublicDescription": "This category represents fraction of slots wasted due to incorrect speculations. This include slots used to issue uops that do not eventually get retired and slots for which the issue-pipeline was blocked due to recovery from earlier incorrect speculation. For example; wasted work due to miss-predicted branches are categorized under Bad Speculation category. Incorrect data speculation followed by Memory Ordering Nukes is another example. SMT version; use when SMT is enabled and measuring per logical CPU."
|
||||
},
|
||||
{
|
||||
"BriefDescription": "This category represents fraction of slots where no uops are being delivered due to a lack of required resources for accepting new uops in the Backend",
|
||||
"MetricConstraint": "NO_NMI_WATCHDOG",
|
||||
"MetricExpr": "1 - ( (IDQ_UOPS_NOT_DELIVERED.CORE / (4 * cycles)) + (( UOPS_ISSUED.ANY - UOPS_RETIRED.RETIRE_SLOTS + 4 * INT_MISC.RECOVERY_CYCLES ) / (4 * cycles)) + (UOPS_RETIRED.RETIRE_SLOTS / (4 * cycles)) )",
|
||||
"MetricGroup": "TopdownL1",
|
||||
"MetricName": "Backend_Bound",
|
||||
|
@ -36,7 +37,7 @@
|
|||
},
|
||||
{
|
||||
"BriefDescription": "This category represents fraction of slots where no uops are being delivered due to a lack of required resources for accepting new uops in the Backend. SMT version; use when SMT is enabled and measuring per logical CPU.",
|
||||
"MetricExpr": "1 - ( (IDQ_UOPS_NOT_DELIVERED.CORE / (4 * (( ( CPU_CLK_UNHALTED.THREAD / 2 ) * ( 1 + CPU_CLK_UNHALTED.ONE_THREAD_ACTIVE / CPU_CLK_UNHALTED.REF_XCLK ) )))) + (( UOPS_ISSUED.ANY - UOPS_RETIRED.RETIRE_SLOTS + 4 * (( INT_MISC.RECOVERY_CYCLES_ANY / 2 )) ) / (4 * (( ( CPU_CLK_UNHALTED.THREAD / 2 ) * ( 1 + CPU_CLK_UNHALTED.ONE_THREAD_ACTIVE / CPU_CLK_UNHALTED.REF_XCLK ) )))) + (UOPS_RETIRED.RETIRE_SLOTS / (4 * (( ( CPU_CLK_UNHALTED.THREAD / 2 ) * ( 1 + CPU_CLK_UNHALTED.ONE_THREAD_ACTIVE / CPU_CLK_UNHALTED.REF_XCLK ) )))) )",
|
||||
"MetricExpr": "1 - ( (IDQ_UOPS_NOT_DELIVERED.CORE / (4 * ( ( CPU_CLK_UNHALTED.THREAD / 2 ) * ( 1 + CPU_CLK_UNHALTED.ONE_THREAD_ACTIVE / CPU_CLK_UNHALTED.REF_XCLK ) ))) + (( UOPS_ISSUED.ANY - UOPS_RETIRED.RETIRE_SLOTS + 4 * ( INT_MISC.RECOVERY_CYCLES_ANY / 2 ) ) / (4 * ( ( CPU_CLK_UNHALTED.THREAD / 2 ) * ( 1 + CPU_CLK_UNHALTED.ONE_THREAD_ACTIVE / CPU_CLK_UNHALTED.REF_XCLK ) ))) + (UOPS_RETIRED.RETIRE_SLOTS / (4 * ( ( CPU_CLK_UNHALTED.THREAD / 2 ) * ( 1 + CPU_CLK_UNHALTED.ONE_THREAD_ACTIVE / CPU_CLK_UNHALTED.REF_XCLK ) ))) )",
|
||||
"MetricGroup": "TopdownL1_SMT",
|
||||
"MetricName": "Backend_Bound_SMT",
|
||||
"PublicDescription": "This category represents fraction of slots where no uops are being delivered due to a lack of required resources for accepting new uops in the Backend. Backend is the portion of the processor core where the out-of-order scheduler dispatches ready uops into their respective execution units; and once completed these uops get retired according to program order. For example; stalls due to data-cache misses or stalls due to the divider unit being overloaded are both categorized under Backend Bound. Backend Bound is further divided into two main categories: Memory Bound and Core Bound. SMT version; use when SMT is enabled and measuring per logical CPU."
|
||||
|
@ -50,7 +51,7 @@
|
|||
},
|
||||
{
|
||||
"BriefDescription": "This category represents fraction of slots utilized by useful work i.e. issued uops that eventually get retired. SMT version; use when SMT is enabled and measuring per logical CPU.",
|
||||
"MetricExpr": "UOPS_RETIRED.RETIRE_SLOTS / (4 * (( ( CPU_CLK_UNHALTED.THREAD / 2 ) * ( 1 + CPU_CLK_UNHALTED.ONE_THREAD_ACTIVE / CPU_CLK_UNHALTED.REF_XCLK ) )))",
|
||||
"MetricExpr": "UOPS_RETIRED.RETIRE_SLOTS / (4 * ( ( CPU_CLK_UNHALTED.THREAD / 2 ) * ( 1 + CPU_CLK_UNHALTED.ONE_THREAD_ACTIVE / CPU_CLK_UNHALTED.REF_XCLK ) ))",
|
||||
"MetricGroup": "TopdownL1_SMT",
|
||||
"MetricName": "Retiring_SMT",
|
||||
"PublicDescription": "This category represents fraction of slots utilized by useful work i.e. issued uops that eventually get retired. Ideally; all pipeline slots would be attributed to the Retiring category. Retiring of 100% would indicate the maximum 4 uops retired per cycle has been achieved. Maximizing Retiring typically increases the Instruction-Per-Cycle metric. Note that a high Retiring value does not necessary mean there is no room for more performance. For example; Microcode assists are categorized under Retiring. They hurt performance and can often be avoided. SMT version; use when SMT is enabled and measuring per logical CPU."
|
||||
|
@ -58,7 +59,7 @@
|
|||
{
|
||||
"BriefDescription": "Instructions Per Cycle (per Logical Processor)",
|
||||
"MetricExpr": "INST_RETIRED.ANY / CPU_CLK_UNHALTED.THREAD",
|
||||
"MetricGroup": "TopDownL1",
|
||||
"MetricGroup": "Summary",
|
||||
"MetricName": "IPC"
|
||||
},
|
||||
{
|
||||
|
@ -73,24 +74,6 @@
|
|||
"MetricGroup": "Branches;Fetch_BW;PGO",
|
||||
"MetricName": "IpTB"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Branch instructions per taken branch. ",
|
||||
"MetricExpr": "BR_INST_RETIRED.ALL_BRANCHES / BR_INST_RETIRED.NEAR_TAKEN",
|
||||
"MetricGroup": "Branches;PGO",
|
||||
"MetricName": "BpTB"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Rough Estimation of fraction of fetched lines bytes that were likely (includes speculatively fetches) consumed by program instructions",
|
||||
"MetricExpr": "min( 1 , UOPS_ISSUED.ANY / ( (UOPS_RETIRED.RETIRE_SLOTS / INST_RETIRED.ANY) * 64 * ( ICACHE_64B.IFTAG_HIT + ICACHE_64B.IFTAG_MISS ) / 4.1 ) )",
|
||||
"MetricGroup": "PGO;IcMiss",
|
||||
"MetricName": "IFetch_Line_Utilization"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Fraction of Uops delivered by the DSB (aka Decoded ICache; or Uop Cache)",
|
||||
"MetricExpr": "IDQ.DSB_UOPS / (IDQ.DSB_UOPS + IDQ.MITE_UOPS + IDQ.MS_UOPS)",
|
||||
"MetricGroup": "DSB;Fetch_BW",
|
||||
"MetricName": "DSB_Coverage"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Cycles Per Instruction (per Logical Processor)",
|
||||
"MetricExpr": "1 / (INST_RETIRED.ANY / cycles)",
|
||||
|
@ -104,86 +87,104 @@
|
|||
"MetricName": "CLKS"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Total issue-pipeline slots (per-Physical Core)",
|
||||
"BriefDescription": "Total issue-pipeline slots (per-Physical Core till ICL; per-Logical Processor ICL onward)",
|
||||
"MetricExpr": "4 * cycles",
|
||||
"MetricGroup": "TopDownL1",
|
||||
"MetricName": "SLOTS"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Total issue-pipeline slots (per-Physical Core)",
|
||||
"MetricExpr": "4 * (( ( CPU_CLK_UNHALTED.THREAD / 2 ) * ( 1 + CPU_CLK_UNHALTED.ONE_THREAD_ACTIVE / CPU_CLK_UNHALTED.REF_XCLK ) ))",
|
||||
"BriefDescription": "Total issue-pipeline slots (per-Physical Core till ICL; per-Logical Processor ICL onward)",
|
||||
"MetricExpr": "4 * ( ( CPU_CLK_UNHALTED.THREAD / 2 ) * ( 1 + CPU_CLK_UNHALTED.ONE_THREAD_ACTIVE / CPU_CLK_UNHALTED.REF_XCLK ) )",
|
||||
"MetricGroup": "TopDownL1_SMT",
|
||||
"MetricName": "SLOTS_SMT"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Instructions per Load (lower number means higher occurance rate)",
|
||||
"BriefDescription": "Instructions per Load (lower number means higher occurrence rate)",
|
||||
"MetricExpr": "INST_RETIRED.ANY / MEM_INST_RETIRED.ALL_LOADS",
|
||||
"MetricGroup": "Instruction_Type",
|
||||
"MetricName": "IpL"
|
||||
"MetricName": "IpLoad"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Instructions per Store (lower number means higher occurance rate)",
|
||||
"BriefDescription": "Instructions per Store (lower number means higher occurrence rate)",
|
||||
"MetricExpr": "INST_RETIRED.ANY / MEM_INST_RETIRED.ALL_STORES",
|
||||
"MetricGroup": "Instruction_Type",
|
||||
"MetricName": "IpS"
|
||||
"MetricName": "IpStore"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Instructions per Branch (lower number means higher occurance rate)",
|
||||
"BriefDescription": "Instructions per Branch (lower number means higher occurrence rate)",
|
||||
"MetricExpr": "INST_RETIRED.ANY / BR_INST_RETIRED.ALL_BRANCHES",
|
||||
"MetricGroup": "Branches;Instruction_Type",
|
||||
"MetricName": "IpB"
|
||||
"MetricName": "IpBranch"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Instruction per (near) call (lower number means higher occurance rate)",
|
||||
"BriefDescription": "Instructions per (near) call (lower number means higher occurrence rate)",
|
||||
"MetricExpr": "INST_RETIRED.ANY / BR_INST_RETIRED.NEAR_CALL",
|
||||
"MetricGroup": "Branches",
|
||||
"MetricName": "IpCall"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Branch instructions per taken branch. ",
|
||||
"MetricExpr": "BR_INST_RETIRED.ALL_BRANCHES / BR_INST_RETIRED.NEAR_TAKEN",
|
||||
"MetricGroup": "Branches;PGO",
|
||||
"MetricName": "BpTkBranch"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Instructions per Floating Point (FP) Operation (lower number means higher occurrence rate)",
|
||||
"MetricExpr": "INST_RETIRED.ANY / ( 1 * ( FP_ARITH_INST_RETIRED.SCALAR_SINGLE + FP_ARITH_INST_RETIRED.SCALAR_DOUBLE ) + 2 * FP_ARITH_INST_RETIRED.128B_PACKED_DOUBLE + 4 * ( FP_ARITH_INST_RETIRED.128B_PACKED_SINGLE + FP_ARITH_INST_RETIRED.256B_PACKED_DOUBLE ) + 8 * ( FP_ARITH_INST_RETIRED.256B_PACKED_SINGLE + FP_ARITH_INST_RETIRED.512B_PACKED_DOUBLE ) + 16 * FP_ARITH_INST_RETIRED.512B_PACKED_SINGLE )",
|
||||
"MetricGroup": "FLOPS;FP_Arith;Instruction_Type",
|
||||
"MetricName": "IpFLOP"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Total number of retired Instructions",
|
||||
"MetricExpr": "INST_RETIRED.ANY",
|
||||
"MetricGroup": "Summary",
|
||||
"MetricGroup": "Summary;TopDownL1",
|
||||
"MetricName": "Instructions"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Fraction of Uops delivered by the DSB (aka Decoded ICache; or Uop Cache)",
|
||||
"MetricExpr": "IDQ.DSB_UOPS / (IDQ.DSB_UOPS + IDQ.MITE_UOPS + IDQ.MS_UOPS)",
|
||||
"MetricGroup": "DSB;Fetch_BW",
|
||||
"MetricName": "DSB_Coverage"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Instructions Per Cycle (per physical core)",
|
||||
"MetricExpr": "INST_RETIRED.ANY / cycles",
|
||||
"MetricGroup": "SMT",
|
||||
"MetricGroup": "SMT;TopDownL1",
|
||||
"MetricName": "CoreIPC"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Instructions Per Cycle (per physical core)",
|
||||
"MetricExpr": "INST_RETIRED.ANY / (( ( CPU_CLK_UNHALTED.THREAD / 2 ) * ( 1 + CPU_CLK_UNHALTED.ONE_THREAD_ACTIVE / CPU_CLK_UNHALTED.REF_XCLK ) ))",
|
||||
"MetricGroup": "SMT",
|
||||
"MetricExpr": "INST_RETIRED.ANY / ( ( CPU_CLK_UNHALTED.THREAD / 2 ) * ( 1 + CPU_CLK_UNHALTED.ONE_THREAD_ACTIVE / CPU_CLK_UNHALTED.REF_XCLK ) )",
|
||||
"MetricGroup": "SMT;TopDownL1",
|
||||
"MetricName": "CoreIPC_SMT"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Floating Point Operations Per Cycle",
|
||||
"MetricExpr": "(( 1 * ( FP_ARITH_INST_RETIRED.SCALAR_SINGLE + FP_ARITH_INST_RETIRED.SCALAR_DOUBLE ) + 2 * FP_ARITH_INST_RETIRED.128B_PACKED_DOUBLE + 4 * ( FP_ARITH_INST_RETIRED.128B_PACKED_SINGLE + FP_ARITH_INST_RETIRED.256B_PACKED_DOUBLE ) + 8 * ( FP_ARITH_INST_RETIRED.256B_PACKED_SINGLE + FP_ARITH_INST_RETIRED.512B_PACKED_DOUBLE ) + 16 * FP_ARITH_INST_RETIRED.512B_PACKED_SINGLE )) / cycles",
|
||||
"MetricExpr": "( 1 * ( FP_ARITH_INST_RETIRED.SCALAR_SINGLE + FP_ARITH_INST_RETIRED.SCALAR_DOUBLE ) + 2 * FP_ARITH_INST_RETIRED.128B_PACKED_DOUBLE + 4 * ( FP_ARITH_INST_RETIRED.128B_PACKED_SINGLE + FP_ARITH_INST_RETIRED.256B_PACKED_DOUBLE ) + 8 * ( FP_ARITH_INST_RETIRED.256B_PACKED_SINGLE + FP_ARITH_INST_RETIRED.512B_PACKED_DOUBLE ) + 16 * FP_ARITH_INST_RETIRED.512B_PACKED_SINGLE ) / cycles",
|
||||
"MetricGroup": "FLOPS",
|
||||
"MetricName": "FLOPc"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Floating Point Operations Per Cycle",
|
||||
"MetricExpr": "(( 1 * ( FP_ARITH_INST_RETIRED.SCALAR_SINGLE + FP_ARITH_INST_RETIRED.SCALAR_DOUBLE ) + 2 * FP_ARITH_INST_RETIRED.128B_PACKED_DOUBLE + 4 * ( FP_ARITH_INST_RETIRED.128B_PACKED_SINGLE + FP_ARITH_INST_RETIRED.256B_PACKED_DOUBLE ) + 8 * ( FP_ARITH_INST_RETIRED.256B_PACKED_SINGLE + FP_ARITH_INST_RETIRED.512B_PACKED_DOUBLE ) + 16 * FP_ARITH_INST_RETIRED.512B_PACKED_SINGLE )) / (( ( CPU_CLK_UNHALTED.THREAD / 2 ) * ( 1 + CPU_CLK_UNHALTED.ONE_THREAD_ACTIVE / CPU_CLK_UNHALTED.REF_XCLK ) ))",
|
||||
"MetricExpr": "( 1 * ( FP_ARITH_INST_RETIRED.SCALAR_SINGLE + FP_ARITH_INST_RETIRED.SCALAR_DOUBLE ) + 2 * FP_ARITH_INST_RETIRED.128B_PACKED_DOUBLE + 4 * ( FP_ARITH_INST_RETIRED.128B_PACKED_SINGLE + FP_ARITH_INST_RETIRED.256B_PACKED_DOUBLE ) + 8 * ( FP_ARITH_INST_RETIRED.256B_PACKED_SINGLE + FP_ARITH_INST_RETIRED.512B_PACKED_DOUBLE ) + 16 * FP_ARITH_INST_RETIRED.512B_PACKED_SINGLE ) / ( ( CPU_CLK_UNHALTED.THREAD / 2 ) * ( 1 + CPU_CLK_UNHALTED.ONE_THREAD_ACTIVE / CPU_CLK_UNHALTED.REF_XCLK ) )",
|
||||
"MetricGroup": "FLOPS_SMT",
|
||||
"MetricName": "FLOPc_SMT"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Instruction-Level-Parallelism (average number of uops executed when there is at least 1 uop executed)",
|
||||
"MetricExpr": "UOPS_EXECUTED.THREAD / (( UOPS_EXECUTED.CORE_CYCLES_GE_1 / 2 ) if #SMT_on else UOPS_EXECUTED.CORE_CYCLES_GE_1)",
|
||||
"MetricGroup": "Pipeline",
|
||||
"MetricExpr": "UOPS_EXECUTED.THREAD / ( UOPS_EXECUTED.CORE_CYCLES_GE_1 / 2 )",
|
||||
"MetricGroup": "Pipeline;Ports_Utilization",
|
||||
"MetricName": "ILP"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Branch Misprediction Cost: Fraction of TopDown slots wasted per non-speculative branch misprediction (jeclear)",
|
||||
"MetricExpr": "( ((BR_MISP_RETIRED.ALL_BRANCHES / ( BR_MISP_RETIRED.ALL_BRANCHES + MACHINE_CLEARS.COUNT )) * (( UOPS_ISSUED.ANY - UOPS_RETIRED.RETIRE_SLOTS + 4 * INT_MISC.RECOVERY_CYCLES ) / (4 * cycles))) + (4 * IDQ_UOPS_NOT_DELIVERED.CYCLES_0_UOPS_DELIV.CORE / (4 * cycles)) * (( INT_MISC.CLEAR_RESTEER_CYCLES + 9 * BACLEARS.ANY ) / cycles) / (4 * IDQ_UOPS_NOT_DELIVERED.CYCLES_0_UOPS_DELIV.CORE / (4 * cycles)) ) * (4 * cycles) / BR_MISP_RETIRED.ALL_BRANCHES",
|
||||
"MetricExpr": "( ((BR_MISP_RETIRED.ALL_BRANCHES / ( BR_MISP_RETIRED.ALL_BRANCHES + MACHINE_CLEARS.COUNT )) * (( UOPS_ISSUED.ANY - UOPS_RETIRED.RETIRE_SLOTS + 4 * INT_MISC.RECOVERY_CYCLES ) / (4 * cycles))) + (4 * ( IDQ_UOPS_NOT_DELIVERED.CYCLES_0_UOPS_DELIV.CORE - ( FRONTEND_RETIRED.LATENCY_GE_1 - FRONTEND_RETIRED.LATENCY_GE_2 ) / (UOPS_RETIRED.RETIRE_SLOTS / UOPS_ISSUED.ANY) ) / (4 * cycles)) * (( INT_MISC.CLEAR_RESTEER_CYCLES + 9 * BACLEARS.ANY ) / cycles) / (4 * ( IDQ_UOPS_NOT_DELIVERED.CYCLES_0_UOPS_DELIV.CORE - ( FRONTEND_RETIRED.LATENCY_GE_1 - FRONTEND_RETIRED.LATENCY_GE_2 ) / (UOPS_RETIRED.RETIRE_SLOTS / UOPS_ISSUED.ANY) ) / (4 * cycles)) ) * (4 * cycles) / BR_MISP_RETIRED.ALL_BRANCHES",
|
||||
"MetricGroup": "BrMispredicts",
|
||||
"MetricName": "Branch_Misprediction_Cost"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Branch Misprediction Cost: Fraction of TopDown slots wasted per non-speculative branch misprediction (jeclear)",
|
||||
"MetricExpr": "( ((BR_MISP_RETIRED.ALL_BRANCHES / ( BR_MISP_RETIRED.ALL_BRANCHES + MACHINE_CLEARS.COUNT )) * (( UOPS_ISSUED.ANY - UOPS_RETIRED.RETIRE_SLOTS + 4 * (( INT_MISC.RECOVERY_CYCLES_ANY / 2 )) ) / (4 * (( ( CPU_CLK_UNHALTED.THREAD / 2 ) * ( 1 + CPU_CLK_UNHALTED.ONE_THREAD_ACTIVE / CPU_CLK_UNHALTED.REF_XCLK ) ))))) + (4 * IDQ_UOPS_NOT_DELIVERED.CYCLES_0_UOPS_DELIV.CORE / (4 * (( ( CPU_CLK_UNHALTED.THREAD / 2 ) * ( 1 + CPU_CLK_UNHALTED.ONE_THREAD_ACTIVE / CPU_CLK_UNHALTED.REF_XCLK ) )))) * (( INT_MISC.CLEAR_RESTEER_CYCLES + 9 * BACLEARS.ANY ) / cycles) / (4 * IDQ_UOPS_NOT_DELIVERED.CYCLES_0_UOPS_DELIV.CORE / (4 * (( ( CPU_CLK_UNHALTED.THREAD / 2 ) * ( 1 + CPU_CLK_UNHALTED.ONE_THREAD_ACTIVE / CPU_CLK_UNHALTED.REF_XCLK ) )))) ) * (4 * (( ( CPU_CLK_UNHALTED.THREAD / 2 ) * ( 1 + CPU_CLK_UNHALTED.ONE_THREAD_ACTIVE / CPU_CLK_UNHALTED.REF_XCLK ) ))) / BR_MISP_RETIRED.ALL_BRANCHES",
|
||||
"MetricExpr": "( ((BR_MISP_RETIRED.ALL_BRANCHES / ( BR_MISP_RETIRED.ALL_BRANCHES + MACHINE_CLEARS.COUNT )) * (( UOPS_ISSUED.ANY - UOPS_RETIRED.RETIRE_SLOTS + 4 * ( INT_MISC.RECOVERY_CYCLES_ANY / 2 ) ) / (4 * ( ( CPU_CLK_UNHALTED.THREAD / 2 ) * ( 1 + CPU_CLK_UNHALTED.ONE_THREAD_ACTIVE / CPU_CLK_UNHALTED.REF_XCLK ) )))) + (4 * ( IDQ_UOPS_NOT_DELIVERED.CYCLES_0_UOPS_DELIV.CORE - ( FRONTEND_RETIRED.LATENCY_GE_1 - FRONTEND_RETIRED.LATENCY_GE_2 ) / (UOPS_RETIRED.RETIRE_SLOTS / UOPS_ISSUED.ANY) ) / (4 * ( ( CPU_CLK_UNHALTED.THREAD / 2 ) * ( 1 + CPU_CLK_UNHALTED.ONE_THREAD_ACTIVE / CPU_CLK_UNHALTED.REF_XCLK ) ))) * (( INT_MISC.CLEAR_RESTEER_CYCLES + 9 * BACLEARS.ANY ) / cycles) / (4 * ( IDQ_UOPS_NOT_DELIVERED.CYCLES_0_UOPS_DELIV.CORE - ( FRONTEND_RETIRED.LATENCY_GE_1 - FRONTEND_RETIRED.LATENCY_GE_2 ) / (UOPS_RETIRED.RETIRE_SLOTS / UOPS_ISSUED.ANY) ) / (4 * ( ( CPU_CLK_UNHALTED.THREAD / 2 ) * ( 1 + CPU_CLK_UNHALTED.ONE_THREAD_ACTIVE / CPU_CLK_UNHALTED.REF_XCLK ) ))) ) * (4 * ( ( CPU_CLK_UNHALTED.THREAD / 2 ) * ( 1 + CPU_CLK_UNHALTED.ONE_THREAD_ACTIVE / CPU_CLK_UNHALTED.REF_XCLK ) )) / BR_MISP_RETIRED.ALL_BRANCHES",
|
||||
"MetricGroup": "BrMispredicts_SMT",
|
||||
"MetricName": "Branch_Misprediction_Cost_SMT"
|
||||
},
|
||||
|
@ -213,14 +214,14 @@
|
|||
},
|
||||
{
|
||||
"BriefDescription": "Utilization of the core's Page Walker(s) serving STLB misses triggered by instruction/Load/Store accesses",
|
||||
"MetricConstraint": "NO_NMI_WATCHDOG",
|
||||
"MetricExpr": "( ITLB_MISSES.WALK_PENDING + DTLB_LOAD_MISSES.WALK_PENDING + DTLB_STORE_MISSES.WALK_PENDING + EPT.WALK_PENDING ) / ( 2 * cycles )",
|
||||
"MetricGroup": "TLB",
|
||||
"MetricName": "Page_Walks_Utilization",
|
||||
"MetricConstraint": "NO_NMI_WATCHDOG"
|
||||
"MetricName": "Page_Walks_Utilization"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Utilization of the core's Page Walker(s) serving STLB misses triggered by instruction/Load/Store accesses",
|
||||
"MetricExpr": "( ITLB_MISSES.WALK_PENDING + DTLB_LOAD_MISSES.WALK_PENDING + DTLB_STORE_MISSES.WALK_PENDING + EPT.WALK_PENDING ) / ( 2 * (( ( CPU_CLK_UNHALTED.THREAD / 2 ) * ( 1 + CPU_CLK_UNHALTED.ONE_THREAD_ACTIVE / CPU_CLK_UNHALTED.REF_XCLK ) )) )",
|
||||
"MetricExpr": "( ITLB_MISSES.WALK_PENDING + DTLB_LOAD_MISSES.WALK_PENDING + DTLB_STORE_MISSES.WALK_PENDING + EPT.WALK_PENDING ) / ( 2 * ( ( CPU_CLK_UNHALTED.THREAD / 2 ) * ( 1 + CPU_CLK_UNHALTED.ONE_THREAD_ACTIVE / CPU_CLK_UNHALTED.REF_XCLK ) ) )",
|
||||
"MetricGroup": "TLB_SMT",
|
||||
"MetricName": "Page_Walks_Utilization_SMT"
|
||||
},
|
||||
|
@ -245,7 +246,7 @@
|
|||
{
|
||||
"BriefDescription": "Average per-core data fill bandwidth to the L3 cache [GB / sec]",
|
||||
"MetricExpr": "64 * OFFCORE_REQUESTS.ALL_REQUESTS / 1000000000 / duration_time",
|
||||
"MetricGroup": "Memory_BW",
|
||||
"MetricGroup": "Memory_BW;Offcore",
|
||||
"MetricName": "L3_Cache_Access_BW"
|
||||
},
|
||||
{
|
||||
|
@ -263,7 +264,7 @@
|
|||
{
|
||||
"BriefDescription": "L2 cache misses per kilo instruction for all request types (including speculative)",
|
||||
"MetricExpr": "1000 * L2_RQSTS.MISS / INST_RETIRED.ANY",
|
||||
"MetricGroup": "Cache_Misses",
|
||||
"MetricGroup": "Cache_Misses;Offcore",
|
||||
"MetricName": "L2MPKI_All"
|
||||
},
|
||||
{
|
||||
|
@ -298,7 +299,7 @@
|
|||
},
|
||||
{
|
||||
"BriefDescription": "Giga Floating Point Operations Per Second",
|
||||
"MetricExpr": "( (( 1 * ( FP_ARITH_INST_RETIRED.SCALAR_SINGLE + FP_ARITH_INST_RETIRED.SCALAR_DOUBLE ) + 2 * FP_ARITH_INST_RETIRED.128B_PACKED_DOUBLE + 4 * ( FP_ARITH_INST_RETIRED.128B_PACKED_SINGLE + FP_ARITH_INST_RETIRED.256B_PACKED_DOUBLE ) + 8 * ( FP_ARITH_INST_RETIRED.256B_PACKED_SINGLE + FP_ARITH_INST_RETIRED.512B_PACKED_DOUBLE ) + 16 * FP_ARITH_INST_RETIRED.512B_PACKED_SINGLE )) / 1000000000 ) / duration_time",
|
||||
"MetricExpr": "( ( 1 * ( FP_ARITH_INST_RETIRED.SCALAR_SINGLE + FP_ARITH_INST_RETIRED.SCALAR_DOUBLE ) + 2 * FP_ARITH_INST_RETIRED.128B_PACKED_DOUBLE + 4 * ( FP_ARITH_INST_RETIRED.128B_PACKED_SINGLE + FP_ARITH_INST_RETIRED.256B_PACKED_DOUBLE ) + 8 * ( FP_ARITH_INST_RETIRED.256B_PACKED_SINGLE + FP_ARITH_INST_RETIRED.512B_PACKED_DOUBLE ) + 16 * FP_ARITH_INST_RETIRED.512B_PACKED_SINGLE ) / 1000000000 ) / duration_time",
|
||||
"MetricGroup": "FLOPS;Summary",
|
||||
"MetricName": "GFLOPs"
|
||||
},
|
||||
|
@ -310,44 +311,56 @@
|
|||
},
|
||||
{
|
||||
"BriefDescription": "Fraction of cycles where both hardware Logical Processors were active",
|
||||
"MetricExpr": "1 - CPU_CLK_THREAD_UNHALTED.ONE_THREAD_ACTIVE / ( CPU_CLK_THREAD_UNHALTED.REF_XCLK_ANY / 2 ) if #SMT_on else 0",
|
||||
"MetricExpr": "1 - CPU_CLK_THREAD_UNHALTED.ONE_THREAD_ACTIVE / ( CPU_CLK_THREAD_UNHALTED.REF_XCLK_ANY / 2 )",
|
||||
"MetricGroup": "SMT;Summary",
|
||||
"MetricName": "SMT_2T_Utilization"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Fraction of cycles spent in Kernel mode",
|
||||
"BriefDescription": "Fraction of cycles spent in the Operating System (OS) Kernel mode",
|
||||
"MetricExpr": "CPU_CLK_UNHALTED.THREAD:k / CPU_CLK_UNHALTED.THREAD",
|
||||
"MetricGroup": "Summary",
|
||||
"MetricGroup": "OS",
|
||||
"MetricName": "Kernel_Utilization"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Average external Memory Bandwidth Use for reads and writes [GB / sec]",
|
||||
"MetricExpr": "( 64 * ( uncore_imc@cas_count_read@ + uncore_imc@cas_count_write@ ) / 1000000000 ) / duration_time",
|
||||
"MetricGroup": "Memory_BW",
|
||||
"MetricGroup": "Memory_BW;SoC",
|
||||
"MetricName": "DRAM_BW_Use"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Average latency of data read request to external memory (in nanoseconds). Accounts for demand loads and L1/L2 prefetches",
|
||||
"MetricExpr": "1000000000 * ( cha@event\\=0x36\\,umask\\=0x21@ / cha@event\\=0x35\\,umask\\=0x21@ ) / ( cha_0@event\\=0x0@ / duration_time )",
|
||||
"MetricGroup": "Memory_Lat",
|
||||
"MetricName": "DRAM_Read_Latency"
|
||||
"MetricExpr": "1000000000 * ( cha@event\\=0x36\\,umask\\=0x21\\,config\\=0x40433@ / cha@event\\=0x35\\,umask\\=0x21\\,config\\=0x40433@ ) / ( cha_0@event\\=0x0@ / duration_time )",
|
||||
"MetricGroup": "Memory_Lat;SoC",
|
||||
"MetricName": "MEM_Read_Latency"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Average number of parallel data read requests to external memory. Accounts for demand loads and L1/L2 prefetches",
|
||||
"MetricExpr": "cha@event\\=0x36\\,umask\\=0x21@ / cha@event\\=0x36\\,umask\\=0x21\\,thresh\\=1@",
|
||||
"MetricGroup": "Memory_BW",
|
||||
"MetricName": "DRAM_Parallel_Reads"
|
||||
"MetricExpr": "cha@event\\=0x36\\,umask\\=0x21\\,config\\=0x40433@ / cha@event\\=0x36\\,umask\\=0x21\\,config\\=0x40433\\,thresh\\=1@",
|
||||
"MetricGroup": "Memory_BW;SoC",
|
||||
"MetricName": "MEM_Parallel_Reads"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Average IO (network or disk) Bandwidth Use for Writes [GB / sec]",
|
||||
"MetricExpr": "( UNC_IIO_DATA_REQ_OF_CPU.MEM_READ.PART0 + UNC_IIO_DATA_REQ_OF_CPU.MEM_READ.PART1 + UNC_IIO_DATA_REQ_OF_CPU.MEM_READ.PART2 + UNC_IIO_DATA_REQ_OF_CPU.MEM_READ.PART3 ) * 4 / 1000000000 / duration_time",
|
||||
"MetricGroup": "IO_BW;SoC;Server",
|
||||
"MetricName": "IO_Write_BW"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Average IO (network or disk) Bandwidth Use for Reads [GB / sec]",
|
||||
"MetricExpr": "( UNC_IIO_DATA_REQ_OF_CPU.MEM_WRITE.PART0 + UNC_IIO_DATA_REQ_OF_CPU.MEM_WRITE.PART1 + UNC_IIO_DATA_REQ_OF_CPU.MEM_WRITE.PART2 + UNC_IIO_DATA_REQ_OF_CPU.MEM_WRITE.PART3 ) * 4 / 1000000000 / duration_time",
|
||||
"MetricGroup": "IO_BW;SoC;Server",
|
||||
"MetricName": "IO_Read_BW"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Socket actual clocks when any core is active on that socket",
|
||||
"MetricExpr": "cha_0@event\\=0x0@",
|
||||
"MetricGroup": "",
|
||||
"MetricGroup": "SoC",
|
||||
"MetricName": "Socket_CLKS"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Instructions per Far Branch ( Far Branches apply upon transition from application to operating system, handling interrupts, exceptions. )",
|
||||
"BriefDescription": "Instructions per Far Branch ( Far Branches apply upon transition from application to operating system, handling interrupts, exceptions) [lower number means higher occurrence rate]",
|
||||
"MetricExpr": "INST_RETIRED.ANY / ( BR_INST_RETIRED.FAR_BRANCH / 2 )",
|
||||
"MetricGroup": "",
|
||||
"MetricGroup": "Branches;OS",
|
||||
"MetricName": "IpFarBranch"
|
||||
},
|
||||
{
|
||||
|
|
|
@ -93,16 +93,6 @@
|
|||
"UMask": "0xF",
|
||||
"Unit": "iMC"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "read requests to memory controller. Derived from unc_m_cas_count.rd",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventCode": "0x4",
|
||||
"EventName": "LLC_MISSES.MEM_READ",
|
||||
"PerPkg": "1",
|
||||
"ScaleUnit": "64Bytes",
|
||||
"UMask": "0x3",
|
||||
"Unit": "iMC"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "All DRAM Read CAS Commands issued (does not include underfills)",
|
||||
"Counter": "0,1,2,3",
|
||||
|
@ -124,13 +114,13 @@
|
|||
"Unit": "iMC"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "write requests to memory controller. Derived from unc_m_cas_count.wr",
|
||||
"BriefDescription": "DRAM CAS (Column Address Strobe) Commands.; DRAM WR_CAS (w/ and w/out auto-pre) in Write Major Mode",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventCode": "0x4",
|
||||
"EventName": "LLC_MISSES.MEM_WRITE",
|
||||
"EventName": "UNC_M_CAS_COUNT.WR_WMM",
|
||||
"PerPkg": "1",
|
||||
"ScaleUnit": "64Bytes",
|
||||
"UMask": "0xC",
|
||||
"PublicDescription": "Counts the total number or DRAM Write CAS commands issued on this channel while in Write-Major-Mode.",
|
||||
"UMask": "0x4",
|
||||
"Unit": "iMC"
|
||||
},
|
||||
{
|
||||
|
@ -166,7 +156,7 @@
|
|||
"EventCode": "0x81",
|
||||
"EventName": "UNC_M_WPQ_OCCUPANCY",
|
||||
"PerPkg": "1",
|
||||
"PublicDescription": "Counts the number of entries in the Write Pending Queue (WPQ) at each cycle. This can then be used to calculate both the average queue occupancy (in conjunction with the number of cycles not empty) and the average latency (in conjunction with the number of allocations). The WPQ is used to schedule writes out to the memory controller and to track the requests.",
|
||||
"PublicDescription": "Counts the number of entries in the Write Pending Queue (WPQ) at each cycle. This can then be used to calculate both the average queue occupancy (in conjunction with the number of cycles not empty) and the average latency (in conjunction with the number of allocations). The WPQ is used to schedule writes out to the memory controller and to track the requests. Requests allocate into the WPQ soon after they enter the memory controller, and need credits for an entry in this buffer before being sent from the CHA to the iMC (memory controller). They deallocate after being issued to DRAM. Write requests themselves are able to complete (from the perspective of the rest of the system) as soon they have 'posted' to the iMC. This is not to be confused with actually performing the write to DRAM. Therefore, the average latency for this queue is actually not useful for deconstruction intermediate write latencies. So, we provide filtering based on if the request has posted or not. By using the 'not posted' filter, we can track how long writes spent in the iMC before completions were sent to the HA. The 'posted' filter, on the other hand, provides information about how much queueing is actually happenning in the iMC for writes before they are actually issued to memory. High average occupancies will generally coincide with high write major mode counts. Is there a filter of sorts???",
|
||||
"Unit": "iMC"
|
||||
}
|
||||
]
|
||||
|
|
|
@ -119,9 +119,57 @@
|
|||
"EventName": "UPI_DATA_BANDWIDTH_TX",
|
||||
"PerPkg": "1",
|
||||
"ScaleUnit": "7.11E-06Bytes",
|
||||
"UMask": "0x0F",
|
||||
"UMask": "0xf",
|
||||
"Unit": "UPI LL"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "PCI Express bandwidth reading at IIO, part 0",
|
||||
"Counter": "0,1",
|
||||
"EventCode": "0x83",
|
||||
"EventName": "UNC_IIO_DATA_REQ_OF_CPU.MEM_READ.PART0",
|
||||
"FCMask": "0x07",
|
||||
"PerPkg": "1",
|
||||
"PortMask": "0x01",
|
||||
"ScaleUnit": "4Bytes",
|
||||
"UMask": "0x04",
|
||||
"Unit": "IIO"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "PCI Express bandwidth reading at IIO, part 1",
|
||||
"Counter": "0,1",
|
||||
"EventCode": "0x83",
|
||||
"EventName": "UNC_IIO_DATA_REQ_OF_CPU.MEM_READ.PART1",
|
||||
"FCMask": "0x07",
|
||||
"PerPkg": "1",
|
||||
"PortMask": "0x02",
|
||||
"ScaleUnit": "4Bytes",
|
||||
"UMask": "0x04",
|
||||
"Unit": "IIO"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "PCI Express bandwidth reading at IIO, part 2",
|
||||
"Counter": "0,1",
|
||||
"EventCode": "0x83",
|
||||
"EventName": "UNC_IIO_DATA_REQ_OF_CPU.MEM_READ.PART2",
|
||||
"FCMask": "0x07",
|
||||
"PerPkg": "1",
|
||||
"PortMask": "0x04",
|
||||
"ScaleUnit": "4Bytes",
|
||||
"UMask": "0x04",
|
||||
"Unit": "IIO"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "PCI Express bandwidth reading at IIO, part 3",
|
||||
"Counter": "0,1",
|
||||
"EventCode": "0x83",
|
||||
"EventName": "UNC_IIO_DATA_REQ_OF_CPU.MEM_READ.PART3",
|
||||
"FCMask": "0x07",
|
||||
"PerPkg": "1",
|
||||
"PortMask": "0x08",
|
||||
"ScaleUnit": "4Bytes",
|
||||
"UMask": "0x04",
|
||||
"Unit": "IIO"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "PCI Express bandwidth reading at IIO. Derived from unc_iio_data_req_of_cpu.mem_read.part0",
|
||||
"Counter": "0,1",
|
||||
|
@ -137,29 +185,12 @@
|
|||
"UMask": "0x04",
|
||||
"Unit": "IIO"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "PCI Express bandwidth writing at IIO. Derived from unc_iio_data_req_of_cpu.mem_write.part0",
|
||||
"Counter": "0,1",
|
||||
"EventCode": "0x83",
|
||||
"EventName": "LLC_MISSES.PCIE_WRITE",
|
||||
"FCMask": "0x07",
|
||||
"Filter": "ch_mask=0x1f",
|
||||
"MetricExpr": "UNC_IIO_DATA_REQ_OF_CPU.MEM_WRITE.PART0 +UNC_IIO_DATA_REQ_OF_CPU.MEM_WRITE.PART1 +UNC_IIO_DATA_REQ_OF_CPU.MEM_WRITE.PART2 +UNC_IIO_DATA_REQ_OF_CPU.MEM_WRITE.PART3",
|
||||
"MetricName": "LLC_MISSES.PCIE_WRITE",
|
||||
"PerPkg": "1",
|
||||
"PortMask": "0x01",
|
||||
"ScaleUnit": "4Bytes",
|
||||
"UMask": "0x01",
|
||||
"Unit": "IIO"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "PCI Express bandwidth writing at IIO, part 0",
|
||||
"Counter": "0,1",
|
||||
"EventCode": "0x83",
|
||||
"EventName": "UNC_IIO_DATA_REQ_OF_CPU.MEM_WRITE.PART0",
|
||||
"FCMask": "0x07",
|
||||
"MetricExpr": "UNC_IIO_DATA_REQ_OF_CPU.MEM_WRITE.PART0 +UNC_IIO_DATA_REQ_OF_CPU.MEM_WRITE.PART1 +UNC_IIO_DATA_REQ_OF_CPU.MEM_WRITE.PART2 +UNC_IIO_DATA_REQ_OF_CPU.MEM_WRITE.PART3",
|
||||
"MetricName": "LLC_MISSES.PCIE_WRITE",
|
||||
"PerPkg": "1",
|
||||
"PortMask": "0x01",
|
||||
"ScaleUnit": "4Bytes",
|
||||
|
@ -203,53 +234,18 @@
|
|||
"Unit": "IIO"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "PCI Express bandwidth reading at IIO, part 0",
|
||||
"BriefDescription": "PCI Express bandwidth writing at IIO. Derived from unc_iio_data_req_of_cpu.mem_write.part0",
|
||||
"Counter": "0,1",
|
||||
"EventCode": "0x83",
|
||||
"EventName": "UNC_IIO_DATA_REQ_OF_CPU.MEM_READ.PART0",
|
||||
"EventName": "LLC_MISSES.PCIE_WRITE",
|
||||
"FCMask": "0x07",
|
||||
"MetricExpr": "UNC_IIO_DATA_REQ_OF_CPU.MEM_READ.PART0 + UNC_IIO_DATA_REQ_OF_CPU.MEM_READ.PART1 + UNC_IIO_DATA_REQ_OF_CPU.MEM_READ.PART2 + UNC_IIO_DATA_REQ_OF_CPU.MEM_READ.PART3",
|
||||
"MetricName": "LLC_MISSES.PCIE_READ",
|
||||
"Filter": "ch_mask=0x1f",
|
||||
"MetricExpr": "UNC_IIO_DATA_REQ_OF_CPU.MEM_WRITE.PART0 +UNC_IIO_DATA_REQ_OF_CPU.MEM_WRITE.PART1 +UNC_IIO_DATA_REQ_OF_CPU.MEM_WRITE.PART2 +UNC_IIO_DATA_REQ_OF_CPU.MEM_WRITE.PART3",
|
||||
"MetricName": "LLC_MISSES.PCIE_WRITE",
|
||||
"PerPkg": "1",
|
||||
"PortMask": "0x01",
|
||||
"ScaleUnit": "4Bytes",
|
||||
"UMask": "0x04",
|
||||
"Unit": "IIO"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "PCI Express bandwidth reading at IIO, part 1",
|
||||
"Counter": "0,1",
|
||||
"EventCode": "0x83",
|
||||
"EventName": "UNC_IIO_DATA_REQ_OF_CPU.MEM_READ.PART1",
|
||||
"FCMask": "0x07",
|
||||
"PerPkg": "1",
|
||||
"PortMask": "0x02",
|
||||
"ScaleUnit": "4Bytes",
|
||||
"UMask": "0x04",
|
||||
"Unit": "IIO"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "PCI Express bandwidth reading at IIO, part 2",
|
||||
"Counter": "0,1",
|
||||
"EventCode": "0x83",
|
||||
"EventName": "UNC_IIO_DATA_REQ_OF_CPU.MEM_READ.PART2",
|
||||
"FCMask": "0x07",
|
||||
"PerPkg": "1",
|
||||
"PortMask": "0x04",
|
||||
"ScaleUnit": "4Bytes",
|
||||
"UMask": "0x04",
|
||||
"Unit": "IIO"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "PCI Express bandwidth reading at IIO, part 3",
|
||||
"Counter": "0,1",
|
||||
"EventCode": "0x83",
|
||||
"EventName": "UNC_IIO_DATA_REQ_OF_CPU.MEM_READ.PART3",
|
||||
"FCMask": "0x07",
|
||||
"PerPkg": "1",
|
||||
"PortMask": "0x08",
|
||||
"ScaleUnit": "4Bytes",
|
||||
"UMask": "0x04",
|
||||
"UMask": "0x01",
|
||||
"Unit": "IIO"
|
||||
},
|
||||
{
|
||||
|
@ -312,6 +308,16 @@
|
|||
"UMask": "0x02",
|
||||
"Unit": "CHA"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "FaST wire asserted; Horizontal",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventCode": "0xA5",
|
||||
"EventName": "UNC_CHA_FAST_ASSERTED.HORZ",
|
||||
"PerPkg": "1",
|
||||
"PublicDescription": "Counts the number of cycles either the local or incoming distress signals are asserted. Incoming distress includes up, dn and across.",
|
||||
"UMask": "0x02",
|
||||
"Unit": "CHA"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Read request from a remote socket which hit in the HitMe Cache to a line In the E state",
|
||||
"Counter": "0,1,2,3",
|
||||
|
@ -342,6 +348,46 @@
|
|||
"UMask": "0x01",
|
||||
"Unit": "CHA"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Lines Victimized; Lines in E state",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventCode": "0x37",
|
||||
"EventName": "UNC_CHA_LLC_VICTIMS.TOTAL_E",
|
||||
"PerPkg": "1",
|
||||
"PublicDescription": "Counts the number of lines that were victimized on a fill. This can be filtered by the state that the line was in.",
|
||||
"UMask": "0x02",
|
||||
"Unit": "CHA"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Lines Victimized; Lines in F State",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventCode": "0x37",
|
||||
"EventName": "UNC_CHA_LLC_VICTIMS.TOTAL_F",
|
||||
"PerPkg": "1",
|
||||
"PublicDescription": "Counts the number of lines that were victimized on a fill. This can be filtered by the state that the line was in.",
|
||||
"UMask": "0x08",
|
||||
"Unit": "CHA"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Lines Victimized; Lines in M state",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventCode": "0x37",
|
||||
"EventName": "UNC_CHA_LLC_VICTIMS.TOTAL_M",
|
||||
"PerPkg": "1",
|
||||
"PublicDescription": "Counts the number of lines that were victimized on a fill. This can be filtered by the state that the line was in.",
|
||||
"UMask": "0x01",
|
||||
"Unit": "CHA"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Lines Victimized; Lines in S State",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventCode": "0x37",
|
||||
"EventName": "UNC_CHA_LLC_VICTIMS.TOTAL_S",
|
||||
"PerPkg": "1",
|
||||
"PublicDescription": "Counts the number of lines that were victimized on a fill. This can be filtered by the state that the line was in.",
|
||||
"UMask": "0x04",
|
||||
"Unit": "CHA"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Number of times that an RFO hit in S state.",
|
||||
"Counter": "0,1,2,3",
|
||||
|
@ -372,6 +418,65 @@
|
|||
"UMask": "0x20",
|
||||
"Unit": "CHA"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Ingress (from CMS) Allocations; IRQ",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventCode": "0x13",
|
||||
"EventName": "UNC_CHA_RxC_INSERTS.IRQ",
|
||||
"PerPkg": "1",
|
||||
"PublicDescription": "Counts number of allocations per cycle into the specified Ingress queue.",
|
||||
"UMask": "0x01",
|
||||
"Unit": "CHA"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Ingress (from CMS) Request Queue Rejects; PhyAddr Match",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventCode": "0x19",
|
||||
"EventName": "UNC_CHA_RxC_IRQ1_REJECT.PA_MATCH",
|
||||
"PerPkg": "1",
|
||||
"PublicDescription": "Ingress (from CMS) Request Queue Rejects; PhyAddr Match",
|
||||
"UMask": "0x80",
|
||||
"Unit": "CHA"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Ingress (from CMS) Occupancy; IRQ",
|
||||
"EventCode": "0x11",
|
||||
"EventName": "UNC_CHA_RxC_OCCUPANCY.IRQ",
|
||||
"PerPkg": "1",
|
||||
"PublicDescription": "Counts number of entries in the specified Ingress queue in each cycle.",
|
||||
"UMask": "0x01",
|
||||
"Unit": "CHA"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Snoop filter capacity evictions for E-state entries.",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventCode": "0x3D",
|
||||
"EventName": "UNC_CHA_SF_EVICTION.E_STATE",
|
||||
"PerPkg": "1",
|
||||
"PublicDescription": "Counts snoop filter capacity evictions for entries tracking exclusive lines in the cores cache. Snoop filter capacity evictions occur when the snoop filter is full and evicts an existing entry to track a new entry. Does not count clean evictions such as when a cores cache replaces a tracked cacheline with a new cacheline.",
|
||||
"UMask": "0x02",
|
||||
"Unit": "CHA"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Snoop filter capacity evictions for M-state entries.",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventCode": "0x3D",
|
||||
"EventName": "UNC_CHA_SF_EVICTION.M_STATE",
|
||||
"PerPkg": "1",
|
||||
"PublicDescription": "Counts snoop filter capacity evictions for entries tracking modified lines in the cores cache. Snoop filter capacity evictions occur when the snoop filter is full and evicts an existing entry to track a new entry. Does not count clean evictions such as when a cores cache replaces a tracked cacheline with a new cacheline.",
|
||||
"UMask": "0x01",
|
||||
"Unit": "CHA"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Snoop filter capacity evictions for S-state entries.",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventCode": "0x3D",
|
||||
"EventName": "UNC_CHA_SF_EVICTION.S_STATE",
|
||||
"PerPkg": "1",
|
||||
"PublicDescription": "Counts snoop filter capacity evictions for entries tracking shared lines in the cores cache. Snoop filter capacity evictions occur when the snoop filter is full and evicts an existing entry to track a new entry. Does not count clean evictions such as when a cores cache replaces a tracked cacheline with a new cacheline.",
|
||||
"UMask": "0x04",
|
||||
"Unit": "CHA"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "RspCnflct* Snoop Responses Received",
|
||||
"Counter": "0,1,2,3",
|
||||
|
@ -449,7 +554,7 @@
|
|||
"FCMask": "0x07",
|
||||
"PerPkg": "1",
|
||||
"PortMask": "0x01",
|
||||
"PublicDescription": "Counts every read request for 4 bytes of data made by a unit on the main die (generally a core) to the MMIO space of a card on IIO Part0. In the general case, Part0 refers to a standard PCIe card of any size (x16,x8,x4) that is plugged directly into one of the PCIe slots. Part0 could also refer to any device plugged into the first slot of a PCIe riser card or to a device attached to the IIO unit which starts its use of the bus using lane 0 of the 16 lanes supported by the bus.",
|
||||
"PublicDescription": "Counts every read request for 4 bytes of data made by a unit on the main die (generally a core) or by another IIO unit to the MMIO space of a card on IIO Part0. In the general case, Part0 refers to a standard PCIe card of any size (x16,x8,x4) that is plugged directly into one of the PCIe slots. Part0 could also refer to any device plugged into the first slot of a PCIe riser card or to a device attached to the IIO unit which starts its use of the bus using lane 0 of the 16 lanes supported by the bus.",
|
||||
"UMask": "0x04",
|
||||
"Unit": "IIO"
|
||||
},
|
||||
|
@ -461,7 +566,7 @@
|
|||
"FCMask": "0x07",
|
||||
"PerPkg": "1",
|
||||
"PortMask": "0x02",
|
||||
"PublicDescription": "Counts every read request for 4 bytes of data made by a unit on the main die (generally a core) to the MMIO space of a card on IIO Part1. In the general case, Part1 refers to a x4 PCIe card plugged into the second slot of a PCIe riser card, but it could refer to any x4 device attached to the IIO unit using lanes starting at lane 4 of the 16 lanes supported by the bus.",
|
||||
"PublicDescription": "Counts every read request for 4 bytes of data made by a unit on the main die (generally a core) or by another IIO unit to the MMIO space of a card on IIO Part1. In the general case, Part1 refers to a x4 PCIe card plugged into the second slot of a PCIe riser card, but it could refer to any x4 device attached to the IIO unit using lanes starting at lane 4 of the 16 lanes supported by the bus.",
|
||||
"UMask": "0x04",
|
||||
"Unit": "IIO"
|
||||
},
|
||||
|
@ -473,7 +578,7 @@
|
|||
"FCMask": "0x07",
|
||||
"PerPkg": "1",
|
||||
"PortMask": "0x04",
|
||||
"PublicDescription": "Counts every read request for 4 bytes of data made by a unit on the main die (generally a core) to the MMIO space of a card on IIO Part2. In the general case, Part2 refers to a x4 or x8 PCIe card plugged into the third slot of a PCIe riser card, but it could refer to any x4 or x8 device attached to the IIO unit and using lanes starting at lane 8 of the 16 lanes supported by the bus.",
|
||||
"PublicDescription": "Counts every read request for 4 bytes of data made by a unit on the main die (generally a core) or by another IIO unit to the MMIO space of a card on IIO Part2. In the general case, Part2 refers to a x4 or x8 PCIe card plugged into the third slot of a PCIe riser card, but it could refer to any x4 or x8 device attached to the IIO unit and using lanes starting at lane 8 of the 16 lanes supported by the bus.",
|
||||
"UMask": "0x04",
|
||||
"Unit": "IIO"
|
||||
},
|
||||
|
@ -485,7 +590,7 @@
|
|||
"FCMask": "0x07",
|
||||
"PerPkg": "1",
|
||||
"PortMask": "0x08",
|
||||
"PublicDescription": "Counts every read request for 4 bytes of data made by a unit on the main die (generally a core) to the MMIO space of a card on IIO Part3. In the general case, Part3 refers to a x4 PCIe card plugged into the fourth slot of a PCIe riser card, but it could brefer to any device attached to the IIO unit using the lanes starting at lane 12 of the 16 lanes supported by the bus.",
|
||||
"PublicDescription": "Counts every read request for 4 bytes of data made by a unit on the main die (generally a core) or by another IIO unit to the MMIO space of a card on IIO Part3. In the general case, Part3 refers to a x4 PCIe card plugged into the fourth slot of a PCIe riser card, but it could brefer to any device attached to the IIO unit using the lanes starting at lane 12 of the 16 lanes supported by the bus.",
|
||||
"UMask": "0x04",
|
||||
"Unit": "IIO"
|
||||
},
|
||||
|
@ -497,7 +602,7 @@
|
|||
"FCMask": "0x07",
|
||||
"PerPkg": "1",
|
||||
"PortMask": "0x01",
|
||||
"PublicDescription": "Counts every write request of 4 bytes of data made to the MMIO space of a card on IIO Part0 by a unit on the main die (generally a core). In the general case, Part0 refers to a standard PCIe card of any size (x16,x8,x4) that is plugged directly into one of the PCIe slots. Part0 could also refer to any device plugged into the first slot of a PCIe riser card or to a device attached to the IIO unit which starts its use of the bus using lane 0 of the 16 lanes supported by the bus.",
|
||||
"PublicDescription": "Counts every write request of 4 bytes of data made to the MMIO space of a card on IIO Part0 by a unit on the main die (generally a core) or by another IIO unit. In the general case, Part0 refers to a standard PCIe card of any size (x16,x8,x4) that is plugged directly into one of the PCIe slots. Part0 could also refer to any device plugged into the first slot of a PCIe riser card or to a device attached to the IIO unit which starts its use of the bus using lane 0 of the 16 lanes supported by the bus.",
|
||||
"UMask": "0x01",
|
||||
"Unit": "IIO"
|
||||
},
|
||||
|
@ -509,7 +614,7 @@
|
|||
"FCMask": "0x07",
|
||||
"PerPkg": "1",
|
||||
"PortMask": "0x02",
|
||||
"PublicDescription": "Counts every write request of 4 bytes of data made to the MMIO space of a card on IIO Part1 by a unit on the main die (generally a core). In the general case, Part1 refers to a x4 PCIe card plugged into the second slot of a PCIe riser card, but it could refer to any x4 device attached to the IIO unit using lanes starting at lane 4 of the 16 lanes supported by the bus.",
|
||||
"PublicDescription": "Counts every write request of 4 bytes of data made to the MMIO space of a card on IIO Part1 by a unit on the main die (generally a core) or by another IIO unit. In the general case, Part1 refers to a x4 PCIe card plugged into the second slot of a PCIe riser card, but it could refer to any x4 device attached to the IIO unit using lanes starting at lane 4 of the 16 lanes supported by the bus.",
|
||||
"UMask": "0x01",
|
||||
"Unit": "IIO"
|
||||
},
|
||||
|
@ -521,7 +626,7 @@
|
|||
"FCMask": "0x07",
|
||||
"PerPkg": "1",
|
||||
"PortMask": "0x04",
|
||||
"PublicDescription": "Counts every write request of 4 bytes of data made to the MMIO space of a card on IIO Part2 by a unit on the main die (generally a core). In the general case, Part2 refers to a x4 or x8 PCIe card plugged into the third slot of a PCIe riser card, but it could refer to any x4 or x8 device attached to the IIO unit and using lanes starting at lane 8 of the 16 lanes supported by the bus.",
|
||||
"PublicDescription": "Counts every write request of 4 bytes of data made to the MMIO space of a card on IIO Part2 by a unit on the main die (generally a core) or by another IIO unit. In the general case, Part2 refers to a x4 or x8 PCIe card plugged into the third slot of a PCIe riser card, but it could refer to any x4 or x8 device attached to the IIO unit and using lanes starting at lane 8 of the 16 lanes supported by the bus.",
|
||||
"UMask": "0x01",
|
||||
"Unit": "IIO"
|
||||
},
|
||||
|
@ -533,10 +638,202 @@
|
|||
"FCMask": "0x07",
|
||||
"PerPkg": "1",
|
||||
"PortMask": "0x08",
|
||||
"PublicDescription": "Counts every write request of 4 bytes of data made to the MMIO space of a card on IIO Part3 by a unit on the main die (generally a core). In the general case, Part3 refers to a x4 PCIe card plugged into the fourth slot of a PCIe riser card, but it could brefer to any device attached to the IIO unit using the lanes starting at lane 12 of the 16 lanes supported by the bus.",
|
||||
"PublicDescription": "Counts every write request of 4 bytes of data made to the MMIO space of a card on IIO Part3 by a unit on the main die (generally a core) or by another IIO unit. In the general case, Part3 refers to a x4 PCIe card plugged into the fourth slot of a PCIe riser card, but it could brefer to any device attached to the IIO unit using the lanes starting at lane 12 of the 16 lanes supported by the bus.",
|
||||
"UMask": "0x01",
|
||||
"Unit": "IIO"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Peer to peer read request for 4 bytes made by a different IIO unit to IIO Part0",
|
||||
"Counter": "2,3",
|
||||
"EventCode": "0xC0",
|
||||
"EventName": "UNC_IIO_DATA_REQ_BY_CPU.PEER_READ.PART0",
|
||||
"FCMask": "0x07",
|
||||
"PerPkg": "1",
|
||||
"PortMask": "0x01",
|
||||
"PublicDescription": "Counts ever peer to peer read request for 4 bytes of data made by a different IIO unit to the MMIO space of a card on IIO Part0. Does not include requests made by the same IIO unit. In the general case, Part0 refers to a standard PCIe card of any size (x16,x8,x4) that is plugged directly into one of the PCIe slots. Part0 could also refer to any device plugged into the first slot of a PCIe riser card or to a device attached to the IIO unit which starts its use of the bus using lane 0 of the 16 lanes supported by the bus.",
|
||||
"UMask": "0x08",
|
||||
"Unit": "IIO"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Peer to peer read request for 4 bytes made by a different IIO unit to IIO Part1",
|
||||
"Counter": "2,3",
|
||||
"EventCode": "0xC0",
|
||||
"EventName": "UNC_IIO_DATA_REQ_BY_CPU.PEER_READ.PART1",
|
||||
"FCMask": "0x07",
|
||||
"PerPkg": "1",
|
||||
"PortMask": "0x02",
|
||||
"PublicDescription": "Counts ever peer to peer read request for 4 bytes of data made by a different IIO unit to the MMIO space of a card on IIO Part1. Does not include requests made by the same IIO unit. In the general case, Part1 refers to a x4 PCIe card plugged into the second slot of a PCIe riser card, but it could refer to any x4 device attached to the IIO unit using lanes starting at lane 4 of the 16 lanes supported by the bus.",
|
||||
"UMask": "0x08",
|
||||
"Unit": "IIO"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Peer to peer read request for 4 bytes made by a different IIO unit to IIO Part2",
|
||||
"Counter": "2,3",
|
||||
"EventCode": "0xC0",
|
||||
"EventName": "UNC_IIO_DATA_REQ_BY_CPU.PEER_READ.PART2",
|
||||
"FCMask": "0x07",
|
||||
"PerPkg": "1",
|
||||
"PortMask": "0x04",
|
||||
"PublicDescription": "Counts ever peer to peer read request for 4 bytes of data made by a different IIO unit to the MMIO space of a card on IIO Part2. Does not include requests made by the same IIO unit. In the general case, Part2 refers to a x4 or x8 PCIe card plugged into the third slot of a PCIe riser card, but it could refer to any x4 or x8 device attached to the IIO unit and using lanes starting at lane 8 of the 16 lanes supported by the bus.",
|
||||
"UMask": "0x08",
|
||||
"Unit": "IIO"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Peer to peer read request for 4 bytes made by a different IIO unit to IIO Part3",
|
||||
"Counter": "2,3",
|
||||
"EventCode": "0xC0",
|
||||
"EventName": "UNC_IIO_DATA_REQ_BY_CPU.PEER_READ.PART3",
|
||||
"FCMask": "0x07",
|
||||
"PerPkg": "1",
|
||||
"PortMask": "0x08",
|
||||
"PublicDescription": "Counts ever peer to peer read request for 4 bytes of data made by a different IIO unit to the MMIO space of a card on IIO Part3. Does not include requests made by the same IIO unit. In the general case, Part3 refers to a x4 PCIe card plugged into the fourth slot of a PCIe riser card, but it could brefer to any device attached to the IIO unit using the lanes starting at lane 12 of the 16 lanes supported by the bus.",
|
||||
"UMask": "0x08",
|
||||
"Unit": "IIO"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Peer to peer write request of 4 bytes made to IIO Part0 by a different IIO unit",
|
||||
"Counter": "2,3",
|
||||
"EventCode": "0xC0",
|
||||
"EventName": "UNC_IIO_DATA_REQ_BY_CPU.PEER_WRITE.PART0",
|
||||
"FCMask": "0x07",
|
||||
"PerPkg": "1",
|
||||
"PortMask": "0x01",
|
||||
"PublicDescription": "Counts every peer to peer write request of 4 bytes of data made to the MMIO space of a card on IIO Part0 by a different IIO unit. Does not include requests made by the same IIO unit. In the general case, Part0 refers to a standard PCIe card of any size (x16,x8,x4) that is plugged directly into one of the PCIe slots. Part0 could also refer to any device plugged into the first slot of a PCIe riser card or to a device attached to the IIO unit which starts its use of the bus using lane 0 of the 16 lanes supported by the bus.",
|
||||
"UMask": "0x02",
|
||||
"Unit": "IIO"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Peer to peer write request of 4 bytes made to IIO Part1 by a different IIO unit",
|
||||
"Counter": "2,3",
|
||||
"EventCode": "0xC0",
|
||||
"EventName": "UNC_IIO_DATA_REQ_BY_CPU.PEER_WRITE.PART1",
|
||||
"FCMask": "0x07",
|
||||
"PerPkg": "1",
|
||||
"PortMask": "0x02",
|
||||
"PublicDescription": "Counts every peer to peer write request of 4 bytes of data made to the MMIO space of a card on IIO Part1 by a different IIO unit. Does not include requests made by the same IIO unit. In the general case, Part1 refers to a x4 PCIe card plugged into the second slot of a PCIe riser card, but it could refer to any x4 device attached to the IIO unit using lanes starting at lane 4 of the 16 lanes supported by the bus.",
|
||||
"UMask": "0x02",
|
||||
"Unit": "IIO"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Peer to peer write request of 4 bytes made to IIO Part2 by a different IIO unit",
|
||||
"Counter": "2,3",
|
||||
"EventCode": "0xC0",
|
||||
"EventName": "UNC_IIO_DATA_REQ_BY_CPU.PEER_WRITE.PART2",
|
||||
"FCMask": "0x07",
|
||||
"PerPkg": "1",
|
||||
"PortMask": "0x04",
|
||||
"PublicDescription": "Counts every peer to peer write request of 4 bytes of data made to the MMIO space of a card on IIO Part2 by a different IIO unit. Does not include requests made by the same IIO unit. In the general case, Part2 refers to a x4 or x8 PCIe card plugged into the third slot of a PCIe riser card, but it could refer to any x4 or x8 device attached to the IIO unit and using lanes starting at lane 8 of the 16 lanes supported by the bus.",
|
||||
"UMask": "0x02",
|
||||
"Unit": "IIO"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Peer to peer write request of 4 bytes made to IIO Part3 by a different IIO unit",
|
||||
"Counter": "2,3",
|
||||
"EventCode": "0xC0",
|
||||
"EventName": "UNC_IIO_DATA_REQ_BY_CPU.PEER_WRITE.PART3",
|
||||
"FCMask": "0x07",
|
||||
"PerPkg": "1",
|
||||
"PortMask": "0x08",
|
||||
"PublicDescription": "Counts every peer to peer write request of 4 bytes of data made to the MMIO space of a card on IIO Part3 by a different IIO unit. Does not include requests made by the same IIO unit. In the general case, Part3 refers to a x4 PCIe card plugged into the fourth slot of a PCIe riser card, but it could brefer to any device attached to the IIO unit using the lanes starting at lane 12 of the 16 lanes supported by the bus.",
|
||||
"UMask": "0x02",
|
||||
"Unit": "IIO"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Peer to peer read request for 4 bytes made by IIO Part0 to an IIO target",
|
||||
"Counter": "0,1",
|
||||
"EventCode": "0x83",
|
||||
"EventName": "UNC_IIO_DATA_REQ_OF_CPU.PEER_READ.PART0",
|
||||
"FCMask": "0x07",
|
||||
"PerPkg": "1",
|
||||
"PortMask": "0x01",
|
||||
"PublicDescription": "Counts every peer to peer read request for 4 bytes of data made by IIO Part0 to the MMIO space of an IIO target. In the general case, Part0 refers to a standard PCIe card of any size (x16,x8,x4) that is plugged directly into one of the PCIe slots. Part0 could also refer to any device plugged into the first slot of a PCIe riser card or to a device attached to the IIO unit which starts its use of the bus using lane 0 of the 16 lanes supported by the bus.",
|
||||
"UMask": "0x08",
|
||||
"Unit": "IIO"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Peer to peer read request for 4 bytes made by IIO Part1 to an IIO target",
|
||||
"Counter": "0,1",
|
||||
"EventCode": "0x83",
|
||||
"EventName": "UNC_IIO_DATA_REQ_OF_CPU.PEER_READ.PART1",
|
||||
"FCMask": "0x07",
|
||||
"PerPkg": "1",
|
||||
"PortMask": "0x02",
|
||||
"PublicDescription": "Counts every peer to peer read request for 4 bytes of data made by IIO Part1 to the MMIO space of an IIO target. In the general case, Part1 refers to a x4 PCIe card plugged into the second slot of a PCIe riser card, but it could refer to any x4 device attached to the IIO unit using lanes starting at lane 4 of the 16 lanes supported by the bus.",
|
||||
"UMask": "0x08",
|
||||
"Unit": "IIO"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Peer to peer read request for 4 bytes made by IIO Part2 to an IIO target",
|
||||
"Counter": "0,1",
|
||||
"EventCode": "0x83",
|
||||
"EventName": "UNC_IIO_DATA_REQ_OF_CPU.PEER_READ.PART2",
|
||||
"FCMask": "0x07",
|
||||
"PerPkg": "1",
|
||||
"PortMask": "0x04",
|
||||
"PublicDescription": "Counts every peer to peer read request for 4 bytes of data made by IIO Part2 to the MMIO space of an IIO target. In the general case, Part2 refers to a x4 or x8 PCIe card plugged into the third slot of a PCIe riser card, but it could refer to any x4 or x8 device attached to the IIO unit and using lanes starting at lane 8 of the 16 lanes supported by the bus.",
|
||||
"UMask": "0x08",
|
||||
"Unit": "IIO"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Peer to peer read request for 4 bytes made by IIO Part3 to an IIO target",
|
||||
"Counter": "0,1",
|
||||
"EventCode": "0x83",
|
||||
"EventName": "UNC_IIO_DATA_REQ_OF_CPU.PEER_READ.PART3",
|
||||
"FCMask": "0x07",
|
||||
"PerPkg": "1",
|
||||
"PortMask": "0x08",
|
||||
"PublicDescription": "Counts every peer to peer read request for 4 bytes of data made by IIO Part3 to the MMIO space of an IIO target. In the general case, Part3 refers to a x4 PCIe card plugged into the fourth slot of a PCIe riser card, but it could brefer to any device attached to the IIO unit using the lanes starting at lane 12 of the 16 lanes supported by the bus.",
|
||||
"UMask": "0x08",
|
||||
"Unit": "IIO"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Peer to peer write request of 4 bytes made by IIO Part0 to an IIO target",
|
||||
"Counter": "0,1",
|
||||
"EventCode": "0x83",
|
||||
"EventName": "UNC_IIO_DATA_REQ_OF_CPU.PEER_WRITE.PART0",
|
||||
"FCMask": "0x07",
|
||||
"PerPkg": "1",
|
||||
"PortMask": "0x01",
|
||||
"PublicDescription": "Counts every peer to peer write request of 4 bytes of data made by IIO Part0 to the MMIO space of an IIO target. In the general case, Part0 refers to a standard PCIe card of any size (x16,x8,x4) that is plugged directly into one of the PCIe slots. Part0 could also refer to any device plugged into the first slot of a PCIe riser card or to a device attached to the IIO unit which starts its use of the bus using lane 0 of the 16 lanes supported by the bus.",
|
||||
"UMask": "0x02",
|
||||
"Unit": "IIO"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Peer to peer write request of 4 bytes made by IIO Part0 to an IIO target",
|
||||
"Counter": "0,1",
|
||||
"EventCode": "0x83",
|
||||
"EventName": "UNC_IIO_DATA_REQ_OF_CPU.PEER_WRITE.PART1",
|
||||
"FCMask": "0x07",
|
||||
"PerPkg": "1",
|
||||
"PortMask": "0x02",
|
||||
"PublicDescription": "Counts every peer to peer write request of 4 bytes of data made by IIO Part1 to the MMIO space of an IIO target. In the general case, Part1 refers to a x4 PCIe card plugged into the second slot of a PCIe riser card, but it could refer to any x4 device attached to the IIO unit using lanes starting at lane 4 of the 16 lanes supported by the bus.",
|
||||
"UMask": "0x02",
|
||||
"Unit": "IIO"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Peer to peer write request of 4 bytes made by IIO Part0 to an IIO target",
|
||||
"Counter": "0,1",
|
||||
"EventCode": "0x83",
|
||||
"EventName": "UNC_IIO_DATA_REQ_OF_CPU.PEER_WRITE.PART2",
|
||||
"FCMask": "0x07",
|
||||
"PerPkg": "1",
|
||||
"PortMask": "0x04",
|
||||
"PublicDescription": "Counts every peer to peer write request of 4 bytes of data made by IIO Part2 to the MMIO space of an IIO target. In the general case, Part2 refers to a x4 or x8 PCIe card plugged into the third slot of a PCIe riser card, but it could refer to any x4 or x8 device attached to the IIO unit and using lanes starting at lane 8 of the 16 lanes supported by the bus.",
|
||||
"UMask": "0x02",
|
||||
"Unit": "IIO"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Peer to peer write request of 4 bytes made by IIO Part0 to an IIO target",
|
||||
"Counter": "0,1",
|
||||
"EventCode": "0x83",
|
||||
"EventName": "UNC_IIO_DATA_REQ_OF_CPU.PEER_WRITE.PART3",
|
||||
"FCMask": "0x07",
|
||||
"PerPkg": "1",
|
||||
"PortMask": "0x08",
|
||||
"PublicDescription": "Counts every peer to peer write request of 4 bytes of data made by IIO Part3 to the MMIO space of an IIO target. In the general case, Part3 refers to a x4 PCIe card plugged into the fourth slot of a PCIe riser card, but it could brefer to any device attached to the IIO unit using the lanes starting at lane 12 of the 16 lanes supported by the bus.",
|
||||
"UMask": "0x02",
|
||||
"Unit": "IIO"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Read request for up to a 64 byte transaction is made by the CPU to IIO Part0",
|
||||
"Counter": "0,1,2,3",
|
||||
|
@ -545,7 +842,7 @@
|
|||
"FCMask": "0x07",
|
||||
"PerPkg": "1",
|
||||
"PortMask": "0x01",
|
||||
"PublicDescription": "Counts every read request for up to a 64 byte transaction of data made by a unit on the main die (generally a core) to the MMIO space of a card on IIO Part0. In the general case, part0 refers to a standard PCIe card of any size (x16,x8,x4) that is plugged directly into one of the PCIe slots. Part0 could also refer to any device plugged into the first slot of a PCIe riser card or to a device attached to the IIO unit which starts its use of the bus using lane 0 of the 16 lanes supported by the bus.",
|
||||
"PublicDescription": "Counts every read request for up to a 64 byte transaction of data made by a unit on the main die (generally a core) or by another IIO unit to the MMIO space of a card on IIO Part0. In the general case, part0 refers to a standard PCIe card of any size (x16,x8,x4) that is plugged directly into one of the PCIe slots. Part0 could also refer to any device plugged into the first slot of a PCIe riser card or to a device attached to the IIO unit which starts its use of the bus using lane 0 of the 16 lanes supported by the bus.",
|
||||
"UMask": "0x04",
|
||||
"Unit": "IIO"
|
||||
},
|
||||
|
@ -557,7 +854,7 @@
|
|||
"FCMask": "0x07",
|
||||
"PerPkg": "1",
|
||||
"PortMask": "0x02",
|
||||
"PublicDescription": "Counts every read request for up to a 64 byte transaction of data made by a unit on the main die (generally a core) to the MMIO space of a card on IIO Part1. In the general case, Part1 refers to a x4 PCIe card plugged into the second slot of a PCIe riser card, but it could refer to any x4 device attached to the IIO unit using lanes starting at lane 4 of the 16 lanes supported by the bus.",
|
||||
"PublicDescription": "Counts every read request for up to a 64 byte transaction of data made by a unit on the main die (generally a core) or by another IIO unit to the MMIO space of a card on IIO Part1. In the general case, Part1 refers to a x4 PCIe card plugged into the second slot of a PCIe riser card, but it could refer to any x4 device attached to the IIO unit using lanes starting at lane 4 of the 16 lanes supported by the bus.",
|
||||
"UMask": "0x04",
|
||||
"Unit": "IIO"
|
||||
},
|
||||
|
@ -569,7 +866,7 @@
|
|||
"FCMask": "0x07",
|
||||
"PerPkg": "1",
|
||||
"PortMask": "0x04",
|
||||
"PublicDescription": "Counts every read request for up to a 64 byte transaction of data made by a unit on the main die (generally a core) to the MMIO space of a card on IIO Part2. In the general case, Part2 refers to a x4 or x8 PCIe card plugged into the third slot of a PCIe riser card, but it could refer to any x4 or x8 device attached to the IIO unit and using lanes starting at lane 8 of the 16 lanes supported by the bus.",
|
||||
"PublicDescription": "Counts every read request for up to a 64 byte transaction of data made by a unit on the main die (generally a core) or by another IIO unit to the MMIO space of a card on IIO Part2. In the general case, Part2 refers to a x4 or x8 PCIe card plugged into the third slot of a PCIe riser card, but it could refer to any x4 or x8 device attached to the IIO unit and using lanes starting at lane 8 of the 16 lanes supported by the bus.",
|
||||
"UMask": "0x04",
|
||||
"Unit": "IIO"
|
||||
},
|
||||
|
@ -581,7 +878,7 @@
|
|||
"FCMask": "0x07",
|
||||
"PerPkg": "1",
|
||||
"PortMask": "0x08",
|
||||
"PublicDescription": "Counts every read request for up to a 64 byte transaction of data made by a unit on the main die (generally a core) to the MMIO space of a card on IIO Part3. In the general case, Part3 refers to a x4 PCIe card plugged into the fourth slot of a PCIe riser card, but it could brefer to any device attached to the IIO unit using the lanes starting at lane 12 of the 16 lanes supported by the bus.",
|
||||
"PublicDescription": "Counts every read request for up to a 64 byte transaction of data made by a unit on the main die (generally a core) or by another IIO unit to the MMIO space of a card on IIO Part3. In the general case, Part3 refers to a x4 PCIe card plugged into the fourth slot of a PCIe riser card, but it could brefer to any device attached to the IIO unit using the lanes starting at lane 12 of the 16 lanes supported by the bus.",
|
||||
"UMask": "0x04",
|
||||
"Unit": "IIO"
|
||||
},
|
||||
|
@ -593,7 +890,7 @@
|
|||
"FCMask": "0x07",
|
||||
"PerPkg": "1",
|
||||
"PortMask": "0x01",
|
||||
"PublicDescription": "Counts every write request of up to a 64 byte transaction of data made to the MMIO space of a card on IIO Part0 by a unit on the main die (generally a core). In the general case, Part0 refers to a standard PCIe card of any size (x16,x8,x4) that is plugged directly into one of the PCIe slots. Part0 could also refer to any device plugged into the first slot of a PCIe riser card or to a device attached to the IIO unit which starts its use of the bus using lane 0 of the 16 lanes supported by the bus.",
|
||||
"PublicDescription": "Counts every write request of up to a 64 byte transaction of data made to the MMIO space of a card on IIO Part0 by a unit on the main die (generally a core) or by another IIO unit. In the general case, Part0 refers to a standard PCIe card of any size (x16,x8,x4) that is plugged directly into one of the PCIe slots. Part0 could also refer to any device plugged into the first slot of a PCIe riser card or to a device attached to the IIO unit which starts its use of the bus using lane 0 of the 16 lanes supported by the bus.",
|
||||
"UMask": "0x01",
|
||||
"Unit": "IIO"
|
||||
},
|
||||
|
@ -605,7 +902,7 @@
|
|||
"FCMask": "0x07",
|
||||
"PerPkg": "1",
|
||||
"PortMask": "0x02",
|
||||
"PublicDescription": "Counts every write request of up to a 64 byte transaction of data made to the MMIO space of a card on IIO Part1 by a unit on the main die (generally a core). In the general case, Part1 refers to a x4 PCIe card plugged into the second slot of a PCIe riser card, but it could refer to any x4 device attached to the IIO unit using lanes starting at lane 4 of the 16 lanes supported by the bus.",
|
||||
"PublicDescription": "Counts every write request of up to a 64 byte transaction of data made to the MMIO space of a card on IIO Part1 by a unit on the main die (generally a core) or by another IIO unit. In the general case, Part1 refers to a x4 PCIe card plugged into the second slot of a PCIe riser card, but it could refer to any x4 device attached to the IIO unit using lanes starting at lane 4 of the 16 lanes supported by the bus.",
|
||||
"UMask": "0x01",
|
||||
"Unit": "IIO"
|
||||
},
|
||||
|
@ -617,7 +914,7 @@
|
|||
"FCMask": "0x07",
|
||||
"PerPkg": "1",
|
||||
"PortMask": "0x04",
|
||||
"PublicDescription": "Counts every write request of up to a 64 byte transaction of data made to the MMIO space of a card on IIO Part2 by a unit on the main die (generally a core). In the general case, Part2 refers to a x4 or x8 PCIe card plugged into the third slot of a PCIe riser card, but it could refer to any x4 or x8 device attached to the IIO unit and using lanes starting at lane 8 of the 16 lanes supported by the bus.",
|
||||
"PublicDescription": "Counts every write request of up to a 64 byte transaction of data made to the MMIO space of a card on IIO Part2 by a unit on the main die (generally a core) or by another IIO unit. In the general case, Part2 refers to a x4 or x8 PCIe card plugged into the third slot of a PCIe riser card, but it could refer to any x4 or x8 device attached to the IIO unit and using lanes starting at lane 8 of the 16 lanes supported by the bus.",
|
||||
"UMask": "0x01",
|
||||
"Unit": "IIO"
|
||||
},
|
||||
|
@ -629,10 +926,106 @@
|
|||
"FCMask": "0x07",
|
||||
"PerPkg": "1",
|
||||
"PortMask": "0x08",
|
||||
"PublicDescription": "Counts every write request of up to a 64 byte transaction of data made to the MMIO space of a card on IIO Part3 by a unit on the main die (generally a core). In the general case, Part3 refers to a x4 PCIe card plugged into the fourth slot of a PCIe riser card, but it could brefer to any device attached to the IIO unit using the lanes starting at lane 12 of the 16 lanes supported by the bus.",
|
||||
"PublicDescription": "Counts every write request of up to a 64 byte transaction of data made to the MMIO space of a card on IIO Part3 by a unit on the main die (generally a core) or by another IIO unit. In the general case, Part3 refers to a x4 PCIe card plugged into the fourth slot of a PCIe riser card, but it could brefer to any device attached to the IIO unit using the lanes starting at lane 12 of the 16 lanes supported by the bus.",
|
||||
"UMask": "0x01",
|
||||
"Unit": "IIO"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Peer to peer read request for up to a 64 byte transaction is made by a different IIO unit to IIO Part0",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventCode": "0xC1",
|
||||
"EventName": "UNC_IIO_TXN_REQ_BY_CPU.PEER_READ.PART0",
|
||||
"FCMask": "0x07",
|
||||
"PerPkg": "1",
|
||||
"PortMask": "0x01",
|
||||
"PublicDescription": "Counts every peer to peer read request for up to a 64 byte transaction of data made by a different IIO unit to the MMIO space of a card on IIO Part0. Does not include requests made by the same IIO unit. In the general case, part0 refers to a standard PCIe card of any size (x16,x8,x4) that is plugged directly into one of the PCIe slots. Part0 could also refer to any device plugged into the first slot of a PCIe riser card or to a device attached to the IIO unit which starts its use of the bus using lane 0 of the 16 lanes supported by the bus.",
|
||||
"UMask": "0x08",
|
||||
"Unit": "IIO"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Peer to peer read request for up to a 64 byte transaction is made by a different IIO unit to IIO Part1",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventCode": "0xC1",
|
||||
"EventName": "UNC_IIO_TXN_REQ_BY_CPU.PEER_READ.PART1",
|
||||
"FCMask": "0x07",
|
||||
"PerPkg": "1",
|
||||
"PortMask": "0x02",
|
||||
"PublicDescription": "Counts every peer to peer read request for up to a 64 byte transaction of data made by a different IIO unit to the MMIO space of a card on IIO Part1. Does not include requests made by the same IIO unit. In the general case, Part1 refers to a x4 PCIe card plugged into the second slot of a PCIe riser card, but it could refer to any x4 device attached to the IIO unit using lanes starting at lane 4 of the 16 lanes supported by the bus.",
|
||||
"UMask": "0x08",
|
||||
"Unit": "IIO"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Peer to peer read request for up to a 64 byte transaction is made by a different IIO unit to IIO Part2",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventCode": "0xC1",
|
||||
"EventName": "UNC_IIO_TXN_REQ_BY_CPU.PEER_READ.PART2",
|
||||
"FCMask": "0x07",
|
||||
"PerPkg": "1",
|
||||
"PortMask": "0x04",
|
||||
"PublicDescription": "Counts every peer to peer read request for up to a 64 byte transaction of data made by a different IIO unit to the MMIO space of a card on IIO Part2. Does not include requests made by the same IIO unit. In the general case, Part2 refers to a x4 or x8 PCIe card plugged into the third slot of a PCIe riser card, but it could refer to any x4 or x8 device attached to the IIO unit and using lanes starting at lane 8 of the 16 lanes supported by the bus.",
|
||||
"UMask": "0x08",
|
||||
"Unit": "IIO"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Peer to peer read request for up to a 64 byte transaction is made by a different IIO unit to IIO Part3",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventCode": "0xC1",
|
||||
"EventName": "UNC_IIO_TXN_REQ_BY_CPU.PEER_READ.PART3",
|
||||
"FCMask": "0x07",
|
||||
"PerPkg": "1",
|
||||
"PortMask": "0x08",
|
||||
"PublicDescription": "Counts every peer to peer read request for up to a 64 byte transaction of data made by a different IIO unit to the MMIO space of a card on IIO Part3. Does not include requests made by the same IIO unit. In the general case, Part3 refers to a x4 PCIe card plugged into the fourth slot of a PCIe riser card, but it could brefer to any device attached to the IIO unit using the lanes starting at lane 12 of the 16 lanes supported by the bus.",
|
||||
"UMask": "0x08",
|
||||
"Unit": "IIO"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Peer to peer write request of up to a 64 byte transaction is made to IIO Part0 by a different IIO unit",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventCode": "0xC1",
|
||||
"EventName": "UNC_IIO_TXN_REQ_BY_CPU.PEER_WRITE.PART0",
|
||||
"FCMask": "0x07",
|
||||
"PerPkg": "1",
|
||||
"PortMask": "0x01",
|
||||
"PublicDescription": "Counts every peer to peer write request of up to a 64 byte transaction of data made to the MMIO space of a card on IIO Part0 by a different IIO unit. Does not include requests made by the same IIO unit. In the general case, Part0 refers to a standard PCIe card of any size (x16,x8,x4) that is plugged directly into one of the PCIe slots. Part0 could also refer to any device plugged into the first slot of a PCIe riser card or to a device attached to the IIO unit which starts its use of the bus using lane 0 of the 16 lanes supported by the bus.",
|
||||
"UMask": "0x02",
|
||||
"Unit": "IIO"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Peer to peer write request of up to a 64 byte transaction is made to IIO Part1 by a different IIO unit",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventCode": "0xC1",
|
||||
"EventName": "UNC_IIO_TXN_REQ_BY_CPU.PEER_WRITE.PART1",
|
||||
"FCMask": "0x07",
|
||||
"PerPkg": "1",
|
||||
"PortMask": "0x02",
|
||||
"PublicDescription": "Counts every peer to peer write request of up to a 64 byte transaction of data made to the MMIO space of a card on IIO Part1 by a different IIO unit. Does not include requests made by the same IIO unit. In the general case, Part1 refers to a x4 PCIe card plugged into the second slot of a PCIe riser card, but it could refer to any x4 device attached to the IIO unit using lanes starting at lane 4 of the 16 lanes supported by the bus.",
|
||||
"UMask": "0x02",
|
||||
"Unit": "IIO"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Peer to peer write request of up to a 64 byte transaction is made to IIO Part2 by a different IIO unit",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventCode": "0xC1",
|
||||
"EventName": "UNC_IIO_TXN_REQ_BY_CPU.PEER_WRITE.PART2",
|
||||
"FCMask": "0x07",
|
||||
"PerPkg": "1",
|
||||
"PortMask": "0x04",
|
||||
"PublicDescription": "Counts every peer to peer write request of up to a 64 byte transaction of data made to the MMIO space of a card on IIO Part2 by a different IIO unit. Does not include requests made by the same IIO unit. In the general case, Part2 refers to a x4 or x8 PCIe card plugged into the third slot of a PCIe riser card, but it could refer to any x4 or x8 device attached to the IIO unit and using lanes starting at lane 8 of the 16 lanes supported by the bus.",
|
||||
"UMask": "0x02",
|
||||
"Unit": "IIO"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Peer to peer write request of up to a 64 byte transaction is made to IIO Part3 by a different IIO unit",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventCode": "0xC1",
|
||||
"EventName": "UNC_IIO_TXN_REQ_BY_CPU.PEER_WRITE.PART3",
|
||||
"FCMask": "0x07",
|
||||
"PerPkg": "1",
|
||||
"PortMask": "0x08",
|
||||
"PublicDescription": "Counts every peer to peer write request of up to a 64 byte transaction of data made to the MMIO space of a card on IIO Part3 by a different IIO unit. Does not include requests made by the same IIO unit. In the general case, Part3 refers to a x4 PCIe card plugged into the fourth slot of a PCIe riser card, but it could brefer to any device attached to the IIO unit using the lanes starting at lane 12 of the 16 lanes supported by the bus.",
|
||||
"UMask": "0x02",
|
||||
"Unit": "IIO"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Read request for up to a 64 byte transaction is made by IIO Part0 to Memory",
|
||||
"Counter": "0,1,2,3",
|
||||
|
@ -729,6 +1122,102 @@
|
|||
"UMask": "0x01",
|
||||
"Unit": "IIO"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Peer to peer read request of up to a 64 byte transaction is made by IIO Part0 to an IIO target",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventCode": "0x84",
|
||||
"EventName": "UNC_IIO_TXN_REQ_OF_CPU.PEER_READ.PART0",
|
||||
"FCMask": "0x07",
|
||||
"PerPkg": "1",
|
||||
"PortMask": "0x01",
|
||||
"PublicDescription": "Counts every peer to peer read request of up to a 64 byte transaction made by IIO Part0 to the MMIO space of an IIO target. In the general case, Part0 refers to a standard PCIe card of any size (x16,x8,x4) that is plugged directly into one of the PCIe slots. Part0 could also refer to any device plugged into the first slot of a PCIe riser card or to a device attached to the IIO unit which starts its use of the bus using lane 0 of the 16 lanes supported by the bus.",
|
||||
"UMask": "0x08",
|
||||
"Unit": "IIO"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Peer to peer read request of up to a 64 byte transaction is made by IIO Part1 to an IIO target",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventCode": "0x84",
|
||||
"EventName": "UNC_IIO_TXN_REQ_OF_CPU.PEER_READ.PART1",
|
||||
"FCMask": "0x07",
|
||||
"PerPkg": "1",
|
||||
"PortMask": "0x02",
|
||||
"PublicDescription": "Counts every peer to peer read request of up to a 64 byte transaction made by IIO Part1 to the MMIO space of an IIO target. In the general case, Part1 refers to a x4 PCIe card plugged into the second slot of a PCIe riser card, but it could refer to any x4 device attached to the IIO unit using lanes starting at lane 4 of the 16 lanes supported by the bus.",
|
||||
"UMask": "0x08",
|
||||
"Unit": "IIO"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Peer to peer read request of up to a 64 byte transaction is made by IIO Part2 to an IIO target",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventCode": "0x84",
|
||||
"EventName": "UNC_IIO_TXN_REQ_OF_CPU.PEER_READ.PART2",
|
||||
"FCMask": "0x07",
|
||||
"PerPkg": "1",
|
||||
"PortMask": "0x04",
|
||||
"PublicDescription": "Counts every peer to peer read request of up to a 64 byte transaction made by IIO Part2 to the MMIO space of an IIO target. In the general case, Part2 refers to a x4 or x8 PCIe card plugged into the third slot of a PCIe riser card, but it could refer to any x4 or x8 device attached to the IIO unit and using lanes starting at lane 8 of the 16 lanes supported by the bus.",
|
||||
"UMask": "0x08",
|
||||
"Unit": "IIO"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Peer to peer read request of up to a 64 byte transaction is made by IIO Part3 to an IIO target",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventCode": "0x84",
|
||||
"EventName": "UNC_IIO_TXN_REQ_OF_CPU.PEER_READ.PART3",
|
||||
"FCMask": "0x07",
|
||||
"PerPkg": "1",
|
||||
"PortMask": "0x08",
|
||||
"PublicDescription": "Counts every peer to peer read request of up to a 64 byte transaction made by IIO Part3 to the MMIO space of an IIO target. In the general case, Part3 refers to a x4 PCIe card plugged into the fourth slot of a PCIe riser card, but it could brefer to any device attached to the IIO unit using the lanes starting at lane 12 of the 16 lanes supported by the bus.",
|
||||
"UMask": "0x08",
|
||||
"Unit": "IIO"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Peer to peer write request of up to a 64 byte transaction is made by IIO Part0 to an IIO target",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventCode": "0x84",
|
||||
"EventName": "UNC_IIO_TXN_REQ_OF_CPU.PEER_WRITE.PART0",
|
||||
"FCMask": "0x07",
|
||||
"PerPkg": "1",
|
||||
"PortMask": "0x01",
|
||||
"PublicDescription": "Counts every peer to peer write request of up to a 64 byte transaction of data made by IIO Part0 to the MMIO space of an IIO target. In the general case, Part0 refers to a standard PCIe card of any size (x16,x8,x4) that is plugged directly into one of the PCIe slots. Part0 could also refer to any device plugged into the first slot of a PCIe riser card or to a device attached to the IIO unit which starts its use of the bus using lane 0 of the 16 lanes supported by the bus.",
|
||||
"UMask": "0x02",
|
||||
"Unit": "IIO"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Peer to peer write request of up to a 64 byte transaction is made by IIO Part1 to an IIO target",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventCode": "0x84",
|
||||
"EventName": "UNC_IIO_TXN_REQ_OF_CPU.PEER_WRITE.PART1",
|
||||
"FCMask": "0x07",
|
||||
"PerPkg": "1",
|
||||
"PortMask": "0x02",
|
||||
"PublicDescription": "Counts every peer to peer write request of up to a 64 byte transaction of data made by IIO Part1 to the MMIO space of an IIO target.In the general case, Part1 refers to a x4 PCIe card plugged into the second slot of a PCIe riser card, but it could refer to any x4 device attached to the IIO unit using lanes starting at lane 4 of the 16 lanes supported by the bus.",
|
||||
"UMask": "0x02",
|
||||
"Unit": "IIO"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Peer to peer write request of up to a 64 byte transaction is made by IIO Part2 to an IIO target",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventCode": "0x84",
|
||||
"EventName": "UNC_IIO_TXN_REQ_OF_CPU.PEER_WRITE.PART2",
|
||||
"FCMask": "0x07",
|
||||
"PerPkg": "1",
|
||||
"PortMask": "0x04",
|
||||
"PublicDescription": "Counts every peer to peer write request of up to a 64 byte transaction of data made by IIO Part2 to the MMIO space of an IIO target. In the general case, Part2 refers to a x4 or x8 PCIe card plugged into the third slot of a PCIe riser card, but it could refer to any x4 or x8 device attached to the IIO unit and using lanes starting at lane 8 of the 16 lanes supported by the bus.",
|
||||
"UMask": "0x02",
|
||||
"Unit": "IIO"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Peer to peer write request of up to a 64 byte transaction is made by IIO Part3 to an IIO target",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventCode": "0x84",
|
||||
"EventName": "UNC_IIO_TXN_REQ_OF_CPU.PEER_WRITE.PART3",
|
||||
"FCMask": "0x07",
|
||||
"PerPkg": "1",
|
||||
"PortMask": "0x08",
|
||||
"PublicDescription": "Counts every peer to peer write request of up to a 64 byte transaction of data made by IIO Part3 to the MMIO space of an IIO target. In the general case, Part3 refers to a x4 PCIe card plugged into the fourth slot of a PCIe riser card, but it could brefer to any device attached to the IIO unit using the lanes starting at lane 12 of the 16 lanes supported by the bus.",
|
||||
"UMask": "0x02",
|
||||
"Unit": "IIO"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Traffic in which the M2M to iMC Bypass was not taken",
|
||||
"Counter": "0,1,2,3",
|
||||
|
@ -942,6 +1431,16 @@
|
|||
"UMask": "0x10",
|
||||
"Unit": "M2M"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "M2M Writes Issued to iMC; All, regardless of priority.",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventCode": "0x38",
|
||||
"EventName": "UNC_M2M_IMC_WRITES.NI",
|
||||
"PerPkg": "1",
|
||||
"PublicDescription": "M2M Writes Issued to iMC; All, regardless of priority.",
|
||||
"UMask": "0x80",
|
||||
"Unit": "M2M"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Partial Non-Isochronous writes to the iMC",
|
||||
"Counter": "0,1,2,3",
|
||||
|
@ -980,8 +1479,73 @@
|
|||
"Unit": "M2M"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Prefetches generated by the flow control queue of the M3UPI unit.",
|
||||
"BriefDescription": "AD Ingress (from CMS) Occupancy",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventCode": "0x2",
|
||||
"EventName": "UNC_M2M_RxC_AD_OCCUPANCY",
|
||||
"PerPkg": "1",
|
||||
"PublicDescription": "AD Ingress (from CMS) Occupancy",
|
||||
"Unit": "M2M"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "BL Ingress (from CMS) Allocations",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventCode": "0x5",
|
||||
"EventName": "UNC_M2M_RxC_BL_INSERTS",
|
||||
"PerPkg": "1",
|
||||
"PublicDescription": "BL Ingress (from CMS) Allocations",
|
||||
"Unit": "M2M"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "BL Ingress (from CMS) Occupancy",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventCode": "0x6",
|
||||
"EventName": "UNC_M2M_RxC_BL_OCCUPANCY",
|
||||
"PerPkg": "1",
|
||||
"PublicDescription": "BL Ingress (from CMS) Occupancy",
|
||||
"Unit": "M2M"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "AD Egress (to CMS) Allocations",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventCode": "0x9",
|
||||
"EventName": "UNC_M2M_TxC_AD_INSERTS",
|
||||
"PerPkg": "1",
|
||||
"PublicDescription": "AD Egress (to CMS) Allocations",
|
||||
"Unit": "M2M"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "AD Egress (to CMS) Occupancy",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventCode": "0xA",
|
||||
"EventName": "UNC_M2M_TxC_AD_OCCUPANCY",
|
||||
"PerPkg": "1",
|
||||
"PublicDescription": "AD Egress (to CMS) Occupancy",
|
||||
"Unit": "M2M"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "BL Egress (to CMS) Allocations; All",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventCode": "0x15",
|
||||
"EventName": "UNC_M2M_TxC_BL_INSERTS.ALL",
|
||||
"PerPkg": "1",
|
||||
"PublicDescription": "BL Egress (to CMS) Allocations; All",
|
||||
"UMask": "0x03",
|
||||
"Unit": "M2M"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "BL Egress (to CMS) Occupancy; All",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventCode": "0x16",
|
||||
"EventName": "UNC_M2M_TxC_BL_OCCUPANCY.ALL",
|
||||
"PerPkg": "1",
|
||||
"PublicDescription": "BL Egress (to CMS) Occupancy; All",
|
||||
"UMask": "0x03",
|
||||
"Unit": "M2M"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Prefetches generated by the flow control queue of the M3UPI unit.",
|
||||
"Counter": "0,1,2",
|
||||
"EventCode": "0x29",
|
||||
"EventName": "UNC_M3UPI_UPI_PREFETCH_SPAWN",
|
||||
"PerPkg": "1",
|
||||
|
@ -1113,16 +1677,6 @@
|
|||
"PublicDescription": "Counts incoming FLITs (FLow control unITs) which bypassed the TxL(transmit) FLIT buffer and pass directly out the UPI Link. Generally, when data is transmitted across the Intel Ultra Path Interconnect (UPI), it will bypass the TxQ and pass directly to the link. However, the TxQ will be used in L0p (Low Power) mode and (Link Layer Retry) LLR mode, increasing latency to transfer out to the link.",
|
||||
"Unit": "UPI LL"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "UPI interconnect send bandwidth for payload. Derived from unc_upi_txl_flits.all_data",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventCode": "0x2",
|
||||
"EventName": "UPI_DATA_BANDWIDTH_TX",
|
||||
"PerPkg": "1",
|
||||
"ScaleUnit": "7.11E-06Bytes",
|
||||
"UMask": "0x0F",
|
||||
"Unit": "UPI LL"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Null FLITs transmitted from any slot",
|
||||
"Counter": "0,1,2,3",
|
||||
|
@ -1133,6 +1687,16 @@
|
|||
"UMask": "0x27",
|
||||
"Unit": "UPI LL"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Valid Flits Sent; Data",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventCode": "0x2",
|
||||
"EventName": "UNC_UPI_TxL_FLITS.DATA",
|
||||
"PerPkg": "1",
|
||||
"PublicDescription": "Shows legal flit time (hides impact of L0p and L0c).; Count Data Flits (which consume all slots), but how much to count is based on Slot0-2 mask, so count can be 0-3 depending on which slots are enabled for counting..",
|
||||
"UMask": "0x8",
|
||||
"Unit": "UPI LL"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Idle FLITs transmitted",
|
||||
"Counter": "0,1,2,3",
|
||||
|
|
|
@ -1,284 +1,284 @@
|
|||
[
|
||||
{
|
||||
"EventCode": "0x08",
|
||||
"UMask": "0x1",
|
||||
"BriefDescription": "Load misses in all DTLB levels that cause page walks",
|
||||
"BriefDescription": "Instruction fetch requests that miss the ITLB and hit the STLB.",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventName": "DTLB_LOAD_MISSES.MISS_CAUSES_A_WALK",
|
||||
"PublicDescription": "Counts demand data loads that caused a page walk of any page size (4K/2M/4M/1G). This implies it missed in all TLB levels, but the walk need not have completed.",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0x85",
|
||||
"EventName": "ITLB_MISSES.STLB_HIT",
|
||||
"SampleAfterValue": "100003",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
"UMask": "0x20"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x08",
|
||||
"UMask": "0x2",
|
||||
"BriefDescription": "Page walk completed due to a demand data load to a 4K page",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventName": "DTLB_LOAD_MISSES.WALK_COMPLETED_4K",
|
||||
"PublicDescription": "Counts page walks completed due to demand data loads whose address translations missed in the TLB and were mapped to 4K pages. The page walks can end with or without a page fault.",
|
||||
"SampleAfterValue": "2000003",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x08",
|
||||
"UMask": "0x4",
|
||||
"BriefDescription": "Page walk completed due to a demand data load to a 2M/4M page",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventName": "DTLB_LOAD_MISSES.WALK_COMPLETED_2M_4M",
|
||||
"PublicDescription": "Counts page walks completed due to demand data loads whose address translations missed in the TLB and were mapped to 2M/4M pages. The page walks can end with or without a page fault.",
|
||||
"SampleAfterValue": "2000003",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x08",
|
||||
"UMask": "0x8",
|
||||
"BriefDescription": "Page walk completed due to a demand data load to a 1G page",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventName": "DTLB_LOAD_MISSES.WALK_COMPLETED_1G",
|
||||
"PublicDescription": "Counts page walks completed due to demand data loads whose address translations missed in the TLB and were mapped to 4K pages. The page walks can end with or without a page fault.",
|
||||
"SampleAfterValue": "2000003",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x08",
|
||||
"UMask": "0xe",
|
||||
"BriefDescription": "Load miss in all TLB levels causes a page walk that completes. (All page sizes)",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventName": "DTLB_LOAD_MISSES.WALK_COMPLETED",
|
||||
"PublicDescription": "Counts demand data loads that caused a completed page walk of any page size (4K/2M/4M/1G). This implies it missed in all TLB levels. The page walk can end with or without a fault.",
|
||||
"SampleAfterValue": "100003",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x08",
|
||||
"UMask": "0x10",
|
||||
"BriefDescription": "Counts 1 per cycle for each PMH that is busy with a page walk for a load. EPT page walk duration are excluded in Skylake.",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventName": "DTLB_LOAD_MISSES.WALK_PENDING",
|
||||
"PublicDescription": "Counts 1 per cycle for each PMH that is busy with a page walk for a load. EPT page walk duration are excluded in Skylake microarchitecture.",
|
||||
"SampleAfterValue": "2000003",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x08",
|
||||
"UMask": "0x10",
|
||||
"BriefDescription": "Cycles when at least one PMH is busy with a page walk for a load. EPT page walk duration are excluded in Skylake.",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventName": "DTLB_LOAD_MISSES.WALK_ACTIVE",
|
||||
"CounterMask": "1",
|
||||
"PublicDescription": "Counts cycles when at least one PMH (Page Miss Handler) is busy with a page walk for a load.",
|
||||
"SampleAfterValue": "100003",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x08",
|
||||
"UMask": "0x20",
|
||||
"BriefDescription": "Loads that miss the DTLB and hit the STLB.",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventName": "DTLB_LOAD_MISSES.STLB_HIT",
|
||||
"PublicDescription": "Counts loads that miss the DTLB (Data TLB) and hit the STLB (Second level TLB).",
|
||||
"SampleAfterValue": "2000003",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x49",
|
||||
"UMask": "0x1",
|
||||
"BriefDescription": "Store misses in all DTLB levels that cause page walks",
|
||||
"Counter": "0,1,2,3",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0x49",
|
||||
"EventName": "DTLB_STORE_MISSES.MISS_CAUSES_A_WALK",
|
||||
"PublicDescription": "Counts demand data stores that caused a page walk of any page size (4K/2M/4M/1G). This implies it missed in all TLB levels, but the walk need not have completed.",
|
||||
"SampleAfterValue": "100003",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
"UMask": "0x1"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x49",
|
||||
"UMask": "0x2",
|
||||
"BriefDescription": "Page walk completed due to a demand data store to a 4K page",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventName": "DTLB_STORE_MISSES.WALK_COMPLETED_4K",
|
||||
"PublicDescription": "Counts page walks completed due to demand data stores whose address translations missed in the TLB and were mapped to 4K pages. The page walks can end with or without a page fault.",
|
||||
"SampleAfterValue": "100003",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x49",
|
||||
"UMask": "0x4",
|
||||
"BriefDescription": "Page walk completed due to a demand data store to a 2M/4M page",
|
||||
"Counter": "0,1,2,3",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0x49",
|
||||
"EventName": "DTLB_STORE_MISSES.WALK_COMPLETED_2M_4M",
|
||||
"PublicDescription": "Counts page walks completed due to demand data stores whose address translations missed in the TLB and were mapped to 2M/4M pages. The page walks can end with or without a page fault.",
|
||||
"SampleAfterValue": "100003",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
"UMask": "0x4"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x49",
|
||||
"UMask": "0x8",
|
||||
"BriefDescription": "Page walk completed due to a demand data store to a 1G page",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventName": "DTLB_STORE_MISSES.WALK_COMPLETED_1G",
|
||||
"PublicDescription": "Counts page walks completed due to demand data stores whose address translations missed in the TLB and were mapped to 1G pages. The page walks can end with or without a page fault.",
|
||||
"SampleAfterValue": "100003",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x49",
|
||||
"UMask": "0xe",
|
||||
"BriefDescription": "Store misses in all TLB levels causes a page walk that completes. (All page sizes)",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventName": "DTLB_STORE_MISSES.WALK_COMPLETED",
|
||||
"PublicDescription": "Counts demand data stores that caused a completed page walk of any page size (4K/2M/4M/1G). This implies it missed in all TLB levels. The page walk can end with or without a fault.",
|
||||
"SampleAfterValue": "100003",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x49",
|
||||
"UMask": "0x10",
|
||||
"BriefDescription": "Counts 1 per cycle for each PMH that is busy with a page walk for a store. EPT page walk duration are excluded in Skylake.",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventName": "DTLB_STORE_MISSES.WALK_PENDING",
|
||||
"PublicDescription": "Counts 1 per cycle for each PMH that is busy with a page walk for a store. EPT page walk duration are excluded in Skylake microarchitecture.",
|
||||
"SampleAfterValue": "2000003",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x49",
|
||||
"UMask": "0x10",
|
||||
"BriefDescription": "Cycles when at least one PMH is busy with a page walk for a store. EPT page walk duration are excluded in Skylake.",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventName": "DTLB_STORE_MISSES.WALK_ACTIVE",
|
||||
"CounterMask": "1",
|
||||
"PublicDescription": "Counts cycles when at least one PMH (Page Miss Handler) is busy with a page walk for a store.",
|
||||
"SampleAfterValue": "100003",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x49",
|
||||
"UMask": "0x20",
|
||||
"BriefDescription": "Stores that miss the DTLB and hit the STLB.",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventName": "DTLB_STORE_MISSES.STLB_HIT",
|
||||
"PublicDescription": "Stores that miss the DTLB (Data TLB) and hit the STLB (2nd Level TLB).",
|
||||
"SampleAfterValue": "100003",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x4F",
|
||||
"UMask": "0x10",
|
||||
"BriefDescription": "Counts 1 per cycle for each PMH that is busy with a EPT (Extended Page Table) walk for any request type.",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventName": "EPT.WALK_PENDING",
|
||||
"PublicDescription": "Counts cycles for each PMH (Page Miss Handler) that is busy with an EPT (Extended Page Table) walk for any request type.",
|
||||
"SampleAfterValue": "2000003",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x85",
|
||||
"UMask": "0x1",
|
||||
"BriefDescription": "Misses at all ITLB levels that cause page walks",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventName": "ITLB_MISSES.MISS_CAUSES_A_WALK",
|
||||
"PublicDescription": "Counts page walks of any page size (4K/2M/4M/1G) caused by a code fetch. This implies it missed in the ITLB and further levels of TLB, but the walk need not have completed.",
|
||||
"SampleAfterValue": "100003",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x85",
|
||||
"UMask": "0x2",
|
||||
"BriefDescription": "Code miss in all TLB levels causes a page walk that completes. (4K)",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventName": "ITLB_MISSES.WALK_COMPLETED_4K",
|
||||
"PublicDescription": "Counts completed page walks (4K page size) caused by a code fetch. This implies it missed in the ITLB and further levels of TLB. The page walk can end with or without a fault.",
|
||||
"SampleAfterValue": "100003",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x85",
|
||||
"UMask": "0x4",
|
||||
"BriefDescription": "Code miss in all TLB levels causes a page walk that completes. (2M/4M)",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventName": "ITLB_MISSES.WALK_COMPLETED_2M_4M",
|
||||
"PublicDescription": "Counts code misses in all ITLB levels that caused a completed page walk (2M and 4M page sizes). The page walk can end with or without a fault.",
|
||||
"SampleAfterValue": "100003",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x85",
|
||||
"UMask": "0x8",
|
||||
"BriefDescription": "Code miss in all TLB levels causes a page walk that completes. (1G)",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventName": "ITLB_MISSES.WALK_COMPLETED_1G",
|
||||
"PublicDescription": "Counts store misses in all DTLB levels that cause a completed page walk (1G page size). The page walk can end with or without a fault.",
|
||||
"SampleAfterValue": "100003",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x85",
|
||||
"UMask": "0xe",
|
||||
"BriefDescription": "Code miss in all TLB levels causes a page walk that completes. (All page sizes)",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventName": "ITLB_MISSES.WALK_COMPLETED",
|
||||
"PublicDescription": "Counts completed page walks (2M and 4M page sizes) caused by a code fetch. This implies it missed in the ITLB and further levels of TLB. The page walk can end with or without a fault.",
|
||||
"SampleAfterValue": "100003",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x85",
|
||||
"UMask": "0x10",
|
||||
"BriefDescription": "Counts 1 per cycle for each PMH that is busy with a page walk for an instruction fetch request. EPT page walk duration are excluded in Skylake.",
|
||||
"Counter": "0,1,2,3",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0x85",
|
||||
"EventName": "ITLB_MISSES.WALK_PENDING",
|
||||
"PublicDescription": "Counts 1 per cycle for each PMH (Page Miss Handler) that is busy with a page walk for an instruction fetch request. EPT page walk duration are excluded in Skylake michroarchitecture.",
|
||||
"SampleAfterValue": "100003",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
"UMask": "0x10"
|
||||
},
|
||||
{
|
||||
"EventCode": "0x85",
|
||||
"UMask": "0x10",
|
||||
"BriefDescription": "Cycles when at least one PMH is busy with a page walk for code (instruction fetch) request. EPT page walk duration are excluded in Skylake.",
|
||||
"BriefDescription": "Code miss in all TLB levels causes a page walk that completes. (4K)",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventName": "ITLB_MISSES.WALK_ACTIVE",
|
||||
"CounterMask": "1",
|
||||
"PublicDescription": "Cycles when at least one PMH is busy with a page walk for code (instruction fetch) request. EPT page walk duration are excluded in Skylake microarchitecture.",
|
||||
"SampleAfterValue": "100003",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
},
|
||||
{
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0x85",
|
||||
"UMask": "0x20",
|
||||
"BriefDescription": "Instruction fetch requests that miss the ITLB and hit the STLB.",
|
||||
"Counter": "0,1,2,3",
|
||||
"EventName": "ITLB_MISSES.STLB_HIT",
|
||||
"EventName": "ITLB_MISSES.WALK_COMPLETED_4K",
|
||||
"PublicDescription": "Counts completed page walks (4K page size) caused by a code fetch. This implies it missed in the ITLB and further levels of TLB. The page walk can end with or without a fault.",
|
||||
"SampleAfterValue": "100003",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
"UMask": "0x2"
|
||||
},
|
||||
{
|
||||
"EventCode": "0xAE",
|
||||
"UMask": "0x1",
|
||||
"BriefDescription": "Flushing of the Instruction TLB (ITLB) pages, includes 4k/2M/4M pages.",
|
||||
"Counter": "0,1,2,3",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0xAE",
|
||||
"EventName": "ITLB.ITLB_FLUSH",
|
||||
"PublicDescription": "Counts the number of flushes of the big or small ITLB pages. Counting include both TLB Flush (covering all sets) and TLB Set Clear (set-specific).",
|
||||
"SampleAfterValue": "100007",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
"UMask": "0x1"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Cycles when at least one PMH is busy with a page walk for code (instruction fetch) request. EPT page walk duration are excluded in Skylake.",
|
||||
"Counter": "0,1,2,3",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7",
|
||||
"CounterMask": "1",
|
||||
"EventCode": "0x85",
|
||||
"EventName": "ITLB_MISSES.WALK_ACTIVE",
|
||||
"PublicDescription": "Cycles when at least one PMH is busy with a page walk for code (instruction fetch) request. EPT page walk duration are excluded in Skylake microarchitecture.",
|
||||
"SampleAfterValue": "100003",
|
||||
"UMask": "0x10"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Loads that miss the DTLB and hit the STLB.",
|
||||
"Counter": "0,1,2,3",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0x08",
|
||||
"EventName": "DTLB_LOAD_MISSES.STLB_HIT",
|
||||
"PublicDescription": "Counts loads that miss the DTLB (Data TLB) and hit the STLB (Second level TLB).",
|
||||
"SampleAfterValue": "2000003",
|
||||
"UMask": "0x20"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Counts 1 per cycle for each PMH that is busy with a page walk for a store. EPT page walk duration are excluded in Skylake.",
|
||||
"Counter": "0,1,2,3",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0x49",
|
||||
"EventName": "DTLB_STORE_MISSES.WALK_PENDING",
|
||||
"PublicDescription": "Counts 1 per cycle for each PMH that is busy with a page walk for a store. EPT page walk duration are excluded in Skylake microarchitecture.",
|
||||
"SampleAfterValue": "2000003",
|
||||
"UMask": "0x10"
|
||||
},
|
||||
{
|
||||
"EventCode": "0xBD",
|
||||
"UMask": "0x1",
|
||||
"BriefDescription": "DTLB flush attempts of the thread-specific entries",
|
||||
"Counter": "0,1,2,3",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0xBD",
|
||||
"EventName": "TLB_FLUSH.DTLB_THREAD",
|
||||
"PublicDescription": "Counts the number of DTLB flush attempts of the thread-specific entries.",
|
||||
"SampleAfterValue": "100007",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
"UMask": "0x1"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Counts 1 per cycle for each PMH that is busy with a page walk for a load. EPT page walk duration are excluded in Skylake.",
|
||||
"Counter": "0,1,2,3",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0x08",
|
||||
"EventName": "DTLB_LOAD_MISSES.WALK_PENDING",
|
||||
"PublicDescription": "Counts 1 per cycle for each PMH that is busy with a page walk for a load. EPT page walk duration are excluded in Skylake microarchitecture.",
|
||||
"SampleAfterValue": "2000003",
|
||||
"UMask": "0x10"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Cycles when at least one PMH is busy with a page walk for a store. EPT page walk duration are excluded in Skylake.",
|
||||
"Counter": "0,1,2,3",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7",
|
||||
"CounterMask": "1",
|
||||
"EventCode": "0x49",
|
||||
"EventName": "DTLB_STORE_MISSES.WALK_ACTIVE",
|
||||
"PublicDescription": "Counts cycles when at least one PMH (Page Miss Handler) is busy with a page walk for a store.",
|
||||
"SampleAfterValue": "100003",
|
||||
"UMask": "0x10"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Misses at all ITLB levels that cause page walks",
|
||||
"Counter": "0,1,2,3",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0x85",
|
||||
"EventName": "ITLB_MISSES.MISS_CAUSES_A_WALK",
|
||||
"PublicDescription": "Counts page walks of any page size (4K/2M/4M/1G) caused by a code fetch. This implies it missed in the ITLB and further levels of TLB, but the walk need not have completed.",
|
||||
"SampleAfterValue": "100003",
|
||||
"UMask": "0x1"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Stores that miss the DTLB and hit the STLB.",
|
||||
"Counter": "0,1,2,3",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0x49",
|
||||
"EventName": "DTLB_STORE_MISSES.STLB_HIT",
|
||||
"PublicDescription": "Stores that miss the DTLB (Data TLB) and hit the STLB (2nd Level TLB).",
|
||||
"SampleAfterValue": "100003",
|
||||
"UMask": "0x20"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Store misses in all TLB levels causes a page walk that completes. (All page sizes)",
|
||||
"Counter": "0,1,2,3",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0x49",
|
||||
"EventName": "DTLB_STORE_MISSES.WALK_COMPLETED",
|
||||
"PublicDescription": "Counts demand data stores that caused a completed page walk of any page size (4K/2M/4M/1G). This implies it missed in all TLB levels. The page walk can end with or without a fault.",
|
||||
"SampleAfterValue": "100003",
|
||||
"UMask": "0xe"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Load miss in all TLB levels causes a page walk that completes. (All page sizes)",
|
||||
"Counter": "0,1,2,3",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0x08",
|
||||
"EventName": "DTLB_LOAD_MISSES.WALK_COMPLETED",
|
||||
"PublicDescription": "Counts demand data loads that caused a completed page walk of any page size (4K/2M/4M/1G). This implies it missed in all TLB levels. The page walk can end with or without a fault.",
|
||||
"SampleAfterValue": "100003",
|
||||
"UMask": "0xe"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Page walk completed due to a demand data store to a 4K page",
|
||||
"Counter": "0,1,2,3",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0x49",
|
||||
"EventName": "DTLB_STORE_MISSES.WALK_COMPLETED_4K",
|
||||
"PublicDescription": "Counts page walks completed due to demand data stores whose address translations missed in the TLB and were mapped to 4K pages. The page walks can end with or without a page fault.",
|
||||
"SampleAfterValue": "100003",
|
||||
"UMask": "0x2"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Code miss in all TLB levels causes a page walk that completes. (1G)",
|
||||
"Counter": "0,1,2,3",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0x85",
|
||||
"EventName": "ITLB_MISSES.WALK_COMPLETED_1G",
|
||||
"PublicDescription": "Counts store misses in all DTLB levels that cause a completed page walk (1G page size). The page walk can end with or without a fault.",
|
||||
"SampleAfterValue": "100003",
|
||||
"UMask": "0x8"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Code miss in all TLB levels causes a page walk that completes. (All page sizes)",
|
||||
"Counter": "0,1,2,3",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0x85",
|
||||
"EventName": "ITLB_MISSES.WALK_COMPLETED",
|
||||
"PublicDescription": "Counts completed page walks (2M and 4M page sizes) caused by a code fetch. This implies it missed in the ITLB and further levels of TLB. The page walk can end with or without a fault.",
|
||||
"SampleAfterValue": "100003",
|
||||
"UMask": "0xe"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Page walk completed due to a demand data load to a 4K page",
|
||||
"Counter": "0,1,2,3",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0x08",
|
||||
"EventName": "DTLB_LOAD_MISSES.WALK_COMPLETED_4K",
|
||||
"PublicDescription": "Counts page walks completed due to demand data loads whose address translations missed in the TLB and were mapped to 4K pages. The page walks can end with or without a page fault.",
|
||||
"SampleAfterValue": "2000003",
|
||||
"UMask": "0x2"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Page walk completed due to a demand data load to a 2M/4M page",
|
||||
"Counter": "0,1,2,3",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0x08",
|
||||
"EventName": "DTLB_LOAD_MISSES.WALK_COMPLETED_2M_4M",
|
||||
"PublicDescription": "Counts page walks completed due to demand data loads whose address translations missed in the TLB and were mapped to 2M/4M pages. The page walks can end with or without a page fault.",
|
||||
"SampleAfterValue": "2000003",
|
||||
"UMask": "0x4"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Load misses in all DTLB levels that cause page walks",
|
||||
"Counter": "0,1,2,3",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0x08",
|
||||
"EventName": "DTLB_LOAD_MISSES.MISS_CAUSES_A_WALK",
|
||||
"PublicDescription": "Counts demand data loads that caused a page walk of any page size (4K/2M/4M/1G). This implies it missed in all TLB levels, but the walk need not have completed.",
|
||||
"SampleAfterValue": "100003",
|
||||
"UMask": "0x1"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Counts 1 per cycle for each PMH that is busy with a EPT (Extended Page Table) walk for any request type.",
|
||||
"Counter": "0,1,2,3",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0x4F",
|
||||
"EventName": "EPT.WALK_PENDING",
|
||||
"PublicDescription": "Counts cycles for each PMH (Page Miss Handler) that is busy with an EPT (Extended Page Table) walk for any request type.",
|
||||
"SampleAfterValue": "2000003",
|
||||
"UMask": "0x10"
|
||||
},
|
||||
{
|
||||
"EventCode": "0xBD",
|
||||
"UMask": "0x20",
|
||||
"BriefDescription": "STLB flush attempts",
|
||||
"Counter": "0,1,2,3",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0xBD",
|
||||
"EventName": "TLB_FLUSH.STLB_ANY",
|
||||
"PublicDescription": "Counts the number of any STLB flush attempts (such as entire, VPID, PCID, InvPage, CR3 write, etc.).",
|
||||
"SampleAfterValue": "100007",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7"
|
||||
"UMask": "0x20"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Page walk completed due to a demand data load to a 1G page",
|
||||
"Counter": "0,1,2,3",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0x08",
|
||||
"EventName": "DTLB_LOAD_MISSES.WALK_COMPLETED_1G",
|
||||
"PublicDescription": "Counts page walks completed due to demand data loads whose address translations missed in the TLB and were mapped to 4K pages. The page walks can end with or without a page fault.",
|
||||
"SampleAfterValue": "2000003",
|
||||
"UMask": "0x8"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Cycles when at least one PMH is busy with a page walk for a load. EPT page walk duration are excluded in Skylake.",
|
||||
"Counter": "0,1,2,3",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7",
|
||||
"CounterMask": "1",
|
||||
"EventCode": "0x08",
|
||||
"EventName": "DTLB_LOAD_MISSES.WALK_ACTIVE",
|
||||
"PublicDescription": "Counts cycles when at least one PMH (Page Miss Handler) is busy with a page walk for a load.",
|
||||
"SampleAfterValue": "100003",
|
||||
"UMask": "0x10"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Code miss in all TLB levels causes a page walk that completes. (2M/4M)",
|
||||
"Counter": "0,1,2,3",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0x85",
|
||||
"EventName": "ITLB_MISSES.WALK_COMPLETED_2M_4M",
|
||||
"PublicDescription": "Counts code misses in all ITLB levels that caused a completed page walk (2M and 4M page sizes). The page walk can end with or without a fault.",
|
||||
"SampleAfterValue": "100003",
|
||||
"UMask": "0x4"
|
||||
},
|
||||
{
|
||||
"BriefDescription": "Page walk completed due to a demand data store to a 1G page",
|
||||
"Counter": "0,1,2,3",
|
||||
"CounterHTOff": "0,1,2,3,4,5,6,7",
|
||||
"EventCode": "0x49",
|
||||
"EventName": "DTLB_STORE_MISSES.WALK_COMPLETED_1G",
|
||||
"PublicDescription": "Counts page walks completed due to demand data stores whose address translations missed in the TLB and were mapped to 1G pages. The page walks can end with or without a page fault.",
|
||||
"SampleAfterValue": "100003",
|
||||
"UMask": "0x8"
|
||||
}
|
||||
]
|
|
@ -48,11 +48,40 @@
|
|||
#include <linux/list.h>
|
||||
#include "jsmn.h"
|
||||
#include "json.h"
|
||||
#include "jevents.h"
|
||||
#include "pmu-events.h"
|
||||
|
||||
int verbose;
|
||||
char *prog;
|
||||
|
||||
struct json_event {
|
||||
char *name;
|
||||
char *event;
|
||||
char *desc;
|
||||
char *long_desc;
|
||||
char *pmu;
|
||||
char *unit;
|
||||
char *perpkg;
|
||||
char *aggr_mode;
|
||||
char *metric_expr;
|
||||
char *metric_name;
|
||||
char *metric_group;
|
||||
char *deprecated;
|
||||
char *metric_constraint;
|
||||
};
|
||||
|
||||
enum aggr_mode_class convert(const char *aggr_mode)
|
||||
{
|
||||
if (!strcmp(aggr_mode, "PerCore"))
|
||||
return PerCore;
|
||||
else if (!strcmp(aggr_mode, "PerChip"))
|
||||
return PerChip;
|
||||
|
||||
pr_err("%s: Wrong AggregationMode value '%s'\n", prog, aggr_mode);
|
||||
return -1;
|
||||
}
|
||||
|
||||
typedef int (*func)(void *data, struct json_event *je);
|
||||
|
||||
int eprintf(int level, int var, const char *fmt, ...)
|
||||
{
|
||||
|
||||
|
@ -71,11 +100,6 @@ int eprintf(int level, int var, const char *fmt, ...)
|
|||
return ret;
|
||||
}
|
||||
|
||||
__attribute__((weak)) char *get_cpu_str(void)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static void addfield(char *map, char **dst, const char *sep,
|
||||
const char *a, jsmntok_t *bt)
|
||||
{
|
||||
|
@ -240,6 +264,7 @@ static struct map {
|
|||
{ "hisi_sccl,hha", "hisi_sccl,hha" },
|
||||
{ "hisi_sccl,l3c", "hisi_sccl,l3c" },
|
||||
{ "L3PMC", "amd_l3" },
|
||||
{ "DFPMC", "amd_df" },
|
||||
{}
|
||||
};
|
||||
|
||||
|
@ -318,12 +343,7 @@ static void print_events_table_prefix(FILE *fp, const char *tblname)
|
|||
close_table = 1;
|
||||
}
|
||||
|
||||
static int print_events_table_entry(void *data, char *name, char *event,
|
||||
char *desc, char *long_desc,
|
||||
char *pmu, char *unit, char *perpkg,
|
||||
char *metric_expr,
|
||||
char *metric_name, char *metric_group,
|
||||
char *deprecated, char *metric_constraint)
|
||||
static int print_events_table_entry(void *data, struct json_event *je)
|
||||
{
|
||||
struct perf_entry_data *pd = data;
|
||||
FILE *outfp = pd->outfp;
|
||||
|
@ -335,30 +355,32 @@ static int print_events_table_entry(void *data, char *name, char *event,
|
|||
*/
|
||||
fprintf(outfp, "{\n");
|
||||
|
||||
if (name)
|
||||
fprintf(outfp, "\t.name = \"%s\",\n", name);
|
||||
if (event)
|
||||
fprintf(outfp, "\t.event = \"%s\",\n", event);
|
||||
fprintf(outfp, "\t.desc = \"%s\",\n", desc);
|
||||
if (je->name)
|
||||
fprintf(outfp, "\t.name = \"%s\",\n", je->name);
|
||||
if (je->event)
|
||||
fprintf(outfp, "\t.event = \"%s\",\n", je->event);
|
||||
fprintf(outfp, "\t.desc = \"%s\",\n", je->desc);
|
||||
fprintf(outfp, "\t.topic = \"%s\",\n", topic);
|
||||
if (long_desc && long_desc[0])
|
||||
fprintf(outfp, "\t.long_desc = \"%s\",\n", long_desc);
|
||||
if (pmu)
|
||||
fprintf(outfp, "\t.pmu = \"%s\",\n", pmu);
|
||||
if (unit)
|
||||
fprintf(outfp, "\t.unit = \"%s\",\n", unit);
|
||||
if (perpkg)
|
||||
fprintf(outfp, "\t.perpkg = \"%s\",\n", perpkg);
|
||||
if (metric_expr)
|
||||
fprintf(outfp, "\t.metric_expr = \"%s\",\n", metric_expr);
|
||||
if (metric_name)
|
||||
fprintf(outfp, "\t.metric_name = \"%s\",\n", metric_name);
|
||||
if (metric_group)
|
||||
fprintf(outfp, "\t.metric_group = \"%s\",\n", metric_group);
|
||||
if (deprecated)
|
||||
fprintf(outfp, "\t.deprecated = \"%s\",\n", deprecated);
|
||||
if (metric_constraint)
|
||||
fprintf(outfp, "\t.metric_constraint = \"%s\",\n", metric_constraint);
|
||||
if (je->long_desc && je->long_desc[0])
|
||||
fprintf(outfp, "\t.long_desc = \"%s\",\n", je->long_desc);
|
||||
if (je->pmu)
|
||||
fprintf(outfp, "\t.pmu = \"%s\",\n", je->pmu);
|
||||
if (je->unit)
|
||||
fprintf(outfp, "\t.unit = \"%s\",\n", je->unit);
|
||||
if (je->perpkg)
|
||||
fprintf(outfp, "\t.perpkg = \"%s\",\n", je->perpkg);
|
||||
if (je->aggr_mode)
|
||||
fprintf(outfp, "\t.aggr_mode = \"%d\",\n", convert(je->aggr_mode));
|
||||
if (je->metric_expr)
|
||||
fprintf(outfp, "\t.metric_expr = \"%s\",\n", je->metric_expr);
|
||||
if (je->metric_name)
|
||||
fprintf(outfp, "\t.metric_name = \"%s\",\n", je->metric_name);
|
||||
if (je->metric_group)
|
||||
fprintf(outfp, "\t.metric_group = \"%s\",\n", je->metric_group);
|
||||
if (je->deprecated)
|
||||
fprintf(outfp, "\t.deprecated = \"%s\",\n", je->deprecated);
|
||||
if (je->metric_constraint)
|
||||
fprintf(outfp, "\t.metric_constraint = \"%s\",\n", je->metric_constraint);
|
||||
fprintf(outfp, "},\n");
|
||||
|
||||
return 0;
|
||||
|
@ -373,6 +395,7 @@ struct event_struct {
|
|||
char *pmu;
|
||||
char *unit;
|
||||
char *perpkg;
|
||||
char *aggr_mode;
|
||||
char *metric_expr;
|
||||
char *metric_name;
|
||||
char *metric_group;
|
||||
|
@ -380,17 +403,17 @@ struct event_struct {
|
|||
char *metric_constraint;
|
||||
};
|
||||
|
||||
#define ADD_EVENT_FIELD(field) do { if (field) { \
|
||||
es->field = strdup(field); \
|
||||
#define ADD_EVENT_FIELD(field) do { if (je->field) { \
|
||||
es->field = strdup(je->field); \
|
||||
if (!es->field) \
|
||||
goto out_free; \
|
||||
} } while (0)
|
||||
|
||||
#define FREE_EVENT_FIELD(field) free(es->field)
|
||||
|
||||
#define TRY_FIXUP_FIELD(field) do { if (es->field && !*field) {\
|
||||
*field = strdup(es->field); \
|
||||
if (!*field) \
|
||||
#define TRY_FIXUP_FIELD(field) do { if (es->field && !je->field) {\
|
||||
je->field = strdup(es->field); \
|
||||
if (!je->field) \
|
||||
return -ENOMEM; \
|
||||
} } while (0)
|
||||
|
||||
|
@ -402,6 +425,7 @@ struct event_struct {
|
|||
op(pmu); \
|
||||
op(unit); \
|
||||
op(perpkg); \
|
||||
op(aggr_mode); \
|
||||
op(metric_expr); \
|
||||
op(metric_name); \
|
||||
op(metric_group); \
|
||||
|
@ -421,11 +445,7 @@ static void free_arch_std_events(void)
|
|||
}
|
||||
}
|
||||
|
||||
static int save_arch_std_events(void *data, char *name, char *event,
|
||||
char *desc, char *long_desc, char *pmu,
|
||||
char *unit, char *perpkg, char *metric_expr,
|
||||
char *metric_name, char *metric_group,
|
||||
char *deprecated, char *metric_constraint)
|
||||
static int save_arch_std_events(void *data, struct json_event *je)
|
||||
{
|
||||
struct event_struct *es;
|
||||
|
||||
|
@ -485,23 +505,15 @@ static char *real_event(const char *name, char *event)
|
|||
}
|
||||
|
||||
static int
|
||||
try_fixup(const char *fn, char *arch_std, char **event, char **desc,
|
||||
char **name, char **long_desc, char **pmu, char **filter,
|
||||
char **perpkg, char **unit, char **metric_expr, char **metric_name,
|
||||
char **metric_group, unsigned long long eventcode,
|
||||
char **deprecated, char **metric_constraint)
|
||||
try_fixup(const char *fn, char *arch_std, struct json_event *je, char **event)
|
||||
{
|
||||
/* try to find matching event from arch standard values */
|
||||
struct event_struct *es;
|
||||
|
||||
list_for_each_entry(es, &arch_std_events, list) {
|
||||
if (!strcmp(arch_std, es->name)) {
|
||||
if (!eventcode && es->event) {
|
||||
/* allow EventCode to be overridden */
|
||||
free(*event);
|
||||
*event = NULL;
|
||||
}
|
||||
FOR_ALL_EVENT_STRUCT_FIELDS(TRY_FIXUP_FIELD);
|
||||
*event = je->event;
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
@ -512,13 +524,8 @@ try_fixup(const char *fn, char *arch_std, char **event, char **desc,
|
|||
}
|
||||
|
||||
/* Call func with each event in the json file */
|
||||
int json_events(const char *fn,
|
||||
int (*func)(void *data, char *name, char *event, char *desc,
|
||||
char *long_desc,
|
||||
char *pmu, char *unit, char *perpkg,
|
||||
char *metric_expr,
|
||||
char *metric_name, char *metric_group,
|
||||
char *deprecated, char *metric_constraint),
|
||||
static int json_events(const char *fn,
|
||||
int (*func)(void *data, struct json_event *je),
|
||||
void *data)
|
||||
{
|
||||
int err;
|
||||
|
@ -537,18 +544,10 @@ int json_events(const char *fn,
|
|||
EXPECT(tokens->type == JSMN_ARRAY, tokens, "expected top level array");
|
||||
tok = tokens + 1;
|
||||
for (i = 0; i < tokens->size; i++) {
|
||||
char *event = NULL, *desc = NULL, *name = NULL;
|
||||
char *long_desc = NULL;
|
||||
char *event = NULL;
|
||||
char *extra_desc = NULL;
|
||||
char *pmu = NULL;
|
||||
char *filter = NULL;
|
||||
char *perpkg = NULL;
|
||||
char *unit = NULL;
|
||||
char *metric_expr = NULL;
|
||||
char *metric_name = NULL;
|
||||
char *metric_group = NULL;
|
||||
char *deprecated = NULL;
|
||||
char *metric_constraint = NULL;
|
||||
struct json_event je = {};
|
||||
char *arch_std = NULL;
|
||||
unsigned long long eventcode = 0;
|
||||
struct msrmap *msr = NULL;
|
||||
|
@ -583,14 +582,14 @@ int json_events(const char *fn,
|
|||
eventcode |= strtoul(code, NULL, 0) << 21;
|
||||
free(code);
|
||||
} else if (json_streq(map, field, "EventName")) {
|
||||
addfield(map, &name, "", "", val);
|
||||
addfield(map, &je.name, "", "", val);
|
||||
} else if (json_streq(map, field, "BriefDescription")) {
|
||||
addfield(map, &desc, "", "", val);
|
||||
fixdesc(desc);
|
||||
addfield(map, &je.desc, "", "", val);
|
||||
fixdesc(je.desc);
|
||||
} else if (json_streq(map, field,
|
||||
"PublicDescription")) {
|
||||
addfield(map, &long_desc, "", "", val);
|
||||
fixdesc(long_desc);
|
||||
addfield(map, &je.long_desc, "", "", val);
|
||||
fixdesc(je.long_desc);
|
||||
} else if (json_streq(map, field, "PEBS") && nz) {
|
||||
precise = val;
|
||||
} else if (json_streq(map, field, "MSRIndex") && nz) {
|
||||
|
@ -610,34 +609,36 @@ int json_events(const char *fn,
|
|||
|
||||
ppmu = field_to_perf(unit_to_pmu, map, val);
|
||||
if (ppmu) {
|
||||
pmu = strdup(ppmu);
|
||||
je.pmu = strdup(ppmu);
|
||||
} else {
|
||||
if (!pmu)
|
||||
pmu = strdup("uncore_");
|
||||
addfield(map, &pmu, "", "", val);
|
||||
for (s = pmu; *s; s++)
|
||||
if (!je.pmu)
|
||||
je.pmu = strdup("uncore_");
|
||||
addfield(map, &je.pmu, "", "", val);
|
||||
for (s = je.pmu; *s; s++)
|
||||
*s = tolower(*s);
|
||||
}
|
||||
addfield(map, &desc, ". ", "Unit: ", NULL);
|
||||
addfield(map, &desc, "", pmu, NULL);
|
||||
addfield(map, &desc, "", " ", NULL);
|
||||
addfield(map, &je.desc, ". ", "Unit: ", NULL);
|
||||
addfield(map, &je.desc, "", je.pmu, NULL);
|
||||
addfield(map, &je.desc, "", " ", NULL);
|
||||
} else if (json_streq(map, field, "Filter")) {
|
||||
addfield(map, &filter, "", "", val);
|
||||
} else if (json_streq(map, field, "ScaleUnit")) {
|
||||
addfield(map, &unit, "", "", val);
|
||||
addfield(map, &je.unit, "", "", val);
|
||||
} else if (json_streq(map, field, "PerPkg")) {
|
||||
addfield(map, &perpkg, "", "", val);
|
||||
addfield(map, &je.perpkg, "", "", val);
|
||||
} else if (json_streq(map, field, "AggregationMode")) {
|
||||
addfield(map, &je.aggr_mode, "", "", val);
|
||||
} else if (json_streq(map, field, "Deprecated")) {
|
||||
addfield(map, &deprecated, "", "", val);
|
||||
addfield(map, &je.deprecated, "", "", val);
|
||||
} else if (json_streq(map, field, "MetricName")) {
|
||||
addfield(map, &metric_name, "", "", val);
|
||||
addfield(map, &je.metric_name, "", "", val);
|
||||
} else if (json_streq(map, field, "MetricGroup")) {
|
||||
addfield(map, &metric_group, "", "", val);
|
||||
addfield(map, &je.metric_group, "", "", val);
|
||||
} else if (json_streq(map, field, "MetricConstraint")) {
|
||||
addfield(map, &metric_constraint, "", "", val);
|
||||
addfield(map, &je.metric_constraint, "", "", val);
|
||||
} else if (json_streq(map, field, "MetricExpr")) {
|
||||
addfield(map, &metric_expr, "", "", val);
|
||||
for (s = metric_expr; *s; s++)
|
||||
addfield(map, &je.metric_expr, "", "", val);
|
||||
for (s = je.metric_expr; *s; s++)
|
||||
*s = tolower(*s);
|
||||
} else if (json_streq(map, field, "ArchStdEvent")) {
|
||||
addfield(map, &arch_std, "", "", val);
|
||||
|
@ -646,7 +647,7 @@ int json_events(const char *fn,
|
|||
}
|
||||
/* ignore unknown fields */
|
||||
}
|
||||
if (precise && desc && !strstr(desc, "(Precise Event)")) {
|
||||
if (precise && je.desc && !strstr(je.desc, "(Precise Event)")) {
|
||||
if (json_streq(map, precise, "2"))
|
||||
addfield(map, &extra_desc, " ",
|
||||
"(Must be precise)", NULL);
|
||||
|
@ -656,48 +657,44 @@ int json_events(const char *fn,
|
|||
}
|
||||
snprintf(buf, sizeof buf, "event=%#llx", eventcode);
|
||||
addfield(map, &event, ",", buf, NULL);
|
||||
if (desc && extra_desc)
|
||||
addfield(map, &desc, " ", extra_desc, NULL);
|
||||
if (long_desc && extra_desc)
|
||||
addfield(map, &long_desc, " ", extra_desc, NULL);
|
||||
if (je.desc && extra_desc)
|
||||
addfield(map, &je.desc, " ", extra_desc, NULL);
|
||||
if (je.long_desc && extra_desc)
|
||||
addfield(map, &je.long_desc, " ", extra_desc, NULL);
|
||||
if (filter)
|
||||
addfield(map, &event, ",", filter, NULL);
|
||||
if (msr != NULL)
|
||||
addfield(map, &event, ",", msr->pname, msrval);
|
||||
if (name)
|
||||
fixname(name);
|
||||
if (je.name)
|
||||
fixname(je.name);
|
||||
|
||||
if (arch_std) {
|
||||
/*
|
||||
* An arch standard event is referenced, so try to
|
||||
* fixup any unassigned values.
|
||||
*/
|
||||
err = try_fixup(fn, arch_std, &event, &desc, &name,
|
||||
&long_desc, &pmu, &filter, &perpkg,
|
||||
&unit, &metric_expr, &metric_name,
|
||||
&metric_group, eventcode,
|
||||
&deprecated, &metric_constraint);
|
||||
err = try_fixup(fn, arch_std, &je, &event);
|
||||
if (err)
|
||||
goto free_strings;
|
||||
}
|
||||
err = func(data, name, real_event(name, event), desc, long_desc,
|
||||
pmu, unit, perpkg, metric_expr, metric_name,
|
||||
metric_group, deprecated, metric_constraint);
|
||||
je.event = real_event(je.name, event);
|
||||
err = func(data, &je);
|
||||
free_strings:
|
||||
free(event);
|
||||
free(desc);
|
||||
free(name);
|
||||
free(long_desc);
|
||||
free(je.desc);
|
||||
free(je.name);
|
||||
free(je.long_desc);
|
||||
free(extra_desc);
|
||||
free(pmu);
|
||||
free(je.pmu);
|
||||
free(filter);
|
||||
free(perpkg);
|
||||
free(deprecated);
|
||||
free(unit);
|
||||
free(metric_expr);
|
||||
free(metric_name);
|
||||
free(metric_group);
|
||||
free(metric_constraint);
|
||||
free(je.perpkg);
|
||||
free(je.aggr_mode);
|
||||
free(je.deprecated);
|
||||
free(je.unit);
|
||||
free(je.metric_expr);
|
||||
free(je.metric_name);
|
||||
free(je.metric_group);
|
||||
free(je.metric_constraint);
|
||||
free(arch_std);
|
||||
|
||||
if (err)
|
||||
|
|
|
@ -1,23 +0,0 @@
|
|||
/* SPDX-License-Identifier: GPL-2.0 */
|
||||
#ifndef JEVENTS_H
|
||||
#define JEVENTS_H 1
|
||||
|
||||
int json_events(const char *fn,
|
||||
int (*func)(void *data, char *name, char *event, char *desc,
|
||||
char *long_desc,
|
||||
char *pmu,
|
||||
char *unit, char *perpkg, char *metric_expr,
|
||||
char *metric_name, char *metric_group,
|
||||
char *deprecated, char *metric_constraint),
|
||||
void *data);
|
||||
char *get_cpu_str(void);
|
||||
|
||||
#ifndef min
|
||||
#define min(x, y) ({ \
|
||||
typeof(x) _min1 = (x); \
|
||||
typeof(y) _min2 = (y); \
|
||||
(void) (&_min1 == &_min2); \
|
||||
_min1 < _min2 ? _min1 : _min2; })
|
||||
#endif
|
||||
|
||||
#endif
|
|
@ -2,6 +2,11 @@
|
|||
#ifndef PMU_EVENTS_H
|
||||
#define PMU_EVENTS_H
|
||||
|
||||
enum aggr_mode_class {
|
||||
PerChip = 1,
|
||||
PerCore
|
||||
};
|
||||
|
||||
/*
|
||||
* Describe each PMU event. Each CPU has a table of PMU events.
|
||||
*/
|
||||
|
@ -14,6 +19,7 @@ struct pmu_event {
|
|||
const char *pmu;
|
||||
const char *unit;
|
||||
const char *perpkg;
|
||||
const char *aggr_mode;
|
||||
const char *metric_expr;
|
||||
const char *metric_name;
|
||||
const char *metric_group;
|
||||
|
|
|
@ -12,8 +12,10 @@
|
|||
|
||||
from __future__ import print_function
|
||||
|
||||
import os, sys
|
||||
sys.path.append(os.environ['PERF_EXEC_PATH'] + '/scripts/python/Perf-Trace-Util/lib/Perf/Trace')
|
||||
import os
|
||||
import sys
|
||||
sys.path.append(os.environ['PERF_EXEC_PATH'] +
|
||||
'/scripts/python/Perf-Trace-Util/lib/Perf/Trace')
|
||||
from Util import *
|
||||
|
||||
process_names = {}
|
||||
|
@ -23,6 +25,7 @@ thread_blocktime = {}
|
|||
lock_waits = {} # long-lived stats on (tid,lock) blockage elapsed time
|
||||
process_names = {} # long-lived pid-to-execname mapping
|
||||
|
||||
|
||||
def syscalls__sys_enter_futex(event, ctxt, cpu, s, ns, tid, comm, callchain,
|
||||
nr, uaddr, op, val, utime, uaddr2, val3):
|
||||
cmd = op & FUTEX_CMD_MASK
|
||||
|
@ -33,6 +36,7 @@ def syscalls__sys_enter_futex(event, ctxt, cpu, s, ns, tid, comm, callchain,
|
|||
thread_thislock[tid] = uaddr
|
||||
thread_blocktime[tid] = nsecs(s, ns)
|
||||
|
||||
|
||||
def syscalls__sys_exit_futex(event, ctxt, cpu, s, ns, tid, comm, callchain,
|
||||
nr, ret):
|
||||
if tid in thread_blocktime:
|
||||
|
@ -41,12 +45,13 @@ def syscalls__sys_exit_futex(event, ctxt, cpu, s, ns, tid, comm, callchain,
|
|||
del thread_blocktime[tid]
|
||||
del thread_thislock[tid]
|
||||
|
||||
|
||||
def trace_begin():
|
||||
print("Press control+C to stop and show the summary")
|
||||
|
||||
|
||||
def trace_end():
|
||||
for (tid, lock) in lock_waits:
|
||||
min, max, avg, count = lock_waits[tid, lock]
|
||||
print("%s[%d] lock %x contended %d times, %d avg ns" %
|
||||
(process_names[tid], tid, lock, count, avg))
|
||||
|
||||
print("%s[%d] lock %x contended %d times, %d avg ns [max: %d ns, min %d ns]" %
|
||||
(process_names[tid], tid, lock, count, avg, max, min))
|
||||
|
|
|
@ -60,6 +60,8 @@ perf-y += api-io.o
|
|||
perf-y += demangle-java-test.o
|
||||
perf-y += pfm.o
|
||||
perf-y += parse-metric.o
|
||||
perf-y += pe-file-parsing.o
|
||||
perf-y += expand-cgroup.o
|
||||
|
||||
$(OUTPUT)tests/llvm-src-base.c: tests/bpf-script-example.c tests/Build
|
||||
$(call rule_mkdir)
|
||||
|
|
|
@ -30,9 +30,9 @@
|
|||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
#include <unistd.h>
|
||||
#include "../perf-sys.h"
|
||||
#include <subcmd/exec-cmd.h>
|
||||
#include "event.h"
|
||||
#include "util.h"
|
||||
#include "tests.h"
|
||||
|
||||
#define ENV "PERF_TEST_ATTR"
|
||||
|
|
|
@ -341,6 +341,14 @@ static struct test generic_tests[] = {
|
|||
.desc = "Parse and process metrics",
|
||||
.func = test__parse_metric,
|
||||
},
|
||||
{
|
||||
.desc = "PE file support",
|
||||
.func = test__pe_file_parsing,
|
||||
},
|
||||
{
|
||||
.desc = "Event expansion for cgroups",
|
||||
.func = test__expand_cgroup_events,
|
||||
},
|
||||
{
|
||||
.func = NULL,
|
||||
},
|
||||
|
|
|
@ -0,0 +1,241 @@
|
|||
// SPDX-License-Identifier: GPL-2.0
|
||||
#include "tests.h"
|
||||
#include "debug.h"
|
||||
#include "evlist.h"
|
||||
#include "cgroup.h"
|
||||
#include "rblist.h"
|
||||
#include "metricgroup.h"
|
||||
#include "parse-events.h"
|
||||
#include "pmu-events/pmu-events.h"
|
||||
#include "pfm.h"
|
||||
#include <subcmd/parse-options.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
static int test_expand_events(struct evlist *evlist,
|
||||
struct rblist *metric_events)
|
||||
{
|
||||
int i, ret = TEST_FAIL;
|
||||
int nr_events;
|
||||
bool was_group_event;
|
||||
int nr_members; /* for the first evsel only */
|
||||
const char cgrp_str[] = "A,B,C";
|
||||
const char *cgrp_name[] = { "A", "B", "C" };
|
||||
int nr_cgrps = ARRAY_SIZE(cgrp_name);
|
||||
char **ev_name;
|
||||
struct evsel *evsel;
|
||||
|
||||
TEST_ASSERT_VAL("evlist is empty", !perf_evlist__empty(evlist));
|
||||
|
||||
nr_events = evlist->core.nr_entries;
|
||||
ev_name = calloc(nr_events, sizeof(*ev_name));
|
||||
if (ev_name == NULL) {
|
||||
pr_debug("memory allocation failure\n");
|
||||
return TEST_FAIL;
|
||||
}
|
||||
i = 0;
|
||||
evlist__for_each_entry(evlist, evsel) {
|
||||
ev_name[i] = strdup(evsel->name);
|
||||
if (ev_name[i] == NULL) {
|
||||
pr_debug("memory allocation failure\n");
|
||||
goto out;
|
||||
}
|
||||
i++;
|
||||
}
|
||||
/* remember grouping info */
|
||||
was_group_event = evsel__is_group_event(evlist__first(evlist));
|
||||
nr_members = evlist__first(evlist)->core.nr_members;
|
||||
|
||||
ret = evlist__expand_cgroup(evlist, cgrp_str, metric_events, false);
|
||||
if (ret < 0) {
|
||||
pr_debug("failed to expand events for cgroups\n");
|
||||
goto out;
|
||||
}
|
||||
|
||||
ret = TEST_FAIL;
|
||||
if (evlist->core.nr_entries != nr_events * nr_cgrps) {
|
||||
pr_debug("event count doesn't match\n");
|
||||
goto out;
|
||||
}
|
||||
|
||||
i = 0;
|
||||
evlist__for_each_entry(evlist, evsel) {
|
||||
if (strcmp(evsel->name, ev_name[i % nr_events])) {
|
||||
pr_debug("event name doesn't match:\n");
|
||||
pr_debug(" evsel[%d]: %s\n expected: %s\n",
|
||||
i, evsel->name, ev_name[i % nr_events]);
|
||||
goto out;
|
||||
}
|
||||
if (strcmp(evsel->cgrp->name, cgrp_name[i / nr_events])) {
|
||||
pr_debug("cgroup name doesn't match:\n");
|
||||
pr_debug(" evsel[%d]: %s\n expected: %s\n",
|
||||
i, evsel->cgrp->name, cgrp_name[i / nr_events]);
|
||||
goto out;
|
||||
}
|
||||
|
||||
if ((i % nr_events) == 0) {
|
||||
if (evsel__is_group_event(evsel) != was_group_event) {
|
||||
pr_debug("event group doesn't match: got %s, expect %s\n",
|
||||
evsel__is_group_event(evsel) ? "true" : "false",
|
||||
was_group_event ? "true" : "false");
|
||||
goto out;
|
||||
}
|
||||
if (evsel->core.nr_members != nr_members) {
|
||||
pr_debug("event group member doesn't match: %d vs %d\n",
|
||||
evsel->core.nr_members, nr_members);
|
||||
goto out;
|
||||
}
|
||||
}
|
||||
i++;
|
||||
}
|
||||
ret = TEST_OK;
|
||||
|
||||
out: for (i = 0; i < nr_events; i++)
|
||||
free(ev_name[i]);
|
||||
free(ev_name);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int expand_default_events(void)
|
||||
{
|
||||
int ret;
|
||||
struct evlist *evlist;
|
||||
struct rblist metric_events;
|
||||
|
||||
evlist = perf_evlist__new_default();
|
||||
TEST_ASSERT_VAL("failed to get evlist", evlist);
|
||||
|
||||
rblist__init(&metric_events);
|
||||
ret = test_expand_events(evlist, &metric_events);
|
||||
evlist__delete(evlist);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int expand_group_events(void)
|
||||
{
|
||||
int ret;
|
||||
struct evlist *evlist;
|
||||
struct rblist metric_events;
|
||||
struct parse_events_error err;
|
||||
const char event_str[] = "{cycles,instructions}";
|
||||
|
||||
symbol_conf.event_group = true;
|
||||
|
||||
evlist = evlist__new();
|
||||
TEST_ASSERT_VAL("failed to get evlist", evlist);
|
||||
|
||||
ret = parse_events(evlist, event_str, &err);
|
||||
if (ret < 0) {
|
||||
pr_debug("failed to parse event '%s', err %d, str '%s'\n",
|
||||
event_str, ret, err.str);
|
||||
parse_events_print_error(&err, event_str);
|
||||
goto out;
|
||||
}
|
||||
|
||||
rblist__init(&metric_events);
|
||||
ret = test_expand_events(evlist, &metric_events);
|
||||
out:
|
||||
evlist__delete(evlist);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int expand_libpfm_events(void)
|
||||
{
|
||||
int ret;
|
||||
struct evlist *evlist;
|
||||
struct rblist metric_events;
|
||||
const char event_str[] = "UNHALTED_CORE_CYCLES";
|
||||
struct option opt = {
|
||||
.value = &evlist,
|
||||
};
|
||||
|
||||
symbol_conf.event_group = true;
|
||||
|
||||
evlist = evlist__new();
|
||||
TEST_ASSERT_VAL("failed to get evlist", evlist);
|
||||
|
||||
ret = parse_libpfm_events_option(&opt, event_str, 0);
|
||||
if (ret < 0) {
|
||||
pr_debug("failed to parse libpfm event '%s', err %d\n",
|
||||
event_str, ret);
|
||||
goto out;
|
||||
}
|
||||
if (perf_evlist__empty(evlist)) {
|
||||
pr_debug("libpfm was not enabled\n");
|
||||
goto out;
|
||||
}
|
||||
|
||||
rblist__init(&metric_events);
|
||||
ret = test_expand_events(evlist, &metric_events);
|
||||
out:
|
||||
evlist__delete(evlist);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int expand_metric_events(void)
|
||||
{
|
||||
int ret;
|
||||
struct evlist *evlist;
|
||||
struct rblist metric_events;
|
||||
const char metric_str[] = "CPI";
|
||||
|
||||
struct pmu_event pme_test[] = {
|
||||
{
|
||||
.metric_expr = "instructions / cycles",
|
||||
.metric_name = "IPC",
|
||||
},
|
||||
{
|
||||
.metric_expr = "1 / IPC",
|
||||
.metric_name = "CPI",
|
||||
},
|
||||
{
|
||||
.metric_expr = NULL,
|
||||
.metric_name = NULL,
|
||||
},
|
||||
};
|
||||
struct pmu_events_map ev_map = {
|
||||
.cpuid = "test",
|
||||
.version = "1",
|
||||
.type = "core",
|
||||
.table = pme_test,
|
||||
};
|
||||
|
||||
evlist = evlist__new();
|
||||
TEST_ASSERT_VAL("failed to get evlist", evlist);
|
||||
|
||||
rblist__init(&metric_events);
|
||||
ret = metricgroup__parse_groups_test(evlist, &ev_map, metric_str,
|
||||
false, false, &metric_events);
|
||||
if (ret < 0) {
|
||||
pr_debug("failed to parse '%s' metric\n", metric_str);
|
||||
goto out;
|
||||
}
|
||||
|
||||
ret = test_expand_events(evlist, &metric_events);
|
||||
|
||||
out:
|
||||
metricgroup__rblist_exit(&metric_events);
|
||||
evlist__delete(evlist);
|
||||
return ret;
|
||||
}
|
||||
|
||||
int test__expand_cgroup_events(struct test *test __maybe_unused,
|
||||
int subtest __maybe_unused)
|
||||
{
|
||||
int ret;
|
||||
|
||||
ret = expand_default_events();
|
||||
TEST_ASSERT_EQUAL("failed to expand default events", ret, 0);
|
||||
|
||||
ret = expand_group_events();
|
||||
TEST_ASSERT_EQUAL("failed to expand event group", ret, 0);
|
||||
|
||||
ret = expand_libpfm_events();
|
||||
TEST_ASSERT_EQUAL("failed to expand event group", ret, 0);
|
||||
|
||||
ret = expand_metric_events();
|
||||
TEST_ASSERT_EQUAL("failed to expand metric events", ret, 0);
|
||||
|
||||
return ret;
|
||||
}
|
|
@ -91,6 +91,7 @@ make_no_sdt := NO_SDT=1
|
|||
make_no_syscall_tbl := NO_SYSCALL_TABLE=1
|
||||
make_with_clangllvm := LIBCLANGLLVM=1
|
||||
make_with_libpfm4 := LIBPFM4=1
|
||||
make_with_gtk2 := GTK2=1
|
||||
make_tags := tags
|
||||
make_cscope := cscope
|
||||
make_help := help
|
||||
|
@ -154,6 +155,7 @@ run += make_no_syscall_tbl
|
|||
run += make_with_babeltrace
|
||||
run += make_with_clangllvm
|
||||
run += make_with_libpfm4
|
||||
run += make_with_gtk2
|
||||
run += make_help
|
||||
run += make_doc
|
||||
run += make_perf_o
|
||||
|
|
|
@ -557,6 +557,7 @@ static int test__checkevent_pmu_events(struct evlist *evlist)
|
|||
TEST_ASSERT_VAL("wrong exclude_hv", evsel->core.attr.exclude_hv);
|
||||
TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip);
|
||||
TEST_ASSERT_VAL("wrong pinned", !evsel->core.attr.pinned);
|
||||
TEST_ASSERT_VAL("wrong exclusive", !evsel->core.attr.exclusive);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -575,6 +576,7 @@ static int test__checkevent_pmu_events_mix(struct evlist *evlist)
|
|||
TEST_ASSERT_VAL("wrong exclude_hv", evsel->core.attr.exclude_hv);
|
||||
TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip);
|
||||
TEST_ASSERT_VAL("wrong pinned", !evsel->core.attr.pinned);
|
||||
TEST_ASSERT_VAL("wrong exclusive", !evsel->core.attr.exclusive);
|
||||
|
||||
/* cpu/pmu-event/u*/
|
||||
evsel = evsel__next(evsel);
|
||||
|
@ -587,6 +589,7 @@ static int test__checkevent_pmu_events_mix(struct evlist *evlist)
|
|||
TEST_ASSERT_VAL("wrong exclude_hv", evsel->core.attr.exclude_hv);
|
||||
TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip);
|
||||
TEST_ASSERT_VAL("wrong pinned", !evsel->core.attr.pinned);
|
||||
TEST_ASSERT_VAL("wrong exclusive", !evsel->core.attr.pinned);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -1277,6 +1280,49 @@ static int test__pinned_group(struct evlist *evlist)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int test__checkevent_exclusive_modifier(struct evlist *evlist)
|
||||
{
|
||||
struct evsel *evsel = evlist__first(evlist);
|
||||
|
||||
TEST_ASSERT_VAL("wrong exclude_user", !evsel->core.attr.exclude_user);
|
||||
TEST_ASSERT_VAL("wrong exclude_kernel", evsel->core.attr.exclude_kernel);
|
||||
TEST_ASSERT_VAL("wrong exclude_hv", evsel->core.attr.exclude_hv);
|
||||
TEST_ASSERT_VAL("wrong precise_ip", evsel->core.attr.precise_ip);
|
||||
TEST_ASSERT_VAL("wrong exclusive", evsel->core.attr.exclusive);
|
||||
|
||||
return test__checkevent_symbolic_name(evlist);
|
||||
}
|
||||
|
||||
static int test__exclusive_group(struct evlist *evlist)
|
||||
{
|
||||
struct evsel *evsel, *leader;
|
||||
|
||||
TEST_ASSERT_VAL("wrong number of entries", 3 == evlist->core.nr_entries);
|
||||
|
||||
/* cycles - group leader */
|
||||
evsel = leader = evlist__first(evlist);
|
||||
TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->core.attr.type);
|
||||
TEST_ASSERT_VAL("wrong config",
|
||||
PERF_COUNT_HW_CPU_CYCLES == evsel->core.attr.config);
|
||||
TEST_ASSERT_VAL("wrong group name", !evsel->group_name);
|
||||
TEST_ASSERT_VAL("wrong leader", evsel->leader == leader);
|
||||
TEST_ASSERT_VAL("wrong exclusive", evsel->core.attr.exclusive);
|
||||
|
||||
/* cache-misses - can not be pinned, but will go on with the leader */
|
||||
evsel = evsel__next(evsel);
|
||||
TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->core.attr.type);
|
||||
TEST_ASSERT_VAL("wrong config",
|
||||
PERF_COUNT_HW_CACHE_MISSES == evsel->core.attr.config);
|
||||
TEST_ASSERT_VAL("wrong exclusive", !evsel->core.attr.exclusive);
|
||||
|
||||
/* branch-misses - ditto */
|
||||
evsel = evsel__next(evsel);
|
||||
TEST_ASSERT_VAL("wrong config",
|
||||
PERF_COUNT_HW_BRANCH_MISSES == evsel->core.attr.config);
|
||||
TEST_ASSERT_VAL("wrong exclusive", !evsel->core.attr.exclusive);
|
||||
|
||||
return 0;
|
||||
}
|
||||
static int test__checkevent_breakpoint_len(struct evlist *evlist)
|
||||
{
|
||||
struct evsel *evsel = evlist__first(evlist);
|
||||
|
@ -1765,7 +1811,17 @@ static struct evlist_test test__events[] = {
|
|||
.name = "cycles:k",
|
||||
.check = test__sym_event_dc,
|
||||
.id = 55,
|
||||
}
|
||||
},
|
||||
{
|
||||
.name = "instructions:uep",
|
||||
.check = test__checkevent_exclusive_modifier,
|
||||
.id = 56,
|
||||
},
|
||||
{
|
||||
.name = "{cycles,cache-misses,branch-misses}:e",
|
||||
.check = test__exclusive_group,
|
||||
.id = 57,
|
||||
},
|
||||
};
|
||||
|
||||
static struct evlist_test test__events_pmu[] = {
|
||||
|
|
|
@ -11,8 +11,6 @@
|
|||
#include "debug.h"
|
||||
#include "expr.h"
|
||||
#include "stat.h"
|
||||
#include <perf/cpumap.h>
|
||||
#include <perf/evlist.h>
|
||||
|
||||
static struct pmu_event pme_test[] = {
|
||||
{
|
||||
|
@ -159,6 +157,7 @@ static int __compute_metric(const char *name, struct value *vals,
|
|||
}
|
||||
|
||||
perf_evlist__set_maps(&evlist->core, cpus, NULL);
|
||||
runtime_stat__init(&st);
|
||||
|
||||
/* Parse the metric into metric_events list. */
|
||||
err = metricgroup__parse_groups_test(evlist, &map, name,
|
||||
|
@ -172,7 +171,6 @@ static int __compute_metric(const char *name, struct value *vals,
|
|||
goto out;
|
||||
|
||||
/* Load the runtime stats with given numbers for events. */
|
||||
runtime_stat__init(&st);
|
||||
load_runtime_stat(&st, evlist, vals);
|
||||
|
||||
/* And execute the metric */
|
||||
|
|
|
@ -0,0 +1,98 @@
|
|||
// SPDX-License-Identifier: GPL-2.0
|
||||
#include <stdbool.h>
|
||||
#include <inttypes.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <linux/bitops.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/types.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
#include <unistd.h>
|
||||
#include <subcmd/exec-cmd.h>
|
||||
|
||||
#include "debug.h"
|
||||
#include "util/build-id.h"
|
||||
#include "util/symbol.h"
|
||||
#include "util/dso.h"
|
||||
|
||||
#include "tests.h"
|
||||
|
||||
#ifdef HAVE_LIBBFD_SUPPORT
|
||||
|
||||
static int run_dir(const char *d)
|
||||
{
|
||||
char filename[PATH_MAX];
|
||||
char debugfile[PATH_MAX];
|
||||
struct build_id bid;
|
||||
char debuglink[PATH_MAX];
|
||||
char expect_build_id[] = {
|
||||
0x5a, 0x0f, 0xd8, 0x82, 0xb5, 0x30, 0x84, 0x22,
|
||||
0x4b, 0xa4, 0x7b, 0x62, 0x4c, 0x55, 0xa4, 0x69,
|
||||
};
|
||||
char expect_debuglink[PATH_MAX] = "pe-file.exe.debug";
|
||||
struct dso *dso;
|
||||
struct symbol *sym;
|
||||
int ret;
|
||||
|
||||
scnprintf(filename, PATH_MAX, "%s/pe-file.exe", d);
|
||||
ret = filename__read_build_id(filename, &bid);
|
||||
TEST_ASSERT_VAL("Failed to read build_id",
|
||||
ret == sizeof(expect_build_id));
|
||||
TEST_ASSERT_VAL("Wrong build_id", !memcmp(bid.data, expect_build_id,
|
||||
sizeof(expect_build_id)));
|
||||
|
||||
ret = filename__read_debuglink(filename, debuglink, PATH_MAX);
|
||||
TEST_ASSERT_VAL("Failed to read debuglink", ret == 0);
|
||||
TEST_ASSERT_VAL("Wrong debuglink",
|
||||
!strcmp(debuglink, expect_debuglink));
|
||||
|
||||
scnprintf(debugfile, PATH_MAX, "%s/%s", d, debuglink);
|
||||
ret = filename__read_build_id(debugfile, &bid);
|
||||
TEST_ASSERT_VAL("Failed to read debug file build_id",
|
||||
ret == sizeof(expect_build_id));
|
||||
TEST_ASSERT_VAL("Wrong build_id", !memcmp(bid.data, expect_build_id,
|
||||
sizeof(expect_build_id)));
|
||||
|
||||
dso = dso__new(filename);
|
||||
TEST_ASSERT_VAL("Failed to get dso", dso);
|
||||
|
||||
ret = dso__load_bfd_symbols(dso, debugfile);
|
||||
TEST_ASSERT_VAL("Failed to load symbols", ret == 0);
|
||||
|
||||
dso__sort_by_name(dso);
|
||||
sym = dso__find_symbol_by_name(dso, "main");
|
||||
TEST_ASSERT_VAL("Failed to find main", sym);
|
||||
dso__delete(dso);
|
||||
|
||||
return TEST_OK;
|
||||
}
|
||||
|
||||
int test__pe_file_parsing(struct test *test __maybe_unused,
|
||||
int subtest __maybe_unused)
|
||||
{
|
||||
struct stat st;
|
||||
char path_dir[PATH_MAX];
|
||||
|
||||
/* First try development tree tests. */
|
||||
if (!lstat("./tests", &st))
|
||||
return run_dir("./tests");
|
||||
|
||||
/* Then installed path. */
|
||||
snprintf(path_dir, PATH_MAX, "%s/tests", get_argv_exec_path());
|
||||
|
||||
if (!lstat(path_dir, &st))
|
||||
return run_dir(path_dir);
|
||||
|
||||
return TEST_SKIP;
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
int test__pe_file_parsing(struct test *test __maybe_unused,
|
||||
int subtest __maybe_unused)
|
||||
{
|
||||
return TEST_SKIP;
|
||||
}
|
||||
|
||||
#endif
|
|
@ -0,0 +1,14 @@
|
|||
// SPDX-License-Identifier: GPL-2.0
|
||||
|
||||
// pe-file.exe and pe-file.exe.debug built with;
|
||||
// x86_64-w64-mingw32-gcc -o pe-file.exe pe-file.c
|
||||
// -Wl,--file-alignment,4096 -Wl,--build-id
|
||||
// x86_64-w64-mingw32-objcopy --only-keep-debug
|
||||
// --compress-debug-sections pe-file.exe pe-file.exe.debug
|
||||
// x86_64-w64-mingw32-objcopy --strip-debug
|
||||
// --add-gnu-debuglink=pe-file.exe.debug pe-file.exe
|
||||
|
||||
int main(int argc, char const *argv[])
|
||||
{
|
||||
return 0;
|
||||
}
|
Binary file not shown.
Binary file not shown.
|
@ -18,6 +18,7 @@ int test__python_use(struct test *test __maybe_unused, int subtest __maybe_unuse
|
|||
PYTHONPATH, PYTHON, verbose > 0 ? "" : "2> /dev/null") < 0)
|
||||
return -1;
|
||||
|
||||
pr_debug("python usage test: \"%s\"\n", cmd);
|
||||
ret = system(cmd) ? -1 : 0;
|
||||
free(cmd);
|
||||
return ret;
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue