perf/urgent fixes and improvements
Arnaldo Carvalho de Melo
maintainerHi Ingo,
Please consider pulling,
- Arnaldo
Test results at the end of this message, as usual.
The following changes since commit 2696ec4566f598ab483a6bebc4ec841b2efb88ec:
Merge tag 'perf-core-for-mingo-4.18-20180606' of git://git.kernel.org/pub/scm/linux/kernel/git/acme/linux into perf/urgent (2018-06-07 07:18:51 +0200)
are available in the Git repository at:
git://git.kernel.org/pub/scm/linux/kernel/git/acme/linux.git tags/perf-urgent-for-mingo-4.18-20180611
for you to fetch changes up to fad76d4333fe73cf3f73704aa34d4ce523b1c458:
perf script: Show hw-cache events (2018-06-08 13:41:30 -0300)
----------------------------------------------------------------
perf/urgent fixes and improvements:
perf stat:
. Add --interval-clear option, to provide a 'watch' like printing (Jiri Olsa)
. Fix metric column header display alignment (Jiri Olsa)
. Improve error messages for default attributes, providing better output
for error in command lines such as:
$ perf stat -T
Cannot set up transaction events
event syntax error: '..cycles,cpu/cycles-t/,cpu/tx-start/,cpu/el-start/,cpu/cycles-ct/}'
\___ unknown termWhere the "event syntax error" line now appears (Jiri Olsa)
perf script:
. Show hw-cache events too (Seeteena Thoufeek)
perf c2c:
. Fix data dependency problem in layout of 'struct c2c_hist_entry', where
its member 'struct hist_entry' must be at the end because it has a ZLA as its last member, that gets space when handling callchains (Jiri Olsa)
Core:
- We cannot assume that a 'struct perf_evsel' is to be obtained from a container_of operation on a 'struct hists' as there are tools, such as 'perf c2c' that uses 'struct hist' instances without having them in container structs that also have 'struct perf_evsel' in a particular layout, so provide a different way of figuring out if a 'struct hists' and 'struct hist_entry' have callchains (Arnaldo Carvalho de Melo)
- Fix error index in the PMU event parser, so that error messages can point to the problematic token (Jiri Olsa)
----------------------------------------------------------------
Arnaldo Carvalho de Melo (4):
perf hists: Save the callchain_size in struct hist_entry perf hists: Make hist_entry__has_callchains() work with 'perf c2c' perf hists browser gtk: Use hist_entry__has_callchains() perf hists: Reimplement hists__has_callchains()
Jiri Olsa (7):
perf tools: Fix error index for pmu event parser
perf stat: Add --interval-clear option
perf stat: Use only color_fprintf call in print_metric_only perf stat: Fix metric column header display alignment perf stat: Allow to specify specific metric column len perf stat: Add event parsing error handling to add_default_attributes perf c2c: Keep struct hist_entry at the end of struct c2c_hist_entry
Seeteena Thoufeek (1):
perf script: Show hw-cache events
tools/perf/Documentation/perf-stat.txt | 3 +++ tools/perf/builtin-c2c.c | 10 +++---- tools/perf/builtin-script.c | 12 +++++++++ tools/perf/builtin-stat.c | 48 ++++++++++++++++++++-------------- tools/perf/ui/gtk/hists.c | 2 +- tools/perf/util/hist.c | 12 ++++++--- tools/perf/util/hist.h | 4 +-- tools/perf/util/parse-events.y | 5 ++++ tools/perf/util/sort.h | 4 ++- 9 files changed, 67 insertions(+), 33 deletions(-)
Test results:
The first ones are container (docker) based builds of tools/perf with and without libelf support. Where clang is available, it is also used to build perf with/without libelf, and building with LIBCLANGLLVM=1 (built-in clang) with gcc and clang when clang and its devel libraries are installed.
The objtool and samples/bpf/ builds are disabled now that I'm switching from using the sources in a local volume to fetching them from a http server to build it inside the container, to make it easier to build in a container cluster. Those will come back later.
Several are cross builds, the ones with -x-ARCH and the android one, and those may not have all the features built, due to lack of multi-arch devel packages, available and being used so far on just a few, like debian:experimental-x-{arm64,mipsel}.
The 'perf test' one will perform a variety of tests exercising tools/perf/util/, tools/lib/{bpf,traceevent,etc}, as well as run perf commands with a variety of command line event specifications to then intercept the sys_perf_event syscall to check that the perf_event_attr fields are set up as expected, among a variety of other unit tests.
Then there is the 'make -C tools/perf build-test' ones, that build tools/perf/ with a variety of feature sets, exercising the build with an incomplete set of features as well as with a complete one. It is planned to have it run on each of the containers mentioned above, using some container orchestration infrastructure. Get in contact if interested in helping having this in place.
# dm 1 alpine:3.4 : Ok gcc (Alpine 5.3.0) 5.3.0 2 alpine:3.5 : Ok gcc (Alpine 6.2.1) 6.2.1 20160822 3 alpine:3.6 : Ok gcc (Alpine 6.3.0) 6.3.0 4 alpine:3.7 : Ok gcc (Alpine 6.4.0) 6.4.0 5 alpine:edge : Ok gcc (Alpine 6.4.0) 6.4.0 6 amazonlinux:1 : Ok gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-11) 7 amazonlinux:2 : Ok gcc (GCC) 7.3.1 20180303 (Red Hat 7.3.1-5) 8 android-ndk:r12b-arm : Ok arm-linux-androideabi-gcc (GCC) 4.9.x 20150123 (prerelease) 9 android-ndk:r15c-arm : Ok arm-linux-androideabi-gcc (GCC) 4.9.x 20150123 (prerelease) 10 centos:5 : Ok gcc (GCC) 4.1.2 20080704 (Red Hat 4.1.2-55) 11 centos:6 : Ok gcc (GCC) 4.4.7 20120313 (Red Hat 4.4.7-18) 12 centos:7 : Ok gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-16) 13 debian:7 : Ok gcc (Debian 4.7.2-5) 4.7.2 14 debian:8 : Ok gcc (Debian 4.9.2-10+deb8u1) 4.9.2 15 debian:9 : Ok gcc (Debian 6.3.0-18+deb9u1) 6.3.0 20170516 16 debian:experimental : Ok gcc (Debian 7.3.0-15) 7.3.0 17 debian:experimental-x-arm64 : Ok aarch64-linux-gnu-gcc (Debian 7.3.0-15) 7.3.0 18 debian:experimental-x-mips : Ok mips-linux-gnu-gcc (Debian 7.3.0-19) 7.3.0 19 debian:experimental-x-mips64 : Ok mips64-linux-gnuabi64-gcc (Debian 7.3.0-18) 7.3.0 20 debian:experimental-x-mipsel : Ok mipsel-linux-gnu-gcc (Debian 7.3.0-20) 7.3.0 21 fedora:20 : Ok gcc (GCC) 4.8.3 20140911 (Red Hat 4.8.3-7) 22 fedora:21 : Ok gcc (GCC) 4.9.2 20150212 (Red Hat 4.9.2-6) 23 fedora:22 : Ok gcc (GCC) 5.3.1 20160406 (Red Hat 5.3.1-6) 24 fedora:23 : Ok gcc (GCC) 5.3.1 20160406 (Red Hat 5.3.1-6) 25 fedora:24 : Ok gcc (GCC) 6.3.1 20161221 (Red Hat 6.3.1-1) 26 fedora:24-x-ARC-uClibc : Ok arc-linux-gcc (ARCompact ISA Linux uClibc toolchain 2017.09-rc2) 7.1.1 20170710 27 fedora:25 : Ok gcc (GCC) 6.4.1 20170727 (Red Hat 6.4.1-1) 28 fedora:26 : Ok gcc (GCC) 7.3.1 20180130 (Red Hat 7.3.1-2) 29 fedora:27 : Ok gcc (GCC) 7.3.1 20180303 (Red Hat 7.3.1-5) 30 fedora:28 : Ok gcc (GCC) 8.0.1 20180324 (Red Hat 8.0.1-0.20) 31 fedora:rawhide : Ok gcc (GCC) 8.0.1 20180324 (Red Hat 8.0.1-0.20) 32 gentoo-stage3-amd64:latest : Ok gcc (Gentoo 6.4.0-r1 p1.3) 6.4.0 33 mageia:5 : Ok gcc (GCC) 4.9.2 34 mageia:6 : Ok gcc (Mageia 5.5.0-1.mga6) 5.5.0 35 opensuse:42.1 : Ok gcc (SUSE Linux) 4.8.5 36 opensuse:42.2 : Ok gcc (SUSE Linux) 4.8.5 37 opensuse:42.3 : Ok gcc (SUSE Linux) 4.8.5 38 opensuse:tumbleweed : Ok gcc (SUSE Linux) 7.3.1 20180323 [gcc-7-branch revision 258812] 39 oraclelinux:6 : Ok gcc (GCC) 4.4.7 20120313 (Red Hat 4.4.7-18.0.7) 40 oraclelinux:7 : Ok gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-28.0.1) 41 ubuntu:12.04.5 : Ok gcc (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3 42 ubuntu:14.04.4 : Ok gcc (Ubuntu 4.8.4-2ubuntu1~14.04.3) 4.8.4 43 ubuntu:14.04.4-x-linaro-arm64 : Ok aarch64-linux-gnu-gcc (Linaro GCC 5.4-2017.05) 5.4.1 20170404 44 ubuntu:15.04 : Ok gcc (Ubuntu 4.9.2-10ubuntu13) 4.9.2 45 ubuntu:16.04 : Ok gcc (Ubuntu 5.4.0-6ubuntu1~16.04.9) 5.4.0 20160609 46 ubuntu:16.04-x-arm : Ok arm-linux-gnueabihf-gcc (Ubuntu/Linaro 5.4.0-6ubuntu1~16.04.9) 5.4.0 20160609 47 ubuntu:16.04-x-arm64 : Ok aarch64-linux-gnu-gcc (Ubuntu/Linaro 5.4.0-6ubuntu1~16.04.9) 5.4.0 20160609 48 ubuntu:16.04-x-powerpc : Ok powerpc-linux-gnu-gcc (Ubuntu 5.4.0-6ubuntu1~16.04.9) 5.4.0 20160609 49 ubuntu:16.04-x-powerpc64 : Ok powerpc64-linux-gnu-gcc (Ubuntu/IBM 5.4.0-6ubuntu1~16.04.9) 5.4.0 20160609 50 ubuntu:16.04-x-powerpc64el : Ok powerpc64le-linux-gnu-gcc (Ubuntu/IBM 5.4.0-6ubuntu1~16.04.9) 5.4.0 20160609 51 ubuntu:16.04-x-s390 : Ok s390x-linux-gnu-gcc (Ubuntu 5.4.0-6ubuntu1~16.04.9) 5.4.0 20160609 52 ubuntu:16.10 : Ok gcc (Ubuntu 6.2.0-5ubuntu12) 6.2.0 20161005 53 ubuntu:17.04 : Ok gcc (Ubuntu 6.3.0-12ubuntu2) 6.3.0 20170406 54 ubuntu:17.10 : Ok gcc (Ubuntu 7.2.0-8ubuntu3.2) 7.2.0 55 ubuntu:18.04 : Ok gcc (Ubuntu 7.3.0-16ubuntu3) 7.3.0
# git log --oneline -1 fad76d4333fe (HEAD -> perf/urgent) perf script: Show hw-cache events # perf version perf version 4.17.gfad76d4 # uname -a Linux jouet 4.17.0-rc5 #21 SMP Mon May 14 15:35:35 -03 2018 x86_64 x86_64 x86_64 GNU/Linux # perf test 1: vmlinux symtab matches kallsyms : Ok 2: Detect openat syscall event : Ok 3: Detect openat syscall event on all cpus : Ok 4: Read samples using the mmap interface : Ok 5: Test data source output : Ok 6: Parse event definition strings : Ok 7: Simple expression parser : Ok 8: PERF_RECORD_* events & perf_sample fields : Ok 9: Parse perf pmu format : Ok 10: DSO data read : Ok 11: DSO data cache : Ok 12: DSO data reopen : Ok 13: Roundtrip evsel->name : Ok 14: Parse sched tracepoints fields : Ok 15: syscalls:sys_enter_openat event fields : Ok 16: Setup struct perf_event_attr : Ok 17: Match and link multiple hists : Ok 18: 'import perf' in python : Ok 19: Breakpoint overflow signal handler : Ok 20: Breakpoint overflow sampling : Ok 21: Breakpoint accounting : Ok 22: Number of exit events of a simple workload : Ok 23: Software clock events period values : Ok 24: Object code reading : Ok 25: Sample parsing : Ok 26: Use a dummy software event to keep tracking : Ok 27: Parse with no sample_id_all bit set : Ok 28: Filter hist entries : Ok 29: Lookup mmap thread : Ok 30: Share thread mg : Ok 31: Sort output of hist entries : Ok 32: Cumulate child hist entries : Ok 33: Track with sched_switch : Ok 34: Filter fds with revents mask in a fdarray : Ok 35: Add fd to a fdarray, making it autogrow : Ok 36: kmod_path__parse : Ok 37: Thread map : Ok 38: LLVM search and compile : 38.1: Basic BPF llvm compile : Ok 38.2: kbuild searching : Ok 38.3: Compile source for BPF prologue generation : Ok 38.4: Compile source for BPF relocation : Ok 39: Session topology : Ok 40: BPF filter : 40.1: Basic BPF filtering : Ok 40.2: BPF pinning : Ok 40.3: BPF prologue generation : Ok 40.4: BPF relocation checker : Ok 41: Synthesize thread map : Ok 42: Remove thread map : Ok 43: Synthesize cpu map : Ok 44: Synthesize stat config : Ok 45: Synthesize stat : Ok 46: Synthesize stat round : Ok 47: Synthesize attr update : Ok 48: Event times : Ok 49: Read backward ring buffer : Ok 50: Print cpu map : Ok 51: Probe SDT events : Ok 52: is_printable_array : Ok 53: Print bitmap : Ok 54: perf hooks : Ok 55: builtin clang support : Skip (not compiled in) 56: unit_number__scnprintf : Ok 57: mem2node : Ok 58: x86 rdpmc : Ok 59: Convert perf time to TSC : Ok 60: DWARF unwind : Ok 61: x86 instruction decoder - new instructions : Ok 62: Use vfs_getname probe to get syscall args filenames : Ok 63: Check open filename arg using perf trace + vfs_getname: Ok 64: probe libc's inet_pton & backtrace it with ping : Ok 65: Add vfs_getname probe to get syscall args filenames : Ok #
$ make -C tools/perf build-test
make: Entering directory '/home/acme/git/perf/tools/perf'
- tarpkg: ./tests/perf-targz-src-pkg .
make_install_O: make install
make_no_libperl_O: make NO_LIBPERL=1
make_no_newt_O: make NO_NEWT=1
make_no_ui_O: make NO_NEWT=1 NO_SLANG=1 NO_GTK2=1
make_clean_all_O: make clean all
make_pure_O: make
make_with_clangllvm_O: make LIBCLANGLLVM=1
make_install_prefix_slash_O: make install prefix=/tmp/krava/
make_perf_o_O: make perf.o
make_no_demangle_O: make NO_DEMANGLE=1
make_util_pmu_bison_o_O: make util/pmu-bison.o
make_no_scripts_O: make NO_LIBPYTHON=1 NO_LIBPERL=1
make_no_slang_O: make NO_SLANG=1
make_debug_O: make DEBUG=1
make_doc_O: make doc
make_no_libunwind_O: make NO_LIBUNWIND=1
make_tags_O: make tags
make_install_prefix_O: make install prefix=/tmp/krava
make_no_libpython_O: make NO_LIBPYTHON=1
make_install_bin_O: make install-bin
make_with_babeltrace_O: make LIBBABELTRACE=1
make_no_libelf_O: make NO_LIBELF=1
make_util_map_o_O: make util/map.o
make_no_libdw_dwarf_unwind_O: make NO_LIBDW_DWARF_UNWIND=1
make_static_O: make LDFLAGS=-static
make_no_libbionic_O: make NO_LIBBIONIC=1
make_help_O: make help
make_minimal_O: make NO_LIBPERL=1 NO_LIBPYTHON=1 NO_NEWT=1 NO_GTK2=1 NO_DEMANGLE=1 NO_LIBELF=1 NO_LIBUNWIND=1 NO_BACKTRACE=1 NO_LIBNUMA=1 NO_LIBAUDIT=1 NO_LIBBIONIC=1 NO_LIBDW_DWARF_UNWIND=1 NO_AUXTRACE=1 NO_LIBBPF=1 NO_LIBCRYPTO=1 NO_SDT=1 NO_JVMTI=1
make_no_libaudit_O: make NO_LIBAUDIT=1
make_no_auxtrace_O: make NO_AUXTRACE=1
make_no_gtk2_O: make NO_GTK2=1
make_no_libnuma_O: make NO_LIBNUMA=1
make_no_backtrace_O: make NO_BACKTRACE=1
make_no_libbpf_O: make NO_LIBBPF=1
OK
make: Leaving directory '/home/acme/git/perf/tools/perf'
$Arnaldo Carvalho de Melo
maintainerPATCH 1/12 perf hists: Save the callchain_size in struct hist_entry
From: Arnaldo Carvalho de Melo <[email protected]>
So that we can figure out the real size of the struct and also be able to tell if callchains may be present in this histogram entry.
Since we can't always guarantee that from hist_entry->hists we can use hists_to_evsel, to then look at evsel->attr.sample_type for PERF_SAMPLE_CALLCHAIN, like with the 'perf c2c' tool, that uses plain 'struct hists' instances, we need another way of deciding if a specific hist_entry instance has callchains associated with it, i.e. if its hist_entry->callchain[0] has space allocated for.
--- tools/perf/util/hist.c | 6 ++++-- tools/perf/util/sort.h | 2 ++ 2 files changed, 6 insertions(+), 2 deletions(-)
tools/perf/util/hist.c +4 -2
@@ -370,9 +370,11 @@ void hists__delete_entries(struct hists *hists)static int hist_entry__init (struct hist_entry *he,struct hist_entry *template, -bool sample_self) +bool sample_self, +size_t callchain_size) { *he = *template; + he->callchain_size = callchain_size;if (symbol_conf.cumulate_callchain) { he->stat_acc =malloc (sizeof (he->stat));
@@ -473,7 +475,7 @@ static struct hist_entry *hist_entry__new(struct hist_entry *template, he = ops->new (callchain_size);if (he) { - err =hist_entry__init (he, template, sample_self); + err =hist_entry__init (he, template, sample_self, callchain_size);if (err) { ops->free (he); he =NULL ;
tools/perf/util/sort.h +2 -0
@@ -112,6 +112,8 @@ struct hist_entry {char level;u8 filtered; + +u16 callchain_size;union {/* * Since perf diff only supports the stdio output, TUI
Signature · 1 line
2.14.3
Arnaldo Carvalho de Melo
maintainerPATCH 2/12 perf hists: Make hist_entry__has_callchains() work with 'perf c2c'
In reply to Arnaldo Carvalho de MeloFrom: Arnaldo Carvalho de Melo <[email protected]>
Since 'perf c2c' uses 'struct hists' not allocated together with a 'struct perf_evsel' instance, we can't go from a 'struct hist_entry' pointer to a 'struct perf_evsel' via he->hists, so, instead, check if space was set aside for hist_entry->callchain[0] at hist_entry__new() time.
--- tools/perf/util/sort.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
tools/perf/util/sort.h +1 -1
@@ -155,7 +155,7 @@ struct hist_entry {static __pure inline bool hist_entry__has_callchains (struct hist_entry *he) { -return hists__has_callchains (he->hists); +return he->callchain_size !=0 ; }static inline bool hist_entry__has_pairs (struct hist_entry *he)
Signature · 1 line
2.14.3
Arnaldo Carvalho de Melo
maintainerPATCH 3/12 perf hists browser gtk: Use hist_entry__has_callchains()
In reply to Arnaldo Carvalho de MeloFrom: Arnaldo Carvalho de Melo <[email protected]>
Since we can't go from struct hists to struct evsel for all cases (c2c is an exception) and we have access to the hist_entry, use hist_entry__has_callchains() in the GTK+ hists browser to figure out if callchains are available.
--- tools/perf/ui/gtk/hists.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
tools/perf/ui/gtk/hists.c +1 -1
@@ -382,7 +382,7 @@ static void perf_gtk__show_hists(GtkWidget *window, struct hists *hists,gtk_tree_store_set (store, &iter, col_idx++, s,-1 ); } -if (hists__has_callchains (hists) && +if (hist_entry__has_callchains (h) && symbol_conf.use_callchain &&hists__has (hists, sym)) {if (callchain_param.mode ==CHAIN_GRAPH_REL ) total = symbol_conf.cumulate_callchain ?
Signature · 1 line
2.14.3
Arnaldo Carvalho de Melo
maintainerPATCH 4/12 perf hists: Reimplement hists__has_callchains()
In reply to Arnaldo Carvalho de MeloFrom: Arnaldo Carvalho de Melo <[email protected]>
There are places where we have only access to struct hists and need to know if any of its hist_entries has callchains, like when drawing headers for the various output modes (stdio, TUI, etc), so, when adding a new hist_entry, check if it has callchains, storing this info for later use by hists__has_callchains().
This reimplementation is necessary because not always a 'struct hists' is allocated together with a 'struct perf evsel', so we can't go from 'hists' to 'perf_event_attr.sample_type & PERF_SAMPLE_CALLCHAIN'.
--- tools/perf/util/hist.c | 6 ++++-- tools/perf/util/hist.h | 4 ++-- 2 files changed, 6 insertions(+), 4 deletions(-)
tools/perf/util/hist.c +4 -2
@@ -621,9 +621,11 @@ __hists__add_entry(struct hists *hists, .raw_data = sample->raw_data, .raw_size = sample->raw_size, .ops = ops, - }; + }, *he = hists__findnew_entry(hists, &entry, al, sample_self); -return hists__findnew_entry (hists, &entry, al, sample_self); +if (!hists->has_callchains && he && he->callchain_size !=0 ) + hists->has_callchains = true; +return he; } struct hist_entry *hists__add_entry(struct hists *hists,
tools/perf/util/hist.h +2 -2
@@ -85,6 +85,7 @@ struct hists {struct events_stats stats;u64 event_stream;u16 col_len[HISTC_NR_COLS ]; +bool has_callchains;int socket_filter;struct perf_hpp_list *hpp_list;struct list_head hpp_formats;
@@ -222,8 +223,7 @@ static inline struct hists *evsel__hists(struct perf_evsel *evsel)static __pure inline bool hists__has_callchains (struct hists *hists) { -const struct perf_evsel *evsel =hists_to_evsel (hists); -return evsel__has_callchain (evsel); +return hists->has_callchains; }int hists__init (void );
Signature · 1 line
2.14.3
Arnaldo Carvalho de Melo
maintainerPATCH 5/12 perf tools: Fix error index for pmu event parser
In reply to Arnaldo Carvalho de MeloFrom: Jiri Olsa <[email protected]>
For events we provide specific error message we need to set error column index, PMU parser is missing that, adding it.
Before:
$ perf stat -e cycles,krava/cycles/ kill
event syntax error: 'cycles,krava/cycles/'
\___ Cannot find PMU `krava'. Missing kernel support?After:
$ perf stat -e cycles,krava/cycles/ kill
event syntax error: 'cycles,krava/cycles/'
\___ Cannot find PMU `krava'. Missing kernel support?--- tools/perf/util/parse-events.y | 5 +++++ 1 file changed, 5 insertions(+)
tools/perf/util/parse-events.y +5 -0
@@ -227,11 +227,16 @@ event_def: event_pmu | event_pmu: PE_NAME opt_pmu_config { + struct parse_events_state *parse_state = _parse_state; + struct parse_events_error *error = parse_state->error; struct list_head *list, *orig_terms, *terms; if (parse_events_copy_term_list($2, &orig_terms)) YYABORT; + if (error) + error->idx = @1.first_column; + ALLOC_LIST(list); if (parse_events_add_pmu(_parse_state, list, $1, $2, false, false)) { struct perf_pmu *pmu = NULL;
Signature · 1 line
2.14.3
Arnaldo Carvalho de Melo
maintainerPATCH 6/12 perf stat: Add --interval-clear option
In reply to Arnaldo Carvalho de MeloFrom: Jiri Olsa <[email protected]>
Adding --interval-clear option to clear the screen before next interval.
Committer testing:
# perf stat -I 1000 --interval-clear
And, as expected, it behaves almost like:
# watch -n 0 perf stat -a sleep 1
--- tools/perf/Documentation/perf-stat.txt | 3 +++ tools/perf/builtin-stat.c | 11 +++++++++-- 2 files changed, 12 insertions(+), 2 deletions(-)
tools/perf/Documentation/perf-stat.txt +3 -0
@@ -178,6 +178,9 @@ Print count deltas for fixed number of times. This option should be used together with "-I" option. example: 'perf stat -I 1000 --interval-count 2 -e cycles -a' +--interval-clear:: +Clear the screen before next interval. + --timeout msecs:: Stop the 'perf stat' session and print count deltas after N milliseconds (minimum: 10 ms). This option is not supported with the "-I" option.
tools/perf/builtin-stat.c +9 -2
@@ -65,6 +65,7 @@#include "util/tool.h" #include "util/string2.h" #include "util/metricgroup.h" +#include "util/top.h" #include "asm/bug.h" #include <linux/time64.h>
@@ -173,6 +174,7 @@ static struct cpu_map *aggr_map;static aggr_get_id_t aggr_get_id;static bool append_file;static bool interval_count; +static bool interval_clear;static const char *output_name;static int output_fd;static int print_free_counters_hint;
@@ -1704,9 +1706,12 @@ static void print_interval(char *prefix, struct timespec *ts)FILE *output = stat_config.output;static int num_print_interval; +if (interval_clear) +puts (CONSOLE_CLEAR ); +sprintf (prefix,"%6lu.%09lu%s" , ts->tv_sec, ts->tv_nsec, csv_sep); -if (num_print_interval ==0 && !csv_output) { +if ((num_print_interval ==0 && !csv_output) || interval_clear) {switch (stat_config.aggr_mode) {case AGGR_SOCKET :fprintf (output,"# time socket cpus" );
@@ -1738,7 +1743,7 @@ static void print_interval(char *prefix, struct timespec *ts) } } -if (num_print_interval ==0 && metric_only) +if ((num_print_interval ==0 && metric_only) || interval_clear)print_metric_headers (" " , true);if (++num_print_interval ==25 ) num_print_interval =0 ;
@@ -2057,6 +2062,8 @@ static const struct option stat_options[] = { "(overhead is possible for values <= 100ms)"),OPT_INTEGER (0 ,"interval-count" , &stat_config.times,"print counts for fixed number of times" ), +OPT_BOOLEAN (0 ,"interval-clear" , &interval_clear, +"clear screen in between new interval" ),OPT_UINTEGER (0 ,"timeout" , &stat_config.timeout,"stop workload and print counts after a timeout period in ms (>= 10ms)" ), OPT_SET_UINT(0, "per-socket", &stat_config.aggr_mode,
Signature · 1 line
2.14.3
Arnaldo Carvalho de Melo
maintainerPATCH 7/12 perf stat: Use only color_fprintf call in print_metric_only
In reply to Arnaldo Carvalho de MeloFrom: Jiri Olsa <[email protected]>
We can call color_fprintf also for non color case, it's handled properly. This change simplifies following patch.
--- tools/perf/builtin-stat.c | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-)
tools/perf/builtin-stat.c +1 -4
@@ -1008,10 +1008,7 @@ static void print_metric_only(void *ctx, const char *color, const char *fmt,if (!valid_only_metric (unit))return ; unit =fixunit (buf, os->evsel, unit); -if (color) - n =color_fprintf (out, color, fmt, val); -else - n =fprintf (out, fmt, val); + n =color_fprintf (out, color ?:"" , fmt, val);if (n >METRIC_ONLY_LEN ) n =METRIC_ONLY_LEN ;if (mlen <strlen (unit))
Signature · 1 line
2.14.3
Arnaldo Carvalho de Melo
maintainerPATCH 8/12 perf stat: Fix metric column header display alignment
In reply to Arnaldo Carvalho de MeloFrom: Jiri Olsa <[email protected]>
Make the metric only display aligned.
Before:
# perf stat --topdown -I 1000
# time core cpus retiring bad speculation frontend bound backend bound
1.000394323 S0-C0 2 37.4% 12.0% 31.4% 19.2%
1.000394323 S0-C1 2 25.1% 9.2% 43.8% 21.9%
2.001521204 S0-C0 2 36.4% 11.4% 32.4% 19.8%
2.001521204 S0-C1 2 26.2% 9.4% 43.1% 21.3%
3.001930208 S0-C0 2 35.1% 10.7% 33.6% 20.6%
3.001930208 S0-C1 2 28.9% 10.0% 40.0% 21.1%After:
# perf stat --topdown -I 1000
# time core cpus retiring bad speculation frontend bound backend bound
1.000303722 S0-C0 2 34.2% 7.6% 34.2% 24.0%
1.000303722 S0-C1 2 33.1% 6.4% 36.9% 23.6%
2.001281055 S0-C0 2 34.6% 6.7% 36.8% 21.8%
2.001281055 S0-C1 2 32.8% 7.1% 38.1% 22.0%
3.001546080 S0-C0 2 39.3% 5.5% 32.7% 22.5%
3.001546080 S0-C1 2 37.8% 6.0% 33.1% 23.1%--- tools/perf/builtin-stat.c | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-)
tools/perf/builtin-stat.c +9 -8
@@ -1001,19 +1001,20 @@ static void print_metric_only(void *ctx, const char *color, const char *fmt, {struct outstate *os = ctx;FILE *out = os->fh; -int n; -char buf[1024 ]; +char buf[1024 ], str[1024 ];unsigned mlen =METRIC_ONLY_LEN ;if (!valid_only_metric (unit))return ; unit =fixunit (buf, os->evsel, unit); - n =color_fprintf (out, color ?:"" , fmt, val); -if (n >METRIC_ONLY_LEN ) - n =METRIC_ONLY_LEN ;if (mlen <strlen (unit)) mlen =strlen (unit) +1 ; -fprintf (out,"%*s" , mlen - n,"" ); + +if (color) + mlen +=strlen (color) +sizeof (PERF_COLOR_RESET ) -1 ; + +color_snprintf (str,sizeof (str), color ?:"" , fmt, val); +fprintf (out,"%*s " , mlen, str); } static void print_metric_only_csv(void *ctx, const char *color __maybe_unused,
@@ -1053,7 +1054,7 @@ static void print_metric_header(void *ctx, const char *color __maybe_unused,if (csv_output)fprintf (os->fh,"%s%s" , unit, csv_sep);else -fprintf (os->fh,"%-*s " ,METRIC_ONLY_LEN , unit); +fprintf (os->fh,"%*s " ,METRIC_ONLY_LEN , unit); }static void nsec_printout (int id,int nr,struct perf_evsel *evsel,double avg)
@@ -1721,7 +1722,7 @@ static void print_interval(char *prefix, struct timespec *ts)fprintf (output," counts %*s events\n" , unit_width,"unit" );break ;case AGGR_NONE : -fprintf (output,"# time CPU" ); +fprintf (output,"# time CPU " );if (!metric_only)fprintf (output," counts %*s events\n" , unit_width,"unit" );break ;
Signature · 1 line
2.14.3
Arnaldo Carvalho de Melo
maintainerPATCH 9/12 perf stat: Allow to specify specific metric column len
In reply to Arnaldo Carvalho de MeloFrom: Jiri Olsa <[email protected]>
The following change will introduce new metrics, that doesn't need such wide hard coded spacing. Switch METRIC_ONLY_LEN macro usage with metric_only_len variable.
--- tools/perf/builtin-stat.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-)
tools/perf/builtin-stat.c +5 -4
@@ -145,6 +145,8 @@ static struct target target = {typedef int (*aggr_get_id_t )(struct cpu_map *m,int cpu); +#define METRIC_ONLY_LEN 20 +static int run_count =1 ;static bool no_inherit = false;static volatile pid_t child_pid =-1 ;
@@ -182,6 +184,7 @@ static int print_mixed_hw_group_error;static u64 *walltime_run;static bool ru_display = false;static struct rusage ru_data; +static unsigned int metric_only_len =METRIC_ONLY_LEN ;struct perf_stat {bool record;
@@ -969,8 +972,6 @@ static void print_metric_csv(void *ctx,fprintf (out,"%s%s%s%s" , csv_sep, vals, csv_sep, unit); } -#define METRIC_ONLY_LEN 20 -/* Filter out some columns that don't work well in metrics only mode */ static bool valid_only_metric (const char *unit)
@@ -1002,7 +1003,7 @@ static void print_metric_only(void *ctx, const char *color, const char *fmt,struct outstate *os = ctx;FILE *out = os->fh;char buf[1024 ], str[1024 ]; -unsigned mlen =METRIC_ONLY_LEN ; +unsigned mlen = metric_only_len;if (!valid_only_metric (unit))return ;
@@ -1054,7 +1055,7 @@ static void print_metric_header(void *ctx, const char *color __maybe_unused,if (csv_output)fprintf (os->fh,"%s%s" , unit, csv_sep);else -fprintf (os->fh,"%*s " ,METRIC_ONLY_LEN , unit); +fprintf (os->fh,"%*s " , metric_only_len, unit); }static void nsec_printout (int id,int nr,struct perf_evsel *evsel,double avg)
Signature · 1 line
2.14.3
Arnaldo Carvalho de Melo
maintainerPATCH 10/12 perf stat: Add event parsing error handling to add_default_attributes
In reply to Arnaldo Carvalho de MeloFrom: Jiri Olsa <[email protected]>
Add missing error handling for parse_events calls in add_default_attributes functions. The error handler displays error details, like for transactions (-T):
Before:
$ perf stat -T Cannot set up transaction events
After:
$ perf stat -T
Cannot set up transaction events
event syntax error: '..cycles,cpu/cycles-t/,cpu/tx-start/,cpu/el-start/,cpu/cycles-ct/}'
\___ unknown term--- tools/perf/builtin-stat.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-)
tools/perf/builtin-stat.c +6 -4
@@ -2442,14 +2442,13 @@ static int add_default_attributes(void) (PERF_COUNT_HW_CACHE_OP_PREFETCH << 8) | (PERF_COUNT_HW_CACHE_RESULT_MISS << 16) }, }; +struct parse_events_error errinfo;/* Set attrs if no event is selected and !null_run: */ if (null_run)return 0 ;if (transaction_run) { -struct parse_events_error errinfo; -if (pmu_have_event ("cpu" ,"cycles-ct" ) &&pmu_have_event ("cpu" ,"el-start" )) err = parse_events(evsel_list, transaction_attrs,
@@ -2460,6 +2459,7 @@ static int add_default_attributes(void) &errinfo);if (err) {fprintf (stderr,"Cannot set up transaction events\n" ); +parse_events_print_error (&errinfo, transaction_attrs);return -1 ; }return 0 ;
@@ -2485,10 +2485,11 @@ static int add_default_attributes(void) pmu_have_event("msr", "smi")) { if (!force_metric_only) metric_only = true; - err = parse_events(evsel_list, smi_cost_attrs, NULL); + err = parse_events(evsel_list, smi_cost_attrs, &errinfo); } else {fprintf (stderr,"To measure SMI cost, it needs " "msr/aperf/, msr/smi/ and cpu/cycles/ support\n" ); +parse_events_print_error (&errinfo, smi_cost_attrs);return -1 ; }if (err) {
@@ -2523,12 +2524,13 @@ static int add_default_attributes(void)if (topdown_attrs[0 ] && str) {if (warn)arch_topdown_group_warn (); - err =parse_events (evsel_list, str,NULL ); + err =parse_events (evsel_list, str, &errinfo);if (err) {fprintf (stderr,"Cannot set up top down events %s: %d\n" , str, err);free (str); +parse_events_print_error (&errinfo, str);return -1 ; } }else {
Signature · 1 line
2.14.3
Arnaldo Carvalho de Melo
maintainerPATCH 11/12 perf c2c: Keep struct hist_entry at the end of struct c2c_hist_entry
In reply to Arnaldo Carvalho de MeloFrom: Jiri Olsa <[email protected]>
Exactly as the comment just before 'struct c2c_hist_entry" says, i.e. the last entry in struct hist_entry is a zero length array, that when allocating space for hist_entry gets extra space if callchains are in use, which, if hist_entry is not at the end of c2c_hist_entry, the members after it gets corrupted when callchains get added to the rb trees collecting them, etc.
--- tools/perf/builtin-c2c.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-)
tools/perf/builtin-c2c.c +5 -5
@@ -56,16 +56,16 @@ struct c2c_hist_entry {struct compute_stats cstats; +unsigned long paddr; +unsigned long paddr_cnt; +bool paddr_zero; +char *nodestr; +/* * must be at the end, * because of its callchain dynamic entry */ struct hist_entry he; - -unsigned long paddr; -unsigned long paddr_cnt; -bool paddr_zero; -char *nodestr; };static char const *coalesce_default ="pid,iaddr" ;
Signature · 1 line
2.14.3
Arnaldo Carvalho de Melo
maintainerPATCH 12/12 perf script: Show hw-cache events
In reply to Arnaldo Carvalho de MeloFrom: Seeteena Thoufeek <[email protected]>
'perf script' fails to report hardware cache events (PERF_TYPE_HW_CACHE) where as 'perf report' shows the samples. Fix it. Ex,
# perf record -e L1-dcache-loads ./a.out [ perf record: Woken up 1 times to write data ] [ perf record: Captured and wrote 0.008 MB perf.data (11 samples)]
Before patch:
# perf script | wc -l 0
After patch:
# perf script | wc -l 11
Committer testing:
[root@jouet ~]# perf script | head -30 | tail
Timer 9803 [2] 8.963330: 1554 L1-dcache-loads: 7ffef89baae4 __vdso_clock_gettime+0xf4 ([vdso])
swapper 0 [2] 8.963343: 5626 L1-dcache-loads: ffffffffa66f4f6b cpuidle_not_av+0xb (/lib/modules/4.17.0-rc5/build/vmlinux)
firefox 4853 [2] 8.964070: 18935 L1-dcache-loads: 7f0b9a00dc30 xcb_poll_for_event+0x0 (/usr/lib64/libxcb.so.1.1.0)
Softwar~cTh 4928 [2] 8.964548: 15928 L1-dcache-loads: ffffffffa60d795c update_curr+0x10c (/lib/modules/4.17.0-rc5/build/vmlinux)
firefox 4853 [2] 8.964675: 14978 L1-dcache-loads: ffffffffa6897018 mutex_unlock+0x18 (/lib/modules/4.17.0-rc5/build/vmlinux)
gnome-shell 2026 [3] 8.964693: 50670 L1-dcache-loads: 7fa08854de6d g_source_iter_next+0x6d (/usr/lib64/libglib-2.0.so.0.5400.3)
Compositor 4929 [1] 8.964784: 71772 L1-dcache-loads: 7f0b936bf078 [unknown] (/usr/lib64/firefox/libxul.so)
Xwayland 2096 [2] 8.964919: 16799 L1-dcache-loads: 7f68ce2fcb8a glXGetCurrentContext+0x1a (/usr/lib64/libGLX.so.0.0.0) gnome-shell 2026 [3] 8.964997: 50670 L1-dcache-loads: 7fa08854de6d g_source_iter_next+0x6d (/usr/lib64/libglib-2.0.so.0.5400.3) [root@jouet ~]#
--- tools/perf/builtin-script.c | 12 ++++++++++++ 1 file changed, 12 insertions(+)
tools/perf/builtin-script.c +12 -0
@@ -180,6 +180,18 @@ static struct {PERF_OUTPUT_EVNAME |PERF_OUTPUT_TRACE }, + [PERF_TYPE_HW_CACHE] = { + .user_set = false, + + .fields =PERF_OUTPUT_COMM |PERF_OUTPUT_TID | +PERF_OUTPUT_CPU |PERF_OUTPUT_TIME | +PERF_OUTPUT_EVNAME |PERF_OUTPUT_IP | +PERF_OUTPUT_SYM |PERF_OUTPUT_SYMOFFSET | + PERF_OUTPUT_DSO | PERF_OUTPUT_PERIOD, + + .invalid_fields = PERF_OUTPUT_TRACE | PERF_OUTPUT_BPF_OUTPUT, + }, + [PERF_TYPE_RAW] = { .user_set = false,
Signature · 1 line
2.14.3
Quoted 82 lines · Arnaldo Carvalho de Melo
Hi Ingo,
Please consider pulling,
- Arnaldo
Test results at the end of this message, as usual.
The following changes since commit
2696ec4566f598ab483a6bebc4ec841b2efb88ec:Merge tag 'perf-core-for-mingo-4.18-20180606' of
git://git.kernel.org/pub/scm/linux/kernel/git/acme/linuxinto perf/urgent (2018-06-07 07:18:51 +0200)are available in the Git repository at:
git://git.kernel.org/pub/scm/linux/kernel/git/acme/linux.gittags/perf-urgent-for-mingo-4.18-20180611for you to fetch changes up to
fad76d4333fe73cf3f73704aa34d4ce523b1c458:perf script: Show hw-cache events (2018-06-08 13:41:30 -0300)
----------------------------------------------------------------
perf/urgent fixes and improvements:perf stat:
. Add --interval-clear option, to provide a 'watch' like printing (Jiri Olsa)
. Fix metric column header display alignment (Jiri Olsa)
. Improve error messages for default attributes, providing better output
for error in command lines such as:$ perf stat -T Cannot set up transaction events event syntax error: '..cycles,cpu/cycles-t/,cpu/tx-start/,cpu/el-start/,cpu/cycles-ct/}' \___ unknown termWhere the "event syntax error" line now appears (Jiri Olsa)
perf script:
. Show hw-cache events too (Seeteena Thoufeek)
perf c2c:
. Fix data dependency problem in layout of 'struct
c2c_hist_entry', where
its member 'structhist_entry' must be at the end because it has a ZLA as its last member, that gets space when handling callchains (Jiri Olsa)Core:
- We cannot assume that a 'struct
perf_evsel' is to be obtained from acontainer_ofoperation on a 'struct hists' as there are tools, such as 'perf c2c' that uses 'struct hist' instances without having them in container structs that also have 'structperf_evsel' in a particular layout, so provide a different way of figuring out if a 'struct hists' and 'structhist_entry' have callchains (Arnaldo Carvalho de Melo)- Fix error index in the PMU event parser, so that error messages can point to the problematic token (Jiri Olsa)
Signed-off-by Arnaldo Carvalho de Melo <[email protected]>----------------------------------------------------------------
Arnaldo Carvalho de Melo (4):
perf hists: Save thecallchain_sizein structhist_entryperf hists: Makehist_entry__has_callchains()work with 'perf c2c' perf hists browser gtk: Usehist_entry__has_callchains()perf hists: Reimplementhists__has_callchains()Jiri Olsa (7):
perf tools: Fix error index for pmu event parser
perf stat: Add --interval-clear option
perf stat: Use onlycolor_fprintfcall inprint_metric_onlyperf stat: Fix metric column header display alignment perf stat: Allow to specify specific metric column len perf stat: Add event parsing error handling toadd_default_attributesperf c2c: Keep structhist_entryat the end of structc2c_hist_entrySeeteena Thoufeek (1):
perf script: Show hw-cache events
Quoted 10 lines
tools/perf/Documentation/perf-stat.txt | 3 +++ tools/perf/builtin-c2c.c | 10 +++---- tools/perf/builtin-script.c | 12 +++++++++ tools/perf/builtin-stat.c | 48 ++++++++++++++++++++-------------- tools/perf/ui/gtk/hists.c | 2 +- tools/perf/util/hist.c | 12 ++++++--- tools/perf/util/hist.h | 4 +-- tools/perf/util/parse-events.y | 5 ++++ tools/perf/util/sort.h | 4 ++- 9 files changed, 67 insertions(+), 33 deletions(-)
Pulled, thanks a lot Arnaldo!
Ingo