perf/core improvements and fixes
Subsystems (3)
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 ee438ec8f33c5af0d4a4ffb935c5b9272e8c2680:
Merge tag 'perf-core-for-mingo-4.14-20170725' of git://git.kernel.org/pub/scm/linux/kernel/git/acme/linux into perf/core (2017-07-26 19:07:30 +0200)
are available in the git repository at:
git://git.kernel.org/pub/scm/linux/kernel/git/acme/linux.git tags/perf-core-for-mingo-4.14-20170728
for you to fetch changes up to 6b7007af728df7258bb60ed73099be3b59b3030e:
perf data: Add doc when no conversion support compiled (2017-07-28 16:30:45 -0300)
----------------------------------------------------------------
perf/core improvements and fixes for 4.14:
New features:
- Add PERF_SAMPLE_CALLCHAIN and PERF_RECORD_MMAP[2] to 'perf data' CTF conversion, allowing CTF trace visualization tools to show callchains and to resolve symbols (Geneviève Bastien)
Improvements:
- Use group read for event groups in 'perf stat', reducing overhead when groups are defined in the event specification, i.e. when using {} to enclose a list of events, asking them to be read at the same time, e.g.: "perf stat -e '{cycles,instructions}'" (Jiri Olsa)
Fixes:
- Do not overwrite perf_sample->weight in 'perf annotate' when processing samples, use whatever came from the kernel when perf_event_attr.sample_type has PERF_SAMPLE_WEIGHT set or just handle its default value, 0, when that is not set and "weight" is one of the sort orders chosen (Arnaldo Carvalho de Melo)
- 'perf annotate --show-total-period' fixes:
- TUI should show period, not nr_samples
- Set appropriate column width for period/percent
- Fix the column header to show "Period" when when that is what is being asked for
(Taeung Song, Arnaldo Carvalho de Melo)
- Use default sort if evlist is empty, fixing pipe mode (David Carrillo-Cisneros)
----------------------------------------------------------------
Arnaldo Carvalho de Melo (6):
perf annotate: Do not overwrite perf_sample->weight perf annotate stdio: Set enough columns for --show-total-period perf annotate: Fix storing per line sym_hist_entry perf annotate TUI: Use sym_hist_entry in disasm_line_samples perf annotate TUI: Clarify calculation of column header widths perf annotate TUI: Set appropriate column width for period/percent
David Carrillo-Cisneros (1):
perf sort: Use default sort if evlist is empty
Geneviève Bastien (3):
perf data: Add callchain to CTF conversion perf data: Add mmap[2] events to CTF conversion perf data: Add doc when no conversion support compiled
Jiri Olsa (3):
perf tools: Add perf_evsel__read_size function perf evsel: Add read_counter()
perf stat: Use group read for event groups
Taeung Song (2):
perf annotate TUI: Fix --show-total-period
perf annotate TUI: Fix column header when toggling period/percent
tools/perf/builtin-annotate.c | 2 - tools/perf/builtin-data.c | 2 +- tools/perf/builtin-stat.c | 30 +++++++- tools/perf/ui/browsers/annotate.c | 36 +++++----- tools/perf/util/annotate.c | 11 +-- tools/perf/util/counts.h | 1 + tools/perf/util/data-convert-bt.c | 127 +++++++++++++++++++++++++++++++++- tools/perf/util/evlist.h | 5 ++ tools/perf/util/evsel.c | 139 +++++++++++++++++++++++++++++++++++++- tools/perf/util/evsel.h | 2 + tools/perf/util/sort.c | 2 +- tools/perf/util/stat.c | 4 ++ tools/perf/util/stat.h | 5 +- 13 files changed, 334 insertions(+), 32 deletions(-)
Test results:
The first ones are container (docker) based builds of tools/perf with and without libelf support, objtool where it is supported and samples/bpf/, ditto. Where clang is available, it is also used to build perf with/without libelf.
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.
# uname -a Linux jouet 4.12.0-rc6+ #3 SMP Tue Jun 27 15:12:38 -03 2017 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: Parse event definition strings : Ok 6: Simple expression parser : Ok 7: PERF_RECORD_* events & perf_sample fields : Ok 8: Parse perf pmu format : Ok 9: DSO data read : Ok 10: DSO data cache : Ok 11: DSO data reopen : Ok 12: Roundtrip evsel->name : Ok 13: Parse sched tracepoints fields : Ok 14: syscalls:sys_enter_openat event fields : Ok 15: Setup struct perf_event_attr : Ok 16: Match and link multiple hists : Ok 17: 'import perf' in python : Ok 18: Breakpoint overflow signal handler : Ok 19: Breakpoint overflow sampling : Ok 20: Number of exit events of a simple workload : Ok 21: Software clock events period values : Ok 22: Object code reading : Ok 23: Sample parsing : Ok 24: Use a dummy software event to keep tracking: Ok 25: Parse with no sample_id_all bit set : Ok 26: Filter hist entries : Ok 27: Lookup mmap thread : Ok 28: Share thread mg : Ok 29: Sort output of hist entries : Ok 30: Cumulate child hist entries : Ok 31: Track with sched_switch : Ok 32: Filter fds with revents mask in a fdarray : Ok 33: Add fd to a fdarray, making it autogrow : Ok 34: kmod_path__parse : Ok 35: Thread map : Ok 36: LLVM search and compile : 36.1: Basic BPF llvm compile : Ok 36.2: kbuild searching : Ok 36.3: Compile source for BPF prologue generation: Ok 36.4: Compile source for BPF relocation : Ok 37: Session topology : Ok 38: BPF filter : 38.1: Basic BPF filtering : Ok 38.2: BPF pinning : Ok 38.3: BPF prologue generation : Ok 38.4: BPF relocation checker : Ok 39: Synthesize thread map : Ok 40: Remove thread map : Ok 41: Synthesize cpu map : Ok 42: Synthesize stat config : Ok 43: Synthesize stat : Ok 44: Synthesize stat round : Ok 45: Synthesize attr update : Ok 46: Event times : Ok 47: Read backward ring buffer : Ok 48: Print cpu map : Ok 49: Probe SDT events : Ok 50: is_printable_array : Ok 51: Print bitmap : Ok 52: perf hooks : Ok 53: builtin clang support : Skip (not compiled in) 54: unit_number__scnprintf : Ok 55: x86 rdpmc : Ok 56: Convert perf time to TSC : Ok 57: DWARF unwind : Ok 58: x86 instruction decoder - new instructions : Ok 59: Intel cqm nmi context read : Skip #
# dm 1 alpine:3.4: Ok 2 alpine:3.5: Ok 3 alpine:3.6: Ok 4 alpine:edge: Ok 5 android-ndk:r12b-arm: Ok 6 archlinux:latest: Ok 7 centos:5: Ok 8 centos:6: Ok 9 centos:7: Ok 10 debian:7: Ok 11 debian:8: Ok 12 debian:9: Ok 13 debian:experimental: Ok 14 debian:experimental-x-arm64: Ok 15 debian:experimental-x-mips: Ok 16 debian:experimental-x-mips64: Ok 17 debian:experimental-x-mipsel: Ok 18 fedora:20: Ok 19 fedora:21: Ok 20 fedora:22: Ok 21 fedora:23: Ok 22 fedora:24: Ok 23 fedora:24-x-ARC-uClibc: Ok 24 fedora:25: Ok 25 fedora:26: Ok 26 fedora:rawhide: FAIL 27 mageia:5: Ok 28 opensuse:13.2: Ok 29 opensuse:42.1: Ok 30 opensuse:42.2: Ok 31 opensuse:tumbleweed: Ok 32 oraclelinux:6: Ok 33 oraclelinux:7: Ok 34 ubuntu:12.04.5: Ok 35 ubuntu:14.04.4: Ok 36 ubuntu:14.04.4-x-linaro-arm64: Ok 37 ubuntu:15.10: Ok 38 ubuntu:16.04: Ok 39 ubuntu:16.04-x-arm: Ok 40 ubuntu:16.04-x-arm64: Ok 41 ubuntu:16.04-x-powerpc: Ok 42 ubuntu:16.04-x-powerpc64: Ok 43 ubuntu:16.04-x-powerpc64el: Ok 44 ubuntu:16.04-x-s390: Ok 45 ubuntu:16.10: Ok 46 ubuntu:17.04: Ok 47 ubuntu:17.10: Ok #
$ make -C tools/perf build-test
make: Entering directory '/home/acme/git/linux/tools/perf'
- tarpkg: ./tests/perf-targz-src-pkg .
make_no_libunwind_O: make NO_LIBUNWIND=1
make_install_prefix_O: make install prefix=/tmp/krava
make_static_O: make LDFLAGS=-static
make_no_libdw_dwarf_unwind_O: make NO_LIBDW_DWARF_UNWIND=1
make_no_libelf_O: make NO_LIBELF=1
make_no_libperl_O: make NO_LIBPERL=1
make_no_scripts_O: make NO_LIBPYTHON=1 NO_LIBPERL=1
make_install_bin_O: make install-bin
make_no_backtrace_O: make NO_BACKTRACE=1
make_with_clangllvm_O: make LIBCLANGLLVM=1
make_no_gtk2_O: make NO_GTK2=1
make_install_prefix_slash_O: make install prefix=/tmp/krava/
make_util_map_o_O: make util/map.o
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_ui_O: make NO_NEWT=1 NO_SLANG=1 NO_GTK2=1
make_no_slang_O: make NO_SLANG=1
make_util_pmu_bison_o_O: make util/pmu-bison.o
make_perf_o_O: make perf.o
make_help_O: make help
make_no_libpython_O: make NO_LIBPYTHON=1
make_with_babeltrace_O: make LIBBABELTRACE=1
make_debug_O: make DEBUG=1
make_no_libnuma_O: make NO_LIBNUMA=1
make_no_auxtrace_O: make NO_AUXTRACE=1
make_pure_O: make
make_no_demangle_O: make NO_DEMANGLE=1
make_no_newt_O: make NO_NEWT=1
make_no_libbionic_O: make NO_LIBBIONIC=1
make_clean_all_O: make clean all
make_doc_O: make doc
make_no_libaudit_O: make NO_LIBAUDIT=1
make_tags_O: make tags
make_install_O: make install
make_no_libbpf_O: make NO_LIBBPF=1
OK
make: Leaving directory '/home/acme/git/linux/tools/perf'
$Arnaldo Carvalho de Melo
maintainerPATCH 1/15 perf tools: Add perf_evsel__read_size function
From: Jiri Olsa <[email protected]>
Currently we use the size of struct perf_counts_values to read the event, which prevents us to put any new member to the struct.
Adding perf_evsel__read_size to return size of the buffer needed for event read.
--- tools/perf/util/evsel.c | 29 ++++++++++++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-)
tools/perf/util/evsel.c +28 -1
@@ -1261,15 +1261,42 @@ void perf_counts_values__scale(struct perf_counts_values *count, *pscaled = scaled; } +static int perf_evsel__read_size (struct perf_evsel *evsel) +{ +u64 read_format = evsel->attr.read_format; +int entry =sizeof (u64);/* value */ +int size =0 ; +int nr =1 ; + +if (read_format &PERF_FORMAT_TOTAL_TIME_ENABLED ) + size +=sizeof (u64); + +if (read_format &PERF_FORMAT_TOTAL_TIME_RUNNING ) + size +=sizeof (u64); + +if (read_format &PERF_FORMAT_ID ) + entry +=sizeof (u64); + +if (read_format &PERF_FORMAT_GROUP ) { + nr = evsel->nr_members; + size +=sizeof (u64); + } + + size += entry * nr; +return size; +} +int perf_evsel__read (struct perf_evsel *evsel,int cpu,int thread,struct perf_counts_values *count) { +size_t size =perf_evsel__read_size (evsel); +memset (count,0 ,sizeof (*count));if (FD (evsel, cpu, thread) <0 )return -EINVAL ; -if (readn (FD (evsel, cpu, thread), count,sizeof (*count)) <=0 ) +if (readn (FD (evsel, cpu, thread), count->values, size) <=0 )return -errno;return 0 ;
Signature · 1 line
2.9.4
Arnaldo Carvalho de Melo
maintainerPATCH 2/15 perf evsel: Add read_counter()
In reply to Arnaldo Carvalho de MeloFrom: Jiri Olsa <[email protected]>
Add perf_evsel__read_counter() to read single or group counter. After calling this function the counter's evsel::counts struct is filled with values for the counter and member of its group if there are any.
--- tools/perf/util/evsel.c | 100 ++++++++++++++++++++++++++++++++++++++++++++++++ tools/perf/util/evsel.h | 2 + tools/perf/util/stat.c | 4 ++ tools/perf/util/stat.h | 5 ++- 4 files changed, 109 insertions(+), 2 deletions(-)
tools/perf/util/evsel.c +100 -0
@@ -1302,6 +1302,106 @@ int perf_evsel__read(struct perf_evsel *evsel, int cpu, int thread,return 0 ; } +static int +perf_evsel__read_one (struct perf_evsel *evsel,int cpu,int thread) +{ +struct perf_counts_values *count =perf_counts (evsel->counts, cpu, thread); + +return perf_evsel__read (evsel, cpu, thread, count); +} + +static void +perf_evsel__set_count (struct perf_evsel *counter,int cpu,int thread, +u64 val,u64 ena,u64 run) +{ +struct perf_counts_values *count; + + count =perf_counts (counter->counts, cpu, thread); + + count->val = val; + count->ena = ena; + count->run = run; +} + +static int +perf_evsel__process_group_data (struct perf_evsel *leader, +int cpu,int thread,u64 *data) +{ +u64 read_format = leader->attr.read_format; +struct sample_read_value *v; +u64 nr, ena =0 , run =0 , i; + + nr = *data++; + +if (nr != (u64 ) leader->nr_members) +return -EINVAL ; + +if (read_format &PERF_FORMAT_TOTAL_TIME_ENABLED ) + ena = *data++; + +if (read_format &PERF_FORMAT_TOTAL_TIME_RUNNING ) + run = *data++; + + v = (struct sample_read_value *) data; + +perf_evsel__set_count (leader, cpu, thread, + v[0 ].value, ena, run); + +for (i =1 ; i < nr; i++) { +struct perf_evsel *counter; + + counter =perf_evlist__id2evsel (leader->evlist, v[i].id); +if (!counter) +return -EINVAL ; + +perf_evsel__set_count (counter, cpu, thread, + v[i].value, ena, run); + } + +return 0 ; +} + +static int +perf_evsel__read_group (struct perf_evsel *leader,int cpu,int thread) +{ +struct perf_stat_evsel *ps = leader->priv; +u64 read_format = leader->attr.read_format; +int size =perf_evsel__read_size (leader); +u64 *data = ps->group_data; + +if (!(read_format &PERF_FORMAT_ID )) +return -EINVAL ; + +if (!perf_evsel__is_group_leader (leader)) +return -EINVAL ; + +if (!data) { + data =zalloc (size); +if (!data) +return -ENOMEM ; + + ps->group_data = data; + } + +if (FD (leader, cpu, thread) <0 ) +return -EINVAL ; + +if (readn (FD (leader, cpu, thread), data, size) <=0 ) +return -errno; + +return perf_evsel__process_group_data (leader, cpu, thread, data); +} + +int perf_evsel__read_counter (struct perf_evsel *evsel,int cpu,int thread) +{ +u64 read_format = evsel->attr.read_format; + +if (read_format &PERF_FORMAT_GROUP ) +return perf_evsel__read_group (evsel, cpu, thread); +else +return perf_evsel__read_one (evsel, cpu, thread); +} +int __perf_evsel__read_on_cpu (struct perf_evsel *evsel,int cpu,int thread,bool scale) {
tools/perf/util/evsel.h +2 -0
@@ -299,6 +299,8 @@ static inline bool perf_evsel__match2(struct perf_evsel *e1,int perf_evsel__read (struct perf_evsel *evsel,int cpu,int thread,struct perf_counts_values *count); +int perf_evsel__read_counter (struct perf_evsel *evsel,int cpu,int thread); +int __perf_evsel__read_on_cpu (struct perf_evsel *evsel,int cpu,int thread,bool scale);
tools/perf/util/stat.c +4 -0
@@ -128,6 +128,10 @@ static int perf_evsel__alloc_stat_priv(struct perf_evsel *evsel)static void perf_evsel__free_stat_priv (struct perf_evsel *evsel) { +struct perf_stat_evsel *ps = evsel->priv; + +if (ps) +free (ps->group_data);zfree (&evsel->priv); }
tools/perf/util/stat.h +3 -2
@@ -28,8 +28,9 @@ enum perf_stat_evsel_id { };struct perf_stat_evsel { -struct stats res_stats[3 ]; -enum perf_stat_evsel_id id; +struct stats res_stats[3 ]; +enum perf_stat_evsel_id id; +u64 *group_data; };enum aggr_mode {
Signature · 1 line
2.9.4
Arnaldo Carvalho de Melo
maintainerPATCH 3/15 perf stat: Use group read for event groups
In reply to Arnaldo Carvalho de MeloFrom: Jiri Olsa <[email protected]>
Make perf stat use group read if there are groups defined. The group read will get the values for all member of groups within a single syscall instead of calling read syscall for every event.
We can see considerable less amount of kernel cycles spent on single group read, than reading each event separately, like for following perf stat command:
# perf stat -e {cycles,instructions} -I 10 -a sleep 1Monitored with "perf stat -r 5 -e '{cycles:u,cycles:k}'"
Before:
24,325,676 cycles:u
297,040,775 cycles:k
1.038554134 seconds time elapsedAfter:
25,034,418 cycles:u
158,256,395 cycles:k
1.036864497 seconds time elapsedThe perf_evsel__open fallback changes contributed by Andi Kleen.
--- tools/perf/builtin-stat.c | 30 +++++++++++++++++++++++++++--- tools/perf/util/counts.h | 1 + tools/perf/util/evsel.c | 10 ++++++++++ 3 files changed, 38 insertions(+), 3 deletions(-)
tools/perf/builtin-stat.c +27 -3
@@ -213,10 +213,20 @@ static void perf_stat__reset_stats(void)static int create_perf_stat_counter (struct perf_evsel *evsel) {struct perf_event_attr *attr = &evsel->attr; +struct perf_evsel *leader = evsel->leader; -if (stat_config.scale) +if (stat_config.scale) { attr->read_format =PERF_FORMAT_TOTAL_TIME_ENABLED |PERF_FORMAT_TOTAL_TIME_RUNNING ; + } + +/* +* The event is part of non trivial group, let's enable +* the group read (for leader) and ID retrieval for all +* members. +*/ +if (leader->nr_members >1 ) + attr->read_format |=PERF_FORMAT_ID |PERF_FORMAT_GROUP ; attr->inherit = !no_inherit;
@@ -333,13 +343,21 @@ static int read_counter(struct perf_evsel *counter)struct perf_counts_values *count; count =perf_counts (counter->counts, cpu, thread); -if (perf_evsel__read (counter, cpu, thread, count)) { + +/* +* The leader's group read loads data into its group members +* (via perf_evsel__read_counter) and sets threir count->loaded. +*/ +if (!count->loaded && +perf_evsel__read_counter (counter, cpu, thread)) { counter->counts->scaled =-1 ;perf_counts (counter->counts, cpu, thread)->ena =0 ;perf_counts (counter->counts, cpu, thread)->run =0 ;return -1 ; } + count->loaded = false; +if (STAT_RECORD ) {if (perf_evsel__write_stat_event (counter, cpu, thread, count)) {pr_err ("failed to write stat event\n" );
@@ -559,6 +577,11 @@ static int store_counter_ids(struct perf_evsel *counter)return __store_counter_ids (counter, cpus, threads); } +static bool perf_evsel__should_store_id (struct perf_evsel *counter) +{ +return STAT_RECORD || counter->attr.read_format &PERF_FORMAT_ID ; +} +static int __run_perf_stat (int argc,const char **argv) {int interval = stat_config.interval;
@@ -631,7 +654,8 @@ static int __run_perf_stat(int argc, const char **argv)if (l > unit_width) unit_width = l; -if (STAT_RECORD &&store_counter_ids (counter)) +if (perf_evsel__should_store_id (counter) && +store_counter_ids (counter))return -1 ; }
tools/perf/util/counts.h +1 -0
@@ -12,6 +12,7 @@ struct perf_counts_values { };u64 values[3 ]; }; +bool loaded; };struct perf_counts {
tools/perf/util/evsel.c +10 -0
@@ -49,6 +49,7 @@ static struct {bool clockid_wrong;bool lbr_flags;bool write_backward; +bool group_read; } perf_missing_features;static clockid_t clockid;
@@ -1321,6 +1322,7 @@ perf_evsel__set_count(struct perf_evsel *counter, int cpu, int thread, count->val = val; count->ena = ena; count->run = run; + count->loaded = true; } static int
@@ -1677,6 +1679,8 @@ int perf_evsel__open(struct perf_evsel *evsel, struct cpu_map *cpus,if (perf_missing_features.lbr_flags) evsel->attr.branch_sample_type &= ~(PERF_SAMPLE_BRANCH_NO_FLAGS |PERF_SAMPLE_BRANCH_NO_CYCLES ); +if (perf_missing_features.group_read && evsel->attr.inherit) + evsel->attr.read_format &= ~(PERF_FORMAT_GROUP |PERF_FORMAT_ID ); retry_sample_id:if (perf_missing_features.sample_id_all) evsel->attr.sample_id_all =0 ;
@@ -1832,6 +1836,12 @@ int perf_evsel__open(struct perf_evsel *evsel, struct cpu_map *cpus, perf_missing_features.lbr_flags = true;pr_debug2 ("switching off branch sample type no (cycles/flags)\n" ); goto fallback_missing_features; + }else if (!perf_missing_features.group_read && + evsel->attr.inherit && + (evsel->attr.read_format &PERF_FORMAT_GROUP )) { + perf_missing_features.group_read = true; +pr_debug2 ("switching off group read\n" ); + goto fallback_missing_features; } out_close: do {
Signature · 1 line
2.9.4
Arnaldo Carvalho de Melo
maintainerPATCH 4/15 perf annotate: Do not overwrite perf_sample->weight
In reply to Arnaldo Carvalho de MeloFrom: Arnaldo Carvalho de Melo <[email protected]>
When we parse an event we may get a value from the kernel in response to PERF_SAMPLE_WEIGHT being set in perf_event_attr->sample_type, and if it is not set, then perf_sample->weight will be set to zero, which should be ok according to a discussion with Andi Kleen [1]:
1: https://lkml.kernel.org/r/[email protected]
--- tools/perf/builtin-annotate.c | 2 -- 1 file changed, 2 deletions(-)
tools/perf/builtin-annotate.c +0 -2
@@ -177,8 +177,6 @@ static int perf_evsel__add_sample(struct perf_evsel *evsel,*/ process_branch_stack (sample->branch_stack, al, sample); - sample->weight =1 ; - he =hists__add_entry (hists, al,NULL ,NULL ,NULL , sample, true);if (he ==NULL )return -ENOMEM ;
Signature · 1 line
2.9.4
Arnaldo Carvalho de Melo
maintainerPATCH 5/15 perf sort: Use default sort if evlist is empty
In reply to Arnaldo Carvalho de MeloFrom: David Carrillo-Cisneros <[email protected]>
Fixes bug noted by Jiri in https://lkml.org/lkml/2017/6/13/755 and caused by commit d49dadea7862 ("perf tools: Make 'trace' or 'trace_fields' sort key default for tracepoint events") not taking into account that evlist is empty in pipe-mode.
Before this commit, pipe mode will only show bogus "100.00% N/A" instead of correct output as follows:
$ perf record -o - sleep 1 | perf report -i -
# To display the perf.data header info, please use --header/--header-only options.
#
[ perf record: Woken up 1 times to write data ]
[ perf record: Captured and wrote 0.000 MB - ]
#
# Total Lost Samples: 0
#
# Samples: 8 of event 'cycles:ppH'
# Event count (approx.): 145658
#
# Overhead Trace output
# ........ ............
#
100.00% N/ACorrect output, after patch:
$ perf record -o - sleep 1 | perf report -i -
# To display the perf.data header info, please use --header/--header-only options.
#
[ perf record: Woken up 1 times to write data ]
[ perf record: Captured and wrote 0.000 MB - ]
#
# Total Lost Samples: 0
#
# Samples: 8 of event 'cycles:ppH'
# Event count (approx.): 191331
#
# Overhead Command Shared Object Symbol
# ........ ....... ................. .................................
#
81.63% sleep libc-2.19.so [.] _exit
13.58% sleep ld-2.19.so [.] do_lookup_x
2.34% sleep [kernel.kallsyms] [k] context_switch
2.34% sleep libc-2.19.so [.] __GI___libc_nanosleep
0.11% perf [kernel.kallsyms] [k] __intel_pmu_enable_aReport-Link: https://lkml.kernel.org/r/20170613185422.GA6092@krava
--- tools/perf/util/evlist.h | 5 +++++ tools/perf/util/sort.c | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-)
tools/perf/util/evlist.h +5 -0
@@ -265,6 +265,11 @@ bool perf_evlist__valid_read_format(struct perf_evlist *evlist);void perf_evlist__splice_list_tail (struct perf_evlist *evlist,struct list_head *list); +static inline bool perf_evlist__empty (struct perf_evlist *evlist) +{ +return list_empty (&evlist->entries); +} +static inline struct perf_evsel *perf_evlist__first (struct perf_evlist *evlist) { return list_entry(evlist->entries.next, struct perf_evsel, node);
tools/perf/util/sort.c +1 -1
@@ -2563,7 +2563,7 @@ static const char *get_default_sort_order(struct perf_evlist *evlist)BUG_ON (sort__mode >=ARRAY_SIZE (default_sort_orders)); -if (evlist ==NULL ) +if (evlist ==NULL ||perf_evlist__empty (evlist)) goto out_no_evlist;evlist__for_each_entry (evlist, evsel) {
Signature · 1 line
2.9.4
Arnaldo Carvalho de Melo
maintainerPATCH 6/15 perf annotate stdio: Set enough columns for --show-total-period
In reply to Arnaldo Carvalho de MeloFrom: Arnaldo Carvalho de Melo <[email protected]>
Now that we set the first column header according to wether --show-total-period is being used, we need to size it accordingly.
--- tools/perf/util/annotate.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
tools/perf/util/annotate.c +3 -3
@@ -1142,7 +1142,7 @@ static int disasm_line__print(struct disasm_line *dl, struct symbol *sym, u64 st color =get_percent_color (percent);if (symbol_conf.show_total_period) -color_fprintf (stdout, color," %7" PRIu64, +color_fprintf (stdout, color," %11" PRIu64, sample.period);else color_fprintf (stdout, color," %7.2f" , percent);
@@ -1165,7 +1165,7 @@ static int disasm_line__print(struct disasm_line *dl, struct symbol *sym, u64 st }else if (max_lines && printed >= max_lines)return 1 ;else { -int width =8 ; +int width = symbol_conf.show_total_period ?12 :8 ;if (queue)return -1 ;
@@ -1806,7 +1806,7 @@ int symbol__annotate_printf(struct symbol *sym, struct map *map,int printed =2 , queue_len =0 ;int more =0 ;u64 len; -int width =8 ; +int width = symbol_conf.show_total_period ?12 :8 ;int graph_dotted_len; filename =strdup (dso->long_name);
Signature · 1 line
2.9.4
Arnaldo Carvalho de Melo
maintainerPATCH 7/15 perf annotate: Fix storing per line sym_hist_entry
In reply to Arnaldo Carvalho de MeloFrom: Arnaldo Carvalho de Melo <[email protected]>
The existing loop incremented the offset while using it as the array index, when we went to an array of sym_hist_entry instances, we should've moved the increment to outside of the array element reference, oops, fix it.
--- tools/perf/util/annotate.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-)
tools/perf/util/annotate.c +3 -2
@@ -963,8 +963,9 @@ double disasm__calc_percent(struct annotation *notes, int evidx, s64 offset,u64 period =0 ;while (offset < end) { - hits += h->addr[offset++].nr_samples; - period += h->addr[offset++].period; + hits += h->addr[offset].nr_samples; + period += h->addr[offset].period; + ++offset; }if (h->nr_samples) {
Signature · 1 line
2.9.4
Arnaldo Carvalho de Melo
maintainerPATCH 8/15 perf annotate TUI: Use sym_hist_entry in disasm_line_samples
In reply to Arnaldo Carvalho de MeloFrom: Arnaldo Carvalho de Melo <[email protected]>
Just paving the way to fix --show-total-period in the TUI, i.e. now we save in struct disasm_line_samples not just the number of samples, but also the total period.
--- tools/perf/ui/browsers/annotate.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-)
tools/perf/ui/browsers/annotate.c +4 -4
@@ -17,8 +17,8 @@#include <sys/ttydefaults.h> struct disasm_line_samples { -double percent; -u64 nr; +double percent; +struct sym_hist_entry he; };#define IPC_WIDTH 6
@@ -152,7 +152,7 @@ static void annotate_browser__write(struct ui_browser *browser, void *entry, int current_entry);if (annotate_browser__opts.show_total_period) {ui_browser__printf (browser,"%6" PRIu64" " , - bdl->samples[i].nr); + bdl->samples[i].he.nr_samples); }else {ui_browser__printf (browser,"%6.2f " , bdl->samples[i].percent);
@@ -457,7 +457,7 @@ static void annotate_browser__calc_percent(struct annotate_browser *browser, pos->offset, next ? next->offset : len, &path, &sample); - bpos->samples[i].nr = sample.nr_samples; + bpos->samples[i].he = sample;if (max_percent < bpos->samples[i].percent) max_percent = bpos->samples[i].percent;
Signature · 1 line
2.9.4
Arnaldo Carvalho de Melo
maintainerPATCH 9/15 perf annotate TUI: Fix --show-total-period
In reply to Arnaldo Carvalho de MeloFrom: Taeung Song <[email protected]>
We were showing the number of samples, not the total period, fix it.
--- tools/perf/ui/browsers/annotate.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
tools/perf/ui/browsers/annotate.c +1 -1
@@ -152,7 +152,7 @@ static void annotate_browser__write(struct ui_browser *browser, void *entry, int current_entry);if (annotate_browser__opts.show_total_period) {ui_browser__printf (browser,"%6" PRIu64" " , - bdl->samples[i].he.nr_samples); + bdl->samples[i].he.period); }else {ui_browser__printf (browser,"%6.2f " , bdl->samples[i].percent);
Signature · 1 line
2.9.4
Arnaldo Carvalho de Melo
maintainerPATCH 10/15 perf annotate TUI: Clarify calculation of column header widths
In reply to Arnaldo Carvalho de MeloFrom: Arnaldo Carvalho de Melo <[email protected]>
In commit f8f4aaead579 ("perf annotate: Finally display IPC and cycle accounting") the 'pcnt_width' variable was abused in a few places to also include the optional width of the "IPC" and "cycles" columns, while in other places we stopped using 'pcnt_width' and instead its previous equation...
Now that we need to tap into annotate_browser__pcnt_width() to consider if --show-total-period is being used and instead of that hardcoded 7 (strlen("Percent")) we need to use it or strlen("Event count") we need this properly clarified to avoid having to touch all the (7 * nr_events) places.
Clarify this by introducing a separate annotate_browser__cycles_width() to leave the pcnt_width calculate just what its name implies.
--- tools/perf/ui/browsers/annotate.c | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-)
tools/perf/ui/browsers/annotate.c +11 -9
@@ -110,11 +110,12 @@ static int annotate_browser__set_jumps_percent_color(struct annotate_browser *brstatic int annotate_browser__pcnt_width (struct annotate_browser *ab) { -int w =7 * ab->nr_events; +return 7 * ab->nr_events; +} -if (ab->have_cycles) - w +=IPC_WIDTH +CYCLES_WIDTH ; -return w; +static int annotate_browser__cycles_width (struct annotate_browser *ab) +{ +return ab->have_cycles ?IPC_WIDTH +CYCLES_WIDTH :0 ; }static void annotate_browser__write (struct ui_browser *browser,void *entry,int row)
@@ -127,7 +128,8 @@ static void annotate_browser__write(struct ui_browser *browser, void *entry, int (!current_entry || (browser->use_navkeypressed && !browser->navkeypressed)));int width = browser->width, printed; -int i, pcnt_width =annotate_browser__pcnt_width (ab); +int i, pcnt_width =annotate_browser__pcnt_width (ab), + cycles_width =annotate_browser__cycles_width (ab);double percent_max =0.0 ;char bf[256 ];bool show_title = false;
@@ -162,7 +164,7 @@ static void annotate_browser__write(struct ui_browser *browser, void *entry, intui_browser__set_percent_color (browser,0 , current_entry);if (!show_title) -ui_browser__write_nstring (browser," " ,7 * ab->nr_events); +ui_browser__write_nstring (browser," " , pcnt_width);else ui_browser__printf (browser,"%*s" ,7 ,"Percent" ); }
@@ -190,7 +192,7 @@ static void annotate_browser__write(struct ui_browser *browser, void *entry, int width +=1 ;if (!*dl->line) -ui_browser__write_nstring (browser," " , width - pcnt_width); +ui_browser__write_nstring (browser," " , width - pcnt_width - cycles_width);else if (dl->offset ==-1 ) {if (dl->line_nr && annotate_browser__opts.show_linenr) printed = scnprintf(bf, sizeof(bf), "%-*d ",
@@ -199,7 +201,7 @@ static void annotate_browser__write(struct ui_browser *browser, void *entry, int printed =scnprintf (bf,sizeof (bf),"%*s " , ab->addr_width," " );ui_browser__write_nstring (browser, bf, printed); -ui_browser__write_nstring (browser, dl->line, width - printed - pcnt_width +1 ); +ui_browser__write_nstring (browser, dl->line, width - printed - pcnt_width - cycles_width +1 ); }else {u64 addr = dl->offset;int color =-1 ;
@@ -256,7 +258,7 @@ static void annotate_browser__write(struct ui_browser *browser, void *entry, int }disasm_line__scnprintf (dl, bf,sizeof (bf), !annotate_browser__opts.use_offset); -ui_browser__write_nstring (browser, bf, width - pcnt_width -3 - printed); +ui_browser__write_nstring (browser, bf, width - pcnt_width - cycles_width -3 - printed); }if (current_entry)
Signature · 1 line
2.9.4
Arnaldo Carvalho de Melo
maintainerPATCH 11/15 perf annotate TUI: Fix column header when toggling period/percent
In reply to Arnaldo Carvalho de MeloFrom: Taeung Song <[email protected]>
We have the 't' hotkey to toggle showing either the total period or the percentage of samples for a given line, but we forgot to toggle as well the column header, always showing "Percent", even when showing the period, fix it.
--- tools/perf/ui/browsers/annotate.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
tools/perf/ui/browsers/annotate.c +1 -1
@@ -166,7 +166,7 @@ static void annotate_browser__write(struct ui_browser *browser, void *entry, intif (!show_title)ui_browser__write_nstring (browser," " , pcnt_width);else -ui_browser__printf (browser,"%*s" ,7 ,"Percent" ); +ui_browser__printf (browser,"%*s" ,7 , annotate_browser__opts.show_total_period ?"Period" :"Percent" ); }if (ab->have_cycles) {if (dl->ipc)
Signature · 1 line
2.9.4
Arnaldo Carvalho de Melo
maintainerPATCH 12/15 perf annotate TUI: Set appropriate column width for period/percent
In reply to Arnaldo Carvalho de MeloFrom: Arnaldo Carvalho de Melo <[email protected]>
Either when we start 'perf annotate' or 'perf report' with --show-total-period or when we, in the annotate browser, press 't' to toggle period/percent for the first column, we need to adjust the width for the 'period' case.
--- tools/perf/ui/browsers/annotate.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-)
tools/perf/ui/browsers/annotate.c +6 -4
@@ -110,7 +110,7 @@ static int annotate_browser__set_jumps_percent_color(struct annotate_browser *brstatic int annotate_browser__pcnt_width (struct annotate_browser *ab) { -return 7 * ab->nr_events; +return (annotate_browser__opts.show_total_period ?12 :7 ) * ab->nr_events; }static int annotate_browser__cycles_width (struct annotate_browser *ab)
@@ -153,7 +153,7 @@ static void annotate_browser__write(struct ui_browser *browser, void *entry, int bdl->samples[i].percent, current_entry);if (annotate_browser__opts.show_total_period) { -ui_browser__printf (browser,"%6" PRIu64" " , +ui_browser__printf (browser,"%11" PRIu64" " , bdl->samples[i].he.period); }else { ui_browser__printf(browser, "%6.2f ",
@@ -165,8 +165,10 @@ static void annotate_browser__write(struct ui_browser *browser, void *entry, intif (!show_title)ui_browser__write_nstring (browser," " , pcnt_width); -else -ui_browser__printf (browser,"%*s" ,7 , annotate_browser__opts.show_total_period ?"Period" :"Percent" ); +else { +ui_browser__printf (browser,"%*s" , pcnt_width, + annotate_browser__opts.show_total_period ?"Period" :"Percent" ); + } }if (ab->have_cycles) {if (dl->ipc)
Signature · 1 line
2.9.4
Arnaldo Carvalho de Melo
maintainerPATCH 13/15 perf data: Add callchain to CTF conversion
In reply to Arnaldo Carvalho de MeloFrom: Geneviève Bastien <[email protected]>
The field perf_callchain, if available, is added to the sampling events during the CTF conversion. It is an array of u64 values. The perf_callchain_size field contains the size of the array.
It will allow the analysis of sampling data in trace visualization tools like Trace Compass. Possible analyses with those data: dynamic flamegraphs, correlation with other tracing data like a userspace trace.
Here follows a babeltrace CTF output of a trace with callchain:
$ babeltrace ./myctftrace
[17:38:45.672760285] (+?.?????????) cycles:ppp: { cpu_id = 0 }, { perf_ip = 0xFFFFFFFF81063EE4, perf_tid = 25841, perf_pid = 25774, perf_period = 1, perf_callchain_size = 7, perf_callchain = [ [0] = 0xFFFFFFFFFFFFFF80, [1] = 0xFFFFFFFF81063EE4, [2] = 0xFFFFFFFF8100C770, [3] = 0xFFFFFFFF81006EC6, [4] = 0xFFFFFFFF8118245E, [5] = 0xFFFFFFFF810A9224, [6] = 0xFFFFFFFF8164A4C6 ] }
[17:38:45.672777672] (+0.000017387) cycles:ppp: { cpu_id = 0 }, { perf_ip = 0xFFFFFFFF81063EE4, perf_tid = 25841, perf_pid = 25774, perf_period = 1, perf_callchain_size = 8, perf_callchain = [ [0] = 0xFFFFFFFFFFFFFF80, [1] = 0xFFFFFFFF81063EE4, [2] = 0xFFFFFFFF8100C770, [3] = 0xFFFFFFFF81006EC6, [4] = 0xFFFFFFFF8118245E, [5] = 0xFFFFFFFF810A9224, [6] = 0xFFFFFFFF8164A4C6, [7] = 0xFFFFFFFF8164ABAD ] }
[17:38:45.672786700] (+0.000009028) cycles:ppp: { cpu_id = 0 }, { perf_ip = 0xFFFFFFFF81063EE4, perf_tid = 25841, perf_pid = 25774, perf_period = 70, perf_callchain_size = 3, perf_callchain = [ [0] = 0xFFFFFFFFFFFFFF80, [1] = 0xFFFFFFFF81063EE4, [2] = 0xFFFFFFFF8100C770 ] }--- tools/perf/util/data-convert-bt.c | 92 ++++++++++++++++++++++++++++++++++++++- 1 file changed, 91 insertions(+), 1 deletion(-)
tools/perf/util/data-convert-bt.c +91 -1
@@ -506,6 +506,81 @@ add_bpf_output_values(struct bt_ctf_event_class *event_class,return ret; } +static int +add_callchain_output_values (struct bt_ctf_event_class *event_class, +struct bt_ctf_event *event, +struct ip_callchain *callchain) +{ +struct bt_ctf_field_type *len_type, *seq_type; +struct bt_ctf_field *len_field, *seq_field; +unsigned int nr_elements = callchain->nr; +unsigned int i; +int ret; + + len_type =bt_ctf_event_class_get_field_by_name ( + event_class,"perf_callchain_size" ); + len_field =bt_ctf_field_create (len_type); +if (!len_field) { +pr_err ("failed to create 'perf_callchain_size' for callchain output event\n" ); + ret =-1 ; + goto put_len_type; + } + + ret =bt_ctf_field_unsigned_integer_set_value (len_field, nr_elements); +if (ret) { +pr_err ("failed to set field value for perf_callchain_size\n" ); + goto put_len_field; + } + ret =bt_ctf_event_set_payload (event,"perf_callchain_size" , len_field); +if (ret) { +pr_err ("failed to set payload to perf_callchain_size\n" ); + goto put_len_field; + } + + seq_type =bt_ctf_event_class_get_field_by_name ( + event_class,"perf_callchain" ); + seq_field =bt_ctf_field_create (seq_type); +if (!seq_field) { +pr_err ("failed to create 'perf_callchain' for callchain output event\n" ); + ret =-1 ; + goto put_seq_type; + } + + ret =bt_ctf_field_sequence_set_length (seq_field, len_field); +if (ret) { +pr_err ("failed to set length of 'perf_callchain'\n" ); + goto put_seq_field; + } + +for (i =0 ; i < nr_elements; i++) { +struct bt_ctf_field *elem_field = +bt_ctf_field_sequence_get_field (seq_field, i); + + ret =bt_ctf_field_unsigned_integer_set_value (elem_field, + ((u64 *)(callchain->ips))[i]); + +bt_ctf_field_put (elem_field); +if (ret) { +pr_err ("failed to set callchain[%d]\n" , i); + goto put_seq_field; + } + } + + ret =bt_ctf_event_set_payload (event,"perf_callchain" , seq_field); +if (ret) +pr_err ("failed to set payload for raw_data\n" ); + +put_seq_field: +bt_ctf_field_put (seq_field); +put_seq_type: +bt_ctf_field_type_put (seq_type); +put_len_field: +bt_ctf_field_put (len_field); +put_len_type: +bt_ctf_field_type_put (len_type); +return ret; +} + static int add_generic_values(struct ctf_writer *cw, struct bt_ctf_event *event, struct perf_evsel *evsel,
@@ -519,7 +594,6 @@ static int add_generic_values(struct ctf_writer *cw,* PERF_SAMPLE_TIME - not needed as we have it in * ctf event header * PERF_SAMPLE_READ - TODO -* PERF_SAMPLE_CALLCHAIN - TODO * PERF_SAMPLE_RAW - tracepoint fields are handled separately * PERF_SAMPLE_BRANCH_STACK - TODO * PERF_SAMPLE_REGS_USER - TODO
@@ -720,6 +794,7 @@ static int process_sample_event(struct perf_tool *tool,struct bt_ctf_event_class *event_class;struct bt_ctf_event *event;int ret; +unsigned long type = evsel->attr.sample_type;if (WARN_ONCE (!priv,"Failed to setup all events.\n" ))return 0 ;
@@ -751,6 +826,13 @@ static int process_sample_event(struct perf_tool *tool,return -1 ; } +if (type &PERF_SAMPLE_CALLCHAIN ) { + ret =add_callchain_output_values (event_class, + event, sample->callchain); +if (ret) +return -1 ; + } +if (perf_evsel__is_bpf_output (evsel)) { ret =add_bpf_output_values (event_class, event, sample);if (ret)
@@ -1043,6 +1125,14 @@ static int add_generic_types(struct ctf_writer *cw, struct perf_evsel *evsel,if (type &PERF_SAMPLE_TRANSACTION )ADD_FIELD (event_class, cw->data.u64,"perf_transaction" ); +if (type &PERF_SAMPLE_CALLCHAIN ) { +ADD_FIELD (event_class, cw->data.u32,"perf_callchain_size" ); +ADD_FIELD (event_class, +bt_ctf_field_type_sequence_create ( + cw->data.u64_hex,"perf_callchain_size" ), +"perf_callchain" ); + } +#undef ADD_FIELDreturn 0 ; }
Signature · 1 line
2.9.4
Arnaldo Carvalho de Melo
maintainerPATCH 14/15 perf data: Add mmap[2] events to CTF conversion
In reply to Arnaldo Carvalho de MeloFrom: Geneviève Bastien <[email protected]>
This adds the mmap and mmap2 events to the CTF trace obtained from perf data.
These events will allow CTF trace visualization tools like Trace Compass to automatically resolve the symbols of the callchain to the corresponding function or origin library.
To include those events, one needs to convert with the --all option. Here follows an output of babeltrace:
$ sudo perf data convert --all --to-ctf myctftrace
$ babeltrace ./myctftrace
[19:00:00.000000000] (+0.000000000) perf_mmap2: { cpu_id = 0 },
{ pid = 638, tid = 638, start = 0x7F54AE39E000, filename =
"/usr/lib/ld-2.25.so" }
[19:00:00.000000000] (+0.000000000) perf_mmap2: { cpu_id = 0 }, { pid =
638, tid = 638, start = 0x7F54AE565000, filename =
"/usr/lib/libudev.so.1.6.6" }
[19:00:00.000000000] (+0.000000000) perf_mmap2: { cpu_id = 0 }, { pid =
638, tid = 638, start = 0x7FFC093EA000, filename = "[vdso]" }--- tools/perf/util/data-convert-bt.c | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+)
tools/perf/util/data-convert-bt.c +35 -0
@@ -76,6 +76,8 @@ struct ctf_writer {struct bt_ctf_event_class *comm_class;struct bt_ctf_event_class *exit_class;struct bt_ctf_event_class *fork_class; +struct bt_ctf_event_class *mmap_class; +struct bt_ctf_event_class *mmap2_class; };struct convert {
@@ -915,6 +917,18 @@ __FUNC_PROCESS_NON_SAMPLE(exit,__NON_SAMPLE_SET_FIELD (fork, u32, ptid);__NON_SAMPLE_SET_FIELD (fork, u64, time); ) +__FUNC_PROCESS_NON_SAMPLE (mmap, + __NON_SAMPLE_SET_FIELD(mmap, u32, pid); +__NON_SAMPLE_SET_FIELD (mmap, u32, tid); +__NON_SAMPLE_SET_FIELD (mmap, u64_hex, start); +__NON_SAMPLE_SET_FIELD (mmap, string, filename); +) +__FUNC_PROCESS_NON_SAMPLE (mmap2, + __NON_SAMPLE_SET_FIELD(mmap2, u32, pid); +__NON_SAMPLE_SET_FIELD (mmap2, u32, tid); +__NON_SAMPLE_SET_FIELD (mmap2, u64_hex, start); +__NON_SAMPLE_SET_FIELD (mmap2, string, filename); +)#undef __NON_SAMPLE_SET_FIELD#undef __FUNC_PROCESS_NON_SAMPLE
@@ -1254,6 +1268,19 @@ __FUNC_ADD_NON_SAMPLE_EVENT_CLASS(exit,__NON_SAMPLE_ADD_FIELD (u64, time); ) +__FUNC_ADD_NON_SAMPLE_EVENT_CLASS (mmap, + __NON_SAMPLE_ADD_FIELD(u32, pid); +__NON_SAMPLE_ADD_FIELD (u32, tid); +__NON_SAMPLE_ADD_FIELD (u64_hex, start); +__NON_SAMPLE_ADD_FIELD (string, filename); +) + +__FUNC_ADD_NON_SAMPLE_EVENT_CLASS (mmap2, + __NON_SAMPLE_ADD_FIELD(u32, pid); +__NON_SAMPLE_ADD_FIELD (u32, tid); +__NON_SAMPLE_ADD_FIELD (u64_hex, start); +__NON_SAMPLE_ADD_FIELD (string, filename); +)#undef __NON_SAMPLE_ADD_FIELD#undef __FUNC_ADD_NON_SAMPLE_EVENT_CLASS
@@ -1271,6 +1298,12 @@ static int setup_non_sample_events(struct ctf_writer *cw, ret =add_fork_event (cw);if (ret)return ret; + ret =add_mmap_event (cw); +if (ret) +return ret; + ret =add_mmap2_event (cw); +if (ret) +return ret;return 0 ; }
@@ -1572,6 +1605,8 @@ int bt_convert__perf2ctf(const char *input, const char *path, c.tool.comm = process_comm_event; c.tool.exit = process_exit_event; c.tool.fork = process_fork_event; + c.tool.mmap = process_mmap_event; + c.tool.mmap2 = process_mmap2_event; } err =perf_config (convert__config, &c);
Signature · 1 line
2.9.4
Arnaldo Carvalho de Melo
maintainerPATCH 15/15 perf data: Add doc when no conversion support compiled
In reply to Arnaldo Carvalho de MeloFrom: Geneviève Bastien <[email protected]>
This adds documentation on the environment variables needed to the message telling that no conversion support is compiled in.
Committer testing:
$ make -C tools/perf install $ perf data convert --all --to-ctf myctftrace No conversion support compiled in. perf should be compiled with environment variables LIBBABELTRACE=1 and LIBBABELTRACE_DIR=/path/to/libbabeltrace/ $
--- tools/perf/builtin-data.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
tools/perf/builtin-data.c +1 -1
@@ -69,7 +69,7 @@ static int cmd_data_convert(int argc, const char **argv) };#ifndef HAVE_LIBBABELTRACE_SUPPORT -pr_err ("No conversion support compiled in.\n" ); +pr_err ("No conversion support compiled in. perf should be compiled with environment variables LIBBABELTRACE=1 and LIBBABELTRACE_DIR=/path/to/libbabeltrace/\n" );return -1 ;#endif
Signature · 1 line
2.9.4
Quoted 81 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
ee438ec8f33c5af0d4a4ffb935c5b9272e8c2680:Merge tag 'perf-core-for-mingo-4.14-20170725' of
git://git.kernel.org/pub/scm/linux/kernel/git/acme/linuxinto perf/core (2017-07-26 19:07:30 +0200)are available in the git repository at:
git://git.kernel.org/pub/scm/linux/kernel/git/acme/linux.gittags/perf-core-for-mingo-4.14-20170728for you to fetch changes up to
6b7007af728df7258bb60ed73099be3b59b3030e:perf data: Add doc when no conversion support compiled (2017-07-28 16:30:45 -0300)
----------------------------------------------------------------
perf/core improvements and fixes for 4.14:New features:
- Add
PERF_SAMPLE_CALLCHAINand PERF_RECORD_MMAP[2] to 'perf data' CTF conversion, allowing CTF trace visualization tools to show callchains and to resolve symbols (Geneviève Bastien)Improvements:
- Use group read for event groups in 'perf stat', reducing overhead when groups are defined in the event specification, i.e. when using {} to enclose a list of events, asking them to be read at the same time, e.g.: "perf stat -e '{cycles,instructions}'" (Jiri Olsa)
Fixes:
- Do not overwrite
perf_sample->weightin 'perf annotate' when processing samples, use whatever came from the kernel when perf_event_attr.sample_type hasPERF_SAMPLE_WEIGHTset or just handle its default value, 0, when that is not set and "weight" is one of the sort orders chosen (Arnaldo Carvalho de Melo)- 'perf annotate --show-total-period' fixes:
- TUI should show period, notnr_samples
- Set appropriate column width for period/percent
- Fix the column header to show "Period" when when that is what is being asked for
(Taeung Song, Arnaldo Carvalho de Melo)- Use default sort if evlist is empty, fixing pipe mode (David Carrillo-Cisneros)
Signed-off-by Arnaldo Carvalho de Melo <[email protected]>----------------------------------------------------------------
Arnaldo Carvalho de Melo (6):
perf annotate: Do not overwriteperf_sample->weightperf annotate stdio: Set enough columns for --show-total-period perf annotate: Fix storing per linesym_hist_entryperf annotate TUI: Usesym_hist_entryindisasm_line_samplesperf annotate TUI: Clarify calculation of column header widths perf annotate TUI: Set appropriate column width for period/percentDavid Carrillo-Cisneros (1):
perf sort: Use default sort if evlist is emptyGeneviève Bastien (3):
perf data: Add callchain to CTF conversion perf data: Add mmap[2] events to CTF conversion perf data: Add doc when no conversion support compiledJiri Olsa (3):
perf tools: Addperf_evsel__read_sizefunction perf evsel: Addread_counter()
perf stat: Use group read for event groupsTaeung Song (2):
perf annotate TUI: Fix --show-total-period
perf annotate TUI: Fix column header when toggling period/percent
Quoted 14 lines
tools/perf/builtin-annotate.c | 2 - tools/perf/builtin-data.c | 2 +- tools/perf/builtin-stat.c | 30 +++++++- tools/perf/ui/browsers/annotate.c | 36 +++++----- tools/perf/util/annotate.c | 11 +-- tools/perf/util/counts.h | 1 + tools/perf/util/data-convert-bt.c | 127 +++++++++++++++++++++++++++++++++- tools/perf/util/evlist.h | 5 ++ tools/perf/util/evsel.c | 139 +++++++++++++++++++++++++++++++++++++- tools/perf/util/evsel.h | 2 + tools/perf/util/sort.c | 2 +- tools/perf/util/stat.c | 4 ++ tools/perf/util/stat.h | 5 +- 13 files changed, 334 insertions(+), 32 deletions(-)
Pulled, thanks a lot Arnaldo!
Ingo
PATCH 1/1 perf build: Clarify header version warning message
In reply to Arnaldo Carvalho de MeloChange this:
Warning: arch/x86/include/asm/disabled-features.h differs from kernel
Warning: arch/x86/include/asm/cpufeatures.h differs from kernel
Warning: arch/powerpc/include/uapi/asm/kvm.h differs from kernel
Warning: arch/s390/include/uapi/asm/kvm.h differs from kernel
to:
Warning: Kernel ABI header at 'tools/arch/x86/include/asm/disabled-features.h' differs from latest version at 'arch/x86/include/asm/disabled-features.h'
Warning: Kernel ABI header at 'tools/arch/x86/include/asm/cpufeatures.h' differs from latest version at 'arch/x86/include/asm/cpufeatures.h'
Warning: Kernel ABI header at 'tools/arch/powerpc/include/uapi/asm/kvm.h' differs from latest version at 'arch/powerpc/include/uapi/asm/kvm.h'
Warning: Kernel ABI header at 'tools/arch/s390/include/uapi/asm/kvm.h' differs from latest version at 'arch/s390/include/uapi/asm/kvm.h'
... to make it clearer what the warning is about, and to make it easier to diff the two versions when syncing up the files.
--- tools/perf/check-headers.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
tools/perf/check-headers.sh +1 -1
@@ -47,7 +47,7 @@ check () { cmd="diff $opts ../$file ../../$file > /dev/null" test -f ../../$file && - eval $cmd || echo "Warning: $file differs from kernel" >&2 + eval $cmd || echo "Warning: Kernel ABI header at 'tools/$file' differs from latest version at '$file'" >&2 }
tip-bot for Ingo Molnar
merge bot[tip:perf/core] perf build: Clarify header version warning message
perf build: Clarify header version warning message
Commit-ID: c59796d53b1c96fd8a0a63119820fb81e06e4aa4 Gitweb: http://git.kernel.org/tip/c59796d53b1c96fd8a0a63119820fb81e06e4aa4 Author: Ingo Molnar <[email protected]> AuthorDate: Sun, 30 Jul 2017 11:37:47 +0200 Committer: Arnaldo Carvalho de Melo <[email protected]> CommitDate: Mon, 31 Jul 2017 10:27:56 -0300
perf build: Clarify header version warning message
Change this:
Warning: arch/x86/include/asm/disabled-features.h differs from kernel
Warning: arch/x86/include/asm/cpufeatures.h differs from kernel
Warning: arch/powerpc/include/uapi/asm/kvm.h differs from kernel
Warning: arch/s390/include/uapi/asm/kvm.h differs from kernel
Warning: Kernel ABI header at 'tools/arch/x86/include/asm/disabled-features.h' differs from latest version at 'arch/x86/include/asm/disabled-features.h'
Warning: Kernel ABI header at 'tools/arch/x86/include/asm/cpufeatures.h' differs from latest version at 'arch/x86/include/asm/cpufeatures.h'
Warning: Kernel ABI header at 'tools/arch/powerpc/include/uapi/asm/kvm.h' differs from latest version at 'arch/powerpc/include/uapi/asm/kvm.h'
Warning: Kernel ABI header at 'tools/arch/s390/include/uapi/asm/kvm.h' differs from latest version at 'arch/s390/include/uapi/asm/kvm.h'
... to make it clearer what the warning is about, and to make it easier to diff the two versions when syncing up the files.
--- tools/perf/check-headers.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
tools/perf/check-headers.sh +1 -1
@@ -47,7 +47,7 @@ check () { cmd="diff $opts ../$file ../../$file > /dev/null" test -f ../../$file && - eval $cmd || echo "Warning: $file differs from kernel" >&2 + eval $cmd || echo "Warning: Kernel ABI header at 'tools/$file' differs from latest version at '$file'" >&2 }
perf build: Clarify open-coded header version warning message
In reply to Arnaldo Carvalho de MeloIn this patch we changed the header checks:
perf build: Clarify header version warning message
Unfortunately the header checks were copied to various places and thus the message got out of sync. Fix some of them here.
Note that there's still old, misleading messages remaining in:
tools/objtool/Makefile: || echo "warning: objtool: x86 instruction decoder differs from kernel" >&2 )) || true tools/objtool/Makefile: || echo "warning: objtool: orc_types.h differs from kernel" >&2 )) || true
here objtool copied the perf message, plus:
tools/perf/util/intel-pt-decoder/Build: || echo "Warning: Intel PT: x86 instruction decoder differs from kernel" >&2 )) || true
here the PT code regressed over the original message and only emits a vague warning instead of specific file names...
All of this should be consolidated into tools/Build/ and used in a consistent manner.
--- tools/lib/bpf/Makefile | 4 ++-- tools/perf/arch/x86/Makefile | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-)
tools/lib/bpf/Makefile +2 -2
@@ -156,10 +156,10 @@ all_cmd: $(CMD_TARGETS) $(BPF_IN): force elfdep bpfdep @(test -f ../../../include/uapi/linux/bpf.h -a -f ../../../include/uapi/linux/bpf.h && ( \ (diff -B ../../include/uapi/linux/bpf.h ../../../include/uapi/linux/bpf.h >/dev/null) || \ - echo "Warning: tools/include/uapi/linux/bpf.h differs from kernel" >&2 )) || true + echo "Warning: Kernel ABI header at 'tools/include/uapi/linux/bpf.h' differs from latest version at 'include/uapi/linux/bpf.h'" >&2 )) || true @(test -f ../../../include/uapi/linux/bpf_common.h -a -f ../../../include/uapi/linux/bpf_common.h && ( \ (diff -B ../../include/uapi/linux/bpf_common.h ../../../include/uapi/linux/bpf_common.h >/dev/null) || \ - echo "Warning: tools/include/uapi/linux/bpf_common.h differs from kernel" >&2 )) || true + echo "Warning: Kernel ABI header at 'tools/include/uapi/linux/bpf_common.h' differs from latest version at 'include/uapi/linux/bpf_common.h'" >&2 )) || true $(Q)$(MAKE) $(build)=libbpf $(OUTPUT)libbpf.so: $(BPF_IN)
tools/perf/arch/x86/Makefile +1 -1
@@ -20,7 +20,7 @@ _dummy := $(shell [ -d '$(out)' ] || mkdir -p '$(out)') $(header): $(sys)/syscall_64.tbl $(systbl) @(test -d ../../kernel -a -d ../../tools -a -d ../perf && ( \ (diff -B arch/x86/entry/syscalls/syscall_64.tbl ../../arch/x86/entry/syscalls/syscall_64.tbl >/dev/null) \ - || echo "Warning: x86_64's syscall_64.tbl differs from kernel" >&2 )) || true + || echo "Warning: Kernel ABI header at 'tools/arch/x86/entry/syscalls/syscall_64.tbl' differs from latest version at 'arch/x86/entry/syscalls/syscall_64.tbl'" >&2 )) || true $(Q)$(SHELL) '$(systbl)' $(sys)/syscall_64.tbl 'x86_64' > $@ clean::
tip-bot for Ingo Molnar
merge bot[tip:perf/core] perf build: Clarify open-coded header version warning message
perf build: Clarify open-coded header version warning message
Commit-ID: 8255e1efc193f110f1c9b8e40597a6c0c89fbedc Gitweb: http://git.kernel.org/tip/8255e1efc193f110f1c9b8e40597a6c0c89fbedc Author: Ingo Molnar <[email protected]> AuthorDate: Sun, 30 Jul 2017 11:51:30 +0200 Committer: Arnaldo Carvalho de Melo <[email protected]> CommitDate: Mon, 31 Jul 2017 10:30:06 -0300
perf build: Clarify open-coded header version warning message
In this patch we changed the header checks:
perf build: Clarify header version warning message
Unfortunately the header checks were copied to various places and thus the message got out of sync. Fix some of them here.
Note that there's still old, misleading messages remaining in:
tools/objtool/Makefile: || echo "warning: objtool: x86 instruction decoder differs from kernel" >&2 )) || true tools/objtool/Makefile: || echo "warning: objtool: orc_types.h differs from kernel" >&2 )) || true
here objtool copied the perf message, plus:
tools/perf/util/intel-pt-decoder/Build: || echo "Warning: Intel PT: x86 instruction decoder differs from kernel" >&2 )) || true
here the PT code regressed over the original message and only emits a vague warning instead of specific file names...
All of this should be consolidated into tools/Build/ and used in a consistent manner.
--- tools/lib/bpf/Makefile | 4 ++-- tools/perf/arch/x86/Makefile | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-)
tools/lib/bpf/Makefile +2 -2
@@ -156,10 +156,10 @@ all_cmd: $(CMD_TARGETS) $(BPF_IN): force elfdep bpfdep @(test -f ../../../include/uapi/linux/bpf.h -a -f ../../../include/uapi/linux/bpf.h && ( \ (diff -B ../../include/uapi/linux/bpf.h ../../../include/uapi/linux/bpf.h >/dev/null) || \ - echo "Warning: tools/include/uapi/linux/bpf.h differs from kernel" >&2 )) || true + echo "Warning: Kernel ABI header at 'tools/include/uapi/linux/bpf.h' differs from latest version at 'include/uapi/linux/bpf.h'" >&2 )) || true @(test -f ../../../include/uapi/linux/bpf_common.h -a -f ../../../include/uapi/linux/bpf_common.h && ( \ (diff -B ../../include/uapi/linux/bpf_common.h ../../../include/uapi/linux/bpf_common.h >/dev/null) || \ - echo "Warning: tools/include/uapi/linux/bpf_common.h differs from kernel" >&2 )) || true + echo "Warning: Kernel ABI header at 'tools/include/uapi/linux/bpf_common.h' differs from latest version at 'include/uapi/linux/bpf_common.h'" >&2 )) || true $(Q)$(MAKE) $(build)=libbpf $(OUTPUT)libbpf.so: $(BPF_IN)
tools/perf/arch/x86/Makefile +1 -1
@@ -20,7 +20,7 @@ _dummy := $(shell [ -d '$(out)' ] || mkdir -p '$(out)') $(header): $(sys)/syscall_64.tbl $(systbl) @(test -d ../../kernel -a -d ../../tools -a -d ../perf && ( \ (diff -B arch/x86/entry/syscalls/syscall_64.tbl ../../arch/x86/entry/syscalls/syscall_64.tbl >/dev/null) \ - || echo "Warning: x86_64's syscall_64.tbl differs from kernel" >&2 )) || true + || echo "Warning: Kernel ABI header at 'tools/arch/x86/entry/syscalls/syscall_64.tbl' differs from latest version at 'arch/x86/entry/syscalls/syscall_64.tbl'" >&2 )) || true $(Q)$(SHELL) '$(systbl)' $(sys)/syscall_64.tbl 'x86_64' > $@ clean::
tools/include: Sync kernel ABI headers with tooling headers
In reply to Arnaldo Carvalho de MeloSync up (copy) the following v4.13 kernel headers to the tooling headers:
arch/arm/include/uapi/asm/kvm.h:
arch/arm64/include/uapi/asm/kvm.h:
arch/powerpc/include/uapi/asm/kvm.h:
arch/s390/include/uapi/asm/kvm.h:
- KVM ABI extensions, which do not affect perf tooling
arch/x86/include/asm/cpufeatures.h:
arch/x86/include/asm/disabled-features.h:
- New PCID CPU feature on Intel CPUs - does not affect tooling.
I.e. no real changes were needed to resolve the build warnings, just a plain copy of the latest kernel header version.
--- tools/arch/arm/include/uapi/asm/kvm.h | 8 ++++++++ tools/arch/arm64/include/uapi/asm/kvm.h | 3 +++ tools/arch/powerpc/include/uapi/asm/kvm.h | 6 ++++++ tools/arch/s390/include/uapi/asm/kvm.h | 12 ++++++++++++ tools/arch/x86/include/asm/cpufeatures.h | 2 ++ tools/arch/x86/include/asm/disabled-features.h | 4 +++- 6 files changed, 34 insertions(+), 1 deletion(-)
tools/arch/arm/include/uapi/asm/kvm.h +8 -0
@@ -203,6 +203,14 @@ struct kvm_arch_memory_slot {#define KVM_DEV_ARM_VGIC_LINE_LEVEL_INTID_MASK 0x3ff#define VGIC_LEVEL_INFO_LINE_LEVEL 0 +/* Device Control API on vcpu fd */ +#define KVM_ARM_VCPU_PMU_V3_CTRL 0 +#define KVM_ARM_VCPU_PMU_V3_IRQ 0 +#define KVM_ARM_VCPU_PMU_V3_INIT 1 +#define KVM_ARM_VCPU_TIMER_CTRL 1 +#define KVM_ARM_VCPU_TIMER_IRQ_VTIMER 0 +#define KVM_ARM_VCPU_TIMER_IRQ_PTIMER 1 +#define KVM_DEV_ARM_VGIC_CTRL_INIT 0#define KVM_DEV_ARM_ITS_SAVE_TABLES 1#define KVM_DEV_ARM_ITS_RESTORE_TABLES 2
tools/arch/arm64/include/uapi/asm/kvm.h +3 -0
@@ -232,6 +232,9 @@ struct kvm_arch_memory_slot {#define KVM_ARM_VCPU_PMU_V3_CTRL 0#define KVM_ARM_VCPU_PMU_V3_IRQ 0#define KVM_ARM_VCPU_PMU_V3_INIT 1 +#define KVM_ARM_VCPU_TIMER_CTRL 1 +#define KVM_ARM_VCPU_TIMER_IRQ_VTIMER 0 +#define KVM_ARM_VCPU_TIMER_IRQ_PTIMER 1/* KVM_IRQ_LINE irq field index values */ #define KVM_ARM_IRQ_TYPE_SHIFT 24
tools/arch/powerpc/include/uapi/asm/kvm.h +6 -0
@@ -60,6 +60,12 @@ struct kvm_regs {#define KVM_SREGS_E_FSL_PIDn (1 << 0)/* PID1/PID2 */ +/* flags for kvm_run.flags */ +#define KVM_RUN_PPC_NMI_DISP_MASK (3 << 0) +#define KVM_RUN_PPC_NMI_DISP_FULLY_RECOV (1 << 0) +#define KVM_RUN_PPC_NMI_DISP_LIMITED_RECOV (2 << 0) +#define KVM_RUN_PPC_NMI_DISP_NOT_RECOV (3 << 0) +/* * Feature bits indicate which sections of the sregs struct are valid, * both in KVM_GET_SREGS and KVM_SET_SREGS. On KVM_SET_SREGS, registers
tools/arch/s390/include/uapi/asm/kvm.h +12 -0
@@ -28,6 +28,7 @@#define KVM_DEV_FLIC_CLEAR_IO_IRQ 8#define KVM_DEV_FLIC_AISM 9#define KVM_DEV_FLIC_AIRQ_INJECT 10 +#define KVM_DEV_FLIC_AISM_ALL 11/* * We can have up to 4*64k pending subchannels + 8 adapter interrupts, * as well as up to ASYNC_PF_PER_VCPU*KVM_MAX_VCPUS pfault done interrupts.
@@ -53,6 +54,11 @@ struct kvm_s390_ais_req {__u16 mode; }; +struct kvm_s390_ais_all { +__u8 simm; +__u8 nimm; +}; +#define KVM_S390_IO_ADAPTER_MASK 1#define KVM_S390_IO_ADAPTER_MAP 2#define KVM_S390_IO_ADAPTER_UNMAP 3
@@ -70,6 +76,7 @@ struct kvm_s390_io_adapter_req {#define KVM_S390_VM_TOD 1#define KVM_S390_VM_CRYPTO 2#define KVM_S390_VM_CPU_MODEL 3 +#define KVM_S390_VM_MIGRATION 4/* kvm attributes for mem_ctrl */ #define KVM_S390_VM_MEM_ENABLE_CMMA 0
@@ -151,6 +158,11 @@ struct kvm_s390_vm_cpu_subfunc {#define KVM_S390_VM_CRYPTO_DISABLE_AES_KW 2#define KVM_S390_VM_CRYPTO_DISABLE_DEA_KW 3 +/* kvm attributes for migration mode */ +#define KVM_S390_VM_MIGRATION_STOP 0 +#define KVM_S390_VM_MIGRATION_START 1 +#define KVM_S390_VM_MIGRATION_STATUS 2 +/* for KVM_GET_REGS and KVM_SET_REGS */ struct kvm_regs {/* general purpose regs for s390 */
tools/arch/x86/include/asm/cpufeatures.h +2 -0
@@ -196,6 +196,7 @@#define X86_FEATURE_HW_PSTATE ( 7*32+ 8)/* AMD HW-PState */ #define X86_FEATURE_PROC_FEEDBACK ( 7*32+ 9)/* AMD ProcFeedbackInterface */ +#define X86_FEATURE_SME ( 7*32+10)/* AMD Secure Memory Encryption */ #define X86_FEATURE_INTEL_PPIN ( 7*32+14)/* Intel Processor Inventory Number */ #define X86_FEATURE_INTEL_PT ( 7*32+15)/* Intel Processor Trace */
@@ -286,6 +287,7 @@#define X86_FEATURE_PAUSEFILTER (15*32+10)/* filtered pause intercept */ #define X86_FEATURE_PFTHRESHOLD (15*32+12)/* pause filter threshold */ #define X86_FEATURE_AVIC (15*32+13)/* Virtual Interrupt Controller */ +#define X86_FEATURE_VIRTUAL_VMLOAD_VMSAVE (15*32+15)/* Virtual VMLOAD VMSAVE */ /* Intel-defined CPU features, CPUID level 0x00000007:0 (ecx), word 16 */ #define X86_FEATURE_AVX512VBMI (16*32+ 1)/* AVX512 Vector Bit Manipulation instructions*/
tools/arch/x86/include/asm/disabled-features.h +3 -1
@@ -21,11 +21,13 @@# define DISABLE_K6_MTRR (1<<(X86_FEATURE_K6_MTRR & 31))# define DISABLE_CYRIX_ARR (1<<(X86_FEATURE_CYRIX_ARR & 31))# define DISABLE_CENTAUR_MCR (1<<(X86_FEATURE_CENTAUR_MCR & 31)) +# define DISABLE_PCID 0#else # define DISABLE_VME 0# define DISABLE_K6_MTRR 0# define DISABLE_CYRIX_ARR 0# define DISABLE_CENTAUR_MCR 0 +# define DISABLE_PCID (1<<(X86_FEATURE_PCID & 31))#endif /* CONFIG_X86_64 */ #ifdef CONFIG_X86_INTEL_MEMORY_PROTECTION_KEYS
@@ -49,7 +51,7 @@#define DISABLED_MASK1 0#define DISABLED_MASK2 0#define DISABLED_MASK3 (DISABLE_CYRIX_ARR|DISABLE_CENTAUR_MCR|DISABLE_K6_MTRR) -#define DISABLED_MASK4 0 +#define DISABLED_MASK4 (DISABLE_PCID)#define DISABLED_MASK5 0#define DISABLED_MASK6 0#define DISABLED_MASK7 0
tip-bot for Ingo Molnar
merge bot[tip:perf/core] tools headers: Sync kernel ABI headers with tooling headers
tools headers: Sync kernel ABI headers with tooling headers
Commit-ID: a40f61777b8c66cfd61c37b0102387578abb8ed0 Gitweb: http://git.kernel.org/tip/a40f61777b8c66cfd61c37b0102387578abb8ed0 Author: Ingo Molnar <[email protected]> AuthorDate: Sun, 30 Jul 2017 11:52:32 +0200 Committer: Arnaldo Carvalho de Melo <[email protected]> CommitDate: Mon, 31 Jul 2017 10:35:28 -0300
tools headers: Sync kernel ABI headers with tooling headers
Sync up (copy) the following v4.13 kernel headers to the tooling headers:
arch/arm/include/uapi/asm/kvm.h:
arch/arm64/include/uapi/asm/kvm.h:
arch/powerpc/include/uapi/asm/kvm.h:
arch/s390/include/uapi/asm/kvm.h:
- KVM ABI extensions, which do not affect perf tooling
arch/x86/include/asm/cpufeatures.h:
arch/x86/include/asm/disabled-features.h:
- New PCID CPU feature on Intel CPUs - does not affect tooling.
I.e. no real changes were needed to resolve the build warnings, just a plain copy of the latest kernel header version.
--- tools/arch/arm/include/uapi/asm/kvm.h | 8 ++++++++ tools/arch/arm64/include/uapi/asm/kvm.h | 3 +++ tools/arch/powerpc/include/uapi/asm/kvm.h | 6 ++++++ tools/arch/s390/include/uapi/asm/kvm.h | 12 ++++++++++++ tools/arch/x86/include/asm/cpufeatures.h | 2 ++ tools/arch/x86/include/asm/disabled-features.h | 4 +++- 6 files changed, 34 insertions(+), 1 deletion(-)
tools/arch/arm/include/uapi/asm/kvm.h +8 -0
@@ -203,6 +203,14 @@ struct kvm_arch_memory_slot {#define KVM_DEV_ARM_VGIC_LINE_LEVEL_INTID_MASK 0x3ff#define VGIC_LEVEL_INFO_LINE_LEVEL 0 +/* Device Control API on vcpu fd */ +#define KVM_ARM_VCPU_PMU_V3_CTRL 0 +#define KVM_ARM_VCPU_PMU_V3_IRQ 0 +#define KVM_ARM_VCPU_PMU_V3_INIT 1 +#define KVM_ARM_VCPU_TIMER_CTRL 1 +#define KVM_ARM_VCPU_TIMER_IRQ_VTIMER 0 +#define KVM_ARM_VCPU_TIMER_IRQ_PTIMER 1 +#define KVM_DEV_ARM_VGIC_CTRL_INIT 0#define KVM_DEV_ARM_ITS_SAVE_TABLES 1#define KVM_DEV_ARM_ITS_RESTORE_TABLES 2
tools/arch/arm64/include/uapi/asm/kvm.h +3 -0
@@ -232,6 +232,9 @@ struct kvm_arch_memory_slot {#define KVM_ARM_VCPU_PMU_V3_CTRL 0#define KVM_ARM_VCPU_PMU_V3_IRQ 0#define KVM_ARM_VCPU_PMU_V3_INIT 1 +#define KVM_ARM_VCPU_TIMER_CTRL 1 +#define KVM_ARM_VCPU_TIMER_IRQ_VTIMER 0 +#define KVM_ARM_VCPU_TIMER_IRQ_PTIMER 1/* KVM_IRQ_LINE irq field index values */ #define KVM_ARM_IRQ_TYPE_SHIFT 24
tools/arch/powerpc/include/uapi/asm/kvm.h +6 -0
@@ -60,6 +60,12 @@ struct kvm_regs {#define KVM_SREGS_E_FSL_PIDn (1 << 0)/* PID1/PID2 */ +/* flags for kvm_run.flags */ +#define KVM_RUN_PPC_NMI_DISP_MASK (3 << 0) +#define KVM_RUN_PPC_NMI_DISP_FULLY_RECOV (1 << 0) +#define KVM_RUN_PPC_NMI_DISP_LIMITED_RECOV (2 << 0) +#define KVM_RUN_PPC_NMI_DISP_NOT_RECOV (3 << 0) +/* * Feature bits indicate which sections of the sregs struct are valid, * both in KVM_GET_SREGS and KVM_SET_SREGS. On KVM_SET_SREGS, registers
tools/arch/s390/include/uapi/asm/kvm.h +12 -0
@@ -28,6 +28,7 @@#define KVM_DEV_FLIC_CLEAR_IO_IRQ 8#define KVM_DEV_FLIC_AISM 9#define KVM_DEV_FLIC_AIRQ_INJECT 10 +#define KVM_DEV_FLIC_AISM_ALL 11/* * We can have up to 4*64k pending subchannels + 8 adapter interrupts, * as well as up to ASYNC_PF_PER_VCPU*KVM_MAX_VCPUS pfault done interrupts.
@@ -53,6 +54,11 @@ struct kvm_s390_ais_req {__u16 mode; }; +struct kvm_s390_ais_all { +__u8 simm; +__u8 nimm; +}; +#define KVM_S390_IO_ADAPTER_MASK 1#define KVM_S390_IO_ADAPTER_MAP 2#define KVM_S390_IO_ADAPTER_UNMAP 3
@@ -70,6 +76,7 @@ struct kvm_s390_io_adapter_req {#define KVM_S390_VM_TOD 1#define KVM_S390_VM_CRYPTO 2#define KVM_S390_VM_CPU_MODEL 3 +#define KVM_S390_VM_MIGRATION 4/* kvm attributes for mem_ctrl */ #define KVM_S390_VM_MEM_ENABLE_CMMA 0
@@ -151,6 +158,11 @@ struct kvm_s390_vm_cpu_subfunc {#define KVM_S390_VM_CRYPTO_DISABLE_AES_KW 2#define KVM_S390_VM_CRYPTO_DISABLE_DEA_KW 3 +/* kvm attributes for migration mode */ +#define KVM_S390_VM_MIGRATION_STOP 0 +#define KVM_S390_VM_MIGRATION_START 1 +#define KVM_S390_VM_MIGRATION_STATUS 2 +/* for KVM_GET_REGS and KVM_SET_REGS */ struct kvm_regs {/* general purpose regs for s390 */
tools/arch/x86/include/asm/cpufeatures.h +2 -0
@@ -196,6 +196,7 @@#define X86_FEATURE_HW_PSTATE ( 7*32+ 8)/* AMD HW-PState */ #define X86_FEATURE_PROC_FEEDBACK ( 7*32+ 9)/* AMD ProcFeedbackInterface */ +#define X86_FEATURE_SME ( 7*32+10)/* AMD Secure Memory Encryption */ #define X86_FEATURE_INTEL_PPIN ( 7*32+14)/* Intel Processor Inventory Number */ #define X86_FEATURE_INTEL_PT ( 7*32+15)/* Intel Processor Trace */
@@ -286,6 +287,7 @@#define X86_FEATURE_PAUSEFILTER (15*32+10)/* filtered pause intercept */ #define X86_FEATURE_PFTHRESHOLD (15*32+12)/* pause filter threshold */ #define X86_FEATURE_AVIC (15*32+13)/* Virtual Interrupt Controller */ +#define X86_FEATURE_VIRTUAL_VMLOAD_VMSAVE (15*32+15)/* Virtual VMLOAD VMSAVE */ /* Intel-defined CPU features, CPUID level 0x00000007:0 (ecx), word 16 */ #define X86_FEATURE_AVX512VBMI (16*32+ 1)/* AVX512 Vector Bit Manipulation instructions*/
tools/arch/x86/include/asm/disabled-features.h +3 -1
@@ -21,11 +21,13 @@# define DISABLE_K6_MTRR (1<<(X86_FEATURE_K6_MTRR & 31))# define DISABLE_CYRIX_ARR (1<<(X86_FEATURE_CYRIX_ARR & 31))# define DISABLE_CENTAUR_MCR (1<<(X86_FEATURE_CENTAUR_MCR & 31)) +# define DISABLE_PCID 0#else # define DISABLE_VME 0# define DISABLE_K6_MTRR 0# define DISABLE_CYRIX_ARR 0# define DISABLE_CENTAUR_MCR 0 +# define DISABLE_PCID (1<<(X86_FEATURE_PCID & 31))#endif /* CONFIG_X86_64 */ #ifdef CONFIG_X86_INTEL_MEMORY_PROTECTION_KEYS
@@ -49,7 +51,7 @@#define DISABLED_MASK1 0#define DISABLED_MASK2 0#define DISABLED_MASK3 (DISABLE_CYRIX_ARR|DISABLE_CENTAUR_MCR|DISABLE_K6_MTRR) -#define DISABLED_MASK4 0 +#define DISABLED_MASK4 (DISABLE_PCID)#define DISABLED_MASK5 0#define DISABLED_MASK6 0#define DISABLED_MASK7 0