aboutsummaryrefslogtreecommitdiffstats
path: root/tools/perf
diff options
context:
space:
mode:
authorIngo Molnar <mingo@kernel.org>2017-08-29 17:13:56 -0400
committerIngo Molnar <mingo@kernel.org>2017-08-29 17:13:56 -0400
commit1b2f76d77a277bb70d38ad0991ed7f16bbc115a9 (patch)
treeb02f9b167b1c1b9df860f480b45523c70ef52acf /tools/perf
parent5da382eb6ea37e2c49ef521c636d73f6ecc3fa81 (diff)
parentb2f7605076d6cdd68162c42c34caadafbbe4c69f (diff)
Merge tag 'perf-core-for-mingo-4.14-20170829' of git://git.kernel.org/pub/scm/linux/kernel/git/acme/linux into perf/core
Pull perf/core improvements and fixes from Arnaldo Carvalho de Melo: - Fix remote HITM detection for Skylake in 'perf c2c' (Jiri Olsa) - Fixes for the handling of PERF_RECORD_READ records (Jiri Olsa) - Fix kprobes blackist symbol lookup in 'perf probe' (Li Bin) - The PLT header and entry sizes are not the same in !x86, fix it for ARM and AARCH64 (Li Bin) - Beautify pkey_{alloc,free,mprotect} arguments in 'perf trace' (Arnaldo Carvalho de Melo) - Fix CC, AR, LD external definition, allow flex and bison to be externally defined and other related Makefile fixes (David Carrillo-Cisneros) - Sync CPU features kernel ABI headers with tooling headers (Arnaldo Carvalho de Melo) - Fix path to PMU formats in 'perf stat' documentation (Jack Henschel) - Fix static build with newer toolchains (Jiri Olsa) Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com> Signed-off-by: Ingo Molnar <mingo@kernel.org>
Diffstat (limited to 'tools/perf')
-rw-r--r--tools/perf/Documentation/perf-stat.txt4
-rw-r--r--tools/perf/Makefile.config4
-rw-r--r--tools/perf/Makefile.perf26
-rw-r--r--tools/perf/builtin-report.c6
-rw-r--r--tools/perf/builtin-trace.c8
-rw-r--r--tools/perf/trace/beauty/Build1
-rw-r--r--tools/perf/trace/beauty/beauty.h3
-rw-r--r--tools/perf/trace/beauty/pkey_alloc.c50
-rwxr-xr-xtools/perf/trace/beauty/pkey_alloc_access_rights.sh10
-rw-r--r--tools/perf/util/evsel.c7
-rw-r--r--tools/perf/util/intel-pt-decoder/Build2
-rw-r--r--tools/perf/util/mem-events.c11
-rw-r--r--tools/perf/util/probe-event.c2
-rw-r--r--tools/perf/util/session.c25
-rw-r--r--tools/perf/util/symbol-elf.c27
-rw-r--r--tools/perf/util/values.c17
16 files changed, 173 insertions, 30 deletions
diff --git a/tools/perf/Documentation/perf-stat.txt b/tools/perf/Documentation/perf-stat.txt
index 698076313606..c37d61682dfb 100644
--- a/tools/perf/Documentation/perf-stat.txt
+++ b/tools/perf/Documentation/perf-stat.txt
@@ -41,13 +41,13 @@ report::
41 41
42 - a symbolically formed event like 'pmu/param1=0x3,param2/' where 42 - a symbolically formed event like 'pmu/param1=0x3,param2/' where
43 param1 and param2 are defined as formats for the PMU in 43 param1 and param2 are defined as formats for the PMU in
44 /sys/bus/event_sources/devices/<pmu>/format/* 44 /sys/bus/event_source/devices/<pmu>/format/*
45 45
46 - a symbolically formed event like 'pmu/config=M,config1=N,config2=K/' 46 - a symbolically formed event like 'pmu/config=M,config1=N,config2=K/'
47 where M, N, K are numbers (in decimal, hex, octal format). 47 where M, N, K are numbers (in decimal, hex, octal format).
48 Acceptable values for each of 'config', 'config1' and 'config2' 48 Acceptable values for each of 'config', 'config1' and 'config2'
49 parameters are defined by corresponding entries in 49 parameters are defined by corresponding entries in
50 /sys/bus/event_sources/devices/<pmu>/format/* 50 /sys/bus/event_source/devices/<pmu>/format/*
51 51
52-i:: 52-i::
53--no-inherit:: 53--no-inherit::
diff --git a/tools/perf/Makefile.config b/tools/perf/Makefile.config
index 6a64c6bbd9a5..63f534a0902f 100644
--- a/tools/perf/Makefile.config
+++ b/tools/perf/Makefile.config
@@ -148,7 +148,7 @@ ifndef DEBUG
148endif 148endif
149 149
150ifeq ($(DEBUG),0) 150ifeq ($(DEBUG),0)
151ifeq ($(CC), clang) 151ifeq ($(CC_NO_CLANG), 0)
152 CFLAGS += -O3 152 CFLAGS += -O3
153else 153else
154 CFLAGS += -O6 154 CFLAGS += -O6
@@ -184,7 +184,7 @@ ifdef PYTHON_CONFIG
184 PYTHON_EMBED_LDFLAGS := $(call strip-libs,$(PYTHON_EMBED_LDOPTS)) 184 PYTHON_EMBED_LDFLAGS := $(call strip-libs,$(PYTHON_EMBED_LDOPTS))
185 PYTHON_EMBED_LIBADD := $(call grep-libs,$(PYTHON_EMBED_LDOPTS)) -lutil 185 PYTHON_EMBED_LIBADD := $(call grep-libs,$(PYTHON_EMBED_LDOPTS)) -lutil
186 PYTHON_EMBED_CCOPTS := $(shell $(PYTHON_CONFIG_SQ) --cflags 2>/dev/null) 186 PYTHON_EMBED_CCOPTS := $(shell $(PYTHON_CONFIG_SQ) --cflags 2>/dev/null)
187 ifeq ($(CC), clang) 187 ifeq ($(CC_NO_CLANG), 1)
188 PYTHON_EMBED_CCOPTS := $(filter-out -specs=%,$(PYTHON_EMBED_CCOPTS)) 188 PYTHON_EMBED_CCOPTS := $(filter-out -specs=%,$(PYTHON_EMBED_CCOPTS))
189 endif 189 endif
190 FLAGS_PYTHON_EMBED := $(PYTHON_EMBED_CCOPTS) $(PYTHON_EMBED_LDOPTS) 190 FLAGS_PYTHON_EMBED := $(PYTHON_EMBED_CCOPTS) $(PYTHON_EMBED_LDOPTS)
diff --git a/tools/perf/Makefile.perf b/tools/perf/Makefile.perf
index 70ddc65f898d..91ef44bfaf3e 100644
--- a/tools/perf/Makefile.perf
+++ b/tools/perf/Makefile.perf
@@ -164,8 +164,8 @@ LN = ln -f
164MKDIR = mkdir 164MKDIR = mkdir
165FIND = find 165FIND = find
166INSTALL = install 166INSTALL = install
167FLEX = flex 167FLEX ?= flex
168BISON = bison 168BISON ?= bison
169STRIP = strip 169STRIP = strip
170AWK = awk 170AWK = awk
171 171
@@ -240,7 +240,7 @@ endif
240ifeq ($(FEATURES_DUMP),) 240ifeq ($(FEATURES_DUMP),)
241FEATURE_DUMP_EXPORT := $(realpath $(OUTPUT)FEATURE-DUMP) 241FEATURE_DUMP_EXPORT := $(realpath $(OUTPUT)FEATURE-DUMP)
242else 242else
243FEATURE_DUMP_EXPORT := $(FEATURES_DUMP) 243FEATURE_DUMP_EXPORT := $(realpath $(FEATURES_DUMP))
244endif 244endif
245 245
246export prefix bindir sharedir sysconfdir DESTDIR 246export prefix bindir sharedir sysconfdir DESTDIR
@@ -279,7 +279,13 @@ LIBTRACEEVENT = $(TE_PATH)libtraceevent.a
279export LIBTRACEEVENT 279export LIBTRACEEVENT
280 280
281LIBTRACEEVENT_DYNAMIC_LIST = $(TE_PATH)libtraceevent-dynamic-list 281LIBTRACEEVENT_DYNAMIC_LIST = $(TE_PATH)libtraceevent-dynamic-list
282LIBTRACEEVENT_DYNAMIC_LIST_LDFLAGS = -Xlinker --dynamic-list=$(LIBTRACEEVENT_DYNAMIC_LIST) 282
283#
284# The static build has no dynsym table, so this does not work for
285# static build. Looks like linker starts to scream about that now
286# (in Fedora 26) so we need to switch it off for static build.
287DYNAMIC_LIST_LDFLAGS = -Xlinker --dynamic-list=$(LIBTRACEEVENT_DYNAMIC_LIST)
288LIBTRACEEVENT_DYNAMIC_LIST_LDFLAGS = $(if $(findstring -static,$(LDFLAGS)),,$(DYNAMIC_LIST_LDFLAGS))
283 289
284LIBAPI = $(API_PATH)libapi.a 290LIBAPI = $(API_PATH)libapi.a
285export LIBAPI 291export LIBAPI
@@ -381,7 +387,8 @@ export INSTALL SHELL_PATH
381 387
382SHELL = $(SHELL_PATH) 388SHELL = $(SHELL_PATH)
383 389
384beauty_ioctl_outdir := $(OUTPUT)trace/beauty/generated/ioctl 390beauty_outdir := $(OUTPUT)trace/beauty/generated
391beauty_ioctl_outdir := $(beauty_outdir)/ioctl
385drm_ioctl_array := $(beauty_ioctl_outdir)/drm_ioctl_array.c 392drm_ioctl_array := $(beauty_ioctl_outdir)/drm_ioctl_array.c
386drm_hdr_dir := $(srctree)/tools/include/uapi/drm 393drm_hdr_dir := $(srctree)/tools/include/uapi/drm
387drm_ioctl_tbl := $(srctree)/tools/perf/trace/beauty/drm_ioctl.sh 394drm_ioctl_tbl := $(srctree)/tools/perf/trace/beauty/drm_ioctl.sh
@@ -392,6 +399,13 @@ _dummy := $(shell [ -d '$(beauty_ioctl_outdir)' ] || mkdir -p '$(beauty_ioctl_ou
392$(drm_ioctl_array): $(drm_hdr_dir)/drm.h $(drm_hdr_dir)/i915_drm.h $(drm_ioctl_tbl) 399$(drm_ioctl_array): $(drm_hdr_dir)/drm.h $(drm_hdr_dir)/i915_drm.h $(drm_ioctl_tbl)
393 $(Q)$(SHELL) '$(drm_ioctl_tbl)' $(drm_hdr_dir) > $@ 400 $(Q)$(SHELL) '$(drm_ioctl_tbl)' $(drm_hdr_dir) > $@
394 401
402pkey_alloc_access_rights_array := $(beauty_outdir)/pkey_alloc_access_rights_array.c
403asm_generic_hdr_dir := $(srctree)/tools/include/uapi/asm-generic/
404pkey_alloc_access_rights_tbl := $(srctree)/tools/perf/trace/beauty/pkey_alloc_access_rights.sh
405
406$(pkey_alloc_access_rights_array): $(asm_generic_hdr_dir)/mman-common.h $(pkey_alloc_access_rights_tbl)
407 $(Q)$(SHELL) '$(pkey_alloc_access_rights_tbl)' $(asm_generic_hdr_dir) > $@
408
395sndrv_ctl_ioctl_array := $(beauty_ioctl_outdir)/sndrv_ctl_ioctl_array.c 409sndrv_ctl_ioctl_array := $(beauty_ioctl_outdir)/sndrv_ctl_ioctl_array.c
396sndrv_ctl_hdr_dir := $(srctree)/tools/include/uapi/sound 410sndrv_ctl_hdr_dir := $(srctree)/tools/include/uapi/sound
397sndrv_ctl_ioctl_tbl := $(srctree)/tools/perf/trace/beauty/sndrv_ctl_ioctl.sh 411sndrv_ctl_ioctl_tbl := $(srctree)/tools/perf/trace/beauty/sndrv_ctl_ioctl.sh
@@ -522,6 +536,7 @@ __build-dir = $(subst $(OUTPUT),,$(dir $@))
522build-dir = $(if $(__build-dir),$(__build-dir),.) 536build-dir = $(if $(__build-dir),$(__build-dir),.)
523 537
524prepare: $(OUTPUT)PERF-VERSION-FILE $(OUTPUT)common-cmds.h archheaders $(drm_ioctl_array) \ 538prepare: $(OUTPUT)PERF-VERSION-FILE $(OUTPUT)common-cmds.h archheaders $(drm_ioctl_array) \
539 $(pkey_alloc_access_rights_array) \
525 $(sndrv_pcm_ioctl_array) \ 540 $(sndrv_pcm_ioctl_array) \
526 $(sndrv_ctl_ioctl_array) \ 541 $(sndrv_ctl_ioctl_array) \
527 $(kvm_ioctl_array) \ 542 $(kvm_ioctl_array) \
@@ -797,6 +812,7 @@ clean:: $(LIBTRACEEVENT)-clean $(LIBAPI)-clean $(LIBBPF)-clean $(LIBSUBCMD)-clea
797 $(OUTPUT)tests/llvm-src-{base,kbuild,prologue,relocation}.c \ 812 $(OUTPUT)tests/llvm-src-{base,kbuild,prologue,relocation}.c \
798 $(OUTPUT)pmu-events/pmu-events.c \ 813 $(OUTPUT)pmu-events/pmu-events.c \
799 $(OUTPUT)$(drm_ioctl_array) \ 814 $(OUTPUT)$(drm_ioctl_array) \
815 $(OUTPUT)$(pkey_alloc_access_rights_array) \
800 $(OUTPUT)$(sndrv_ctl_ioctl_array) \ 816 $(OUTPUT)$(sndrv_ctl_ioctl_array) \
801 $(OUTPUT)$(sndrv_pcm_ioctl_array) \ 817 $(OUTPUT)$(sndrv_pcm_ioctl_array) \
802 $(OUTPUT)$(kvm_ioctl_array) \ 818 $(OUTPUT)$(kvm_ioctl_array) \
diff --git a/tools/perf/builtin-report.c b/tools/perf/builtin-report.c
index bace3429c030..f9dff652dcbd 100644
--- a/tools/perf/builtin-report.c
+++ b/tools/perf/builtin-report.c
@@ -241,7 +241,7 @@ static int process_read_event(struct perf_tool *tool,
241 const char *name = evsel ? perf_evsel__name(evsel) : "unknown"; 241 const char *name = evsel ? perf_evsel__name(evsel) : "unknown";
242 int err = perf_read_values_add_value(&rep->show_threads_values, 242 int err = perf_read_values_add_value(&rep->show_threads_values,
243 event->read.pid, event->read.tid, 243 event->read.pid, event->read.tid,
244 event->read.id, 244 evsel->idx,
245 name, 245 name,
246 event->read.value); 246 event->read.value);
247 247
@@ -249,10 +249,6 @@ static int process_read_event(struct perf_tool *tool,
249 return err; 249 return err;
250 } 250 }
251 251
252 dump_printf(": %d %d %s %" PRIu64 "\n", event->read.pid, event->read.tid,
253 evsel ? perf_evsel__name(evsel) : "FAIL",
254 event->read.value);
255
256 return 0; 252 return 0;
257} 253}
258 254
diff --git a/tools/perf/builtin-trace.c b/tools/perf/builtin-trace.c
index 91905839e386..d59cdadf3a79 100644
--- a/tools/perf/builtin-trace.c
+++ b/tools/perf/builtin-trace.c
@@ -693,6 +693,14 @@ static struct syscall_fmt {
693 [4] = { .scnprintf = SCA_PERF_FLAGS, /* flags */ }, }, }, 693 [4] = { .scnprintf = SCA_PERF_FLAGS, /* flags */ }, }, },
694 { .name = "pipe2", 694 { .name = "pipe2",
695 .arg = { [1] = { .scnprintf = SCA_PIPE_FLAGS, /* flags */ }, }, }, 695 .arg = { [1] = { .scnprintf = SCA_PIPE_FLAGS, /* flags */ }, }, },
696 { .name = "pkey_alloc",
697 .arg = { [1] = { .scnprintf = SCA_PKEY_ALLOC_ACCESS_RIGHTS, /* access_rights */ }, }, },
698 { .name = "pkey_free",
699 .arg = { [0] = { .scnprintf = SCA_INT, /* key */ }, }, },
700 { .name = "pkey_mprotect",
701 .arg = { [0] = { .scnprintf = SCA_HEX, /* start */ },
702 [2] = { .scnprintf = SCA_MMAP_PROT, /* prot */ },
703 [3] = { .scnprintf = SCA_INT, /* pkey */ }, }, },
696 { .name = "poll", .timeout = true, }, 704 { .name = "poll", .timeout = true, },
697 { .name = "ppoll", .timeout = true, }, 705 { .name = "ppoll", .timeout = true, },
698 { .name = "pread", .alias = "pread64", }, 706 { .name = "pread", .alias = "pread64", },
diff --git a/tools/perf/trace/beauty/Build b/tools/perf/trace/beauty/Build
index 6f3f159f97e0..175d633c6b49 100644
--- a/tools/perf/trace/beauty/Build
+++ b/tools/perf/trace/beauty/Build
@@ -3,4 +3,5 @@ libperf-y += fcntl.o
3ifeq ($(SRCARCH),$(filter $(SRCARCH),x86)) 3ifeq ($(SRCARCH),$(filter $(SRCARCH),x86))
4libperf-y += ioctl.o 4libperf-y += ioctl.o
5endif 5endif
6libperf-y += pkey_alloc.o
6libperf-y += statx.o 7libperf-y += statx.o
diff --git a/tools/perf/trace/beauty/beauty.h b/tools/perf/trace/beauty/beauty.h
index 47a36a8eb842..4b58581a6053 100644
--- a/tools/perf/trace/beauty/beauty.h
+++ b/tools/perf/trace/beauty/beauty.h
@@ -78,6 +78,9 @@ size_t syscall_arg__scnprintf_fcntl_arg(char *bf, size_t size, struct syscall_ar
78size_t syscall_arg__scnprintf_ioctl_cmd(char *bf, size_t size, struct syscall_arg *arg); 78size_t syscall_arg__scnprintf_ioctl_cmd(char *bf, size_t size, struct syscall_arg *arg);
79#define SCA_IOCTL_CMD syscall_arg__scnprintf_ioctl_cmd 79#define SCA_IOCTL_CMD syscall_arg__scnprintf_ioctl_cmd
80 80
81size_t syscall_arg__scnprintf_pkey_alloc_access_rights(char *bf, size_t size, struct syscall_arg *arg);
82#define SCA_PKEY_ALLOC_ACCESS_RIGHTS syscall_arg__scnprintf_pkey_alloc_access_rights
83
81size_t syscall_arg__scnprintf_open_flags(char *bf, size_t size, struct syscall_arg *arg); 84size_t syscall_arg__scnprintf_open_flags(char *bf, size_t size, struct syscall_arg *arg);
82#define SCA_OPEN_FLAGS syscall_arg__scnprintf_open_flags 85#define SCA_OPEN_FLAGS syscall_arg__scnprintf_open_flags
83 86
diff --git a/tools/perf/trace/beauty/pkey_alloc.c b/tools/perf/trace/beauty/pkey_alloc.c
new file mode 100644
index 000000000000..2ba784a3734a
--- /dev/null
+++ b/tools/perf/trace/beauty/pkey_alloc.c
@@ -0,0 +1,50 @@
1/*
2 * trace/beauty/pkey_alloc.c
3 *
4 * Copyright (C) 2017, Red Hat Inc, Arnaldo Carvalho de Melo <acme@redhat.com>
5 *
6 * Released under the GPL v2. (and only v2, not any later version)
7 */
8
9#include "trace/beauty/beauty.h"
10#include <linux/kernel.h>
11#include <linux/log2.h>
12
13static size_t pkey_alloc__scnprintf_access_rights(int access_rights, char *bf, size_t size)
14{
15 int i, printed = 0;
16
17#include "trace/beauty/generated/pkey_alloc_access_rights_array.c"
18 static DEFINE_STRARRAY(pkey_alloc_access_rights);
19
20 if (access_rights == 0) {
21 const char *s = strarray__pkey_alloc_access_rights.entries[0];
22 if (s)
23 return scnprintf(bf, size, "%s", s);
24 return scnprintf(bf, size, "%d", 0);
25 }
26
27 for (i = 1; i < strarray__pkey_alloc_access_rights.nr_entries; ++i) {
28 int bit = 1 << (i - 1);
29
30 if (!(access_rights & bit))
31 continue;
32
33 if (printed != 0)
34 printed += scnprintf(bf + printed, size - printed, "|");
35
36 if (strarray__pkey_alloc_access_rights.entries[i] != NULL)
37 printed += scnprintf(bf + printed, size - printed, "%s", strarray__pkey_alloc_access_rights.entries[i]);
38 else
39 printed += scnprintf(bf + printed, size - printed, "0x%#", bit);
40 }
41
42 return printed;
43}
44
45size_t syscall_arg__scnprintf_pkey_alloc_access_rights(char *bf, size_t size, struct syscall_arg *arg)
46{
47 unsigned long cmd = arg->val;
48
49 return pkey_alloc__scnprintf_access_rights(cmd, bf, size);
50}
diff --git a/tools/perf/trace/beauty/pkey_alloc_access_rights.sh b/tools/perf/trace/beauty/pkey_alloc_access_rights.sh
new file mode 100755
index 000000000000..62e51a02b839
--- /dev/null
+++ b/tools/perf/trace/beauty/pkey_alloc_access_rights.sh
@@ -0,0 +1,10 @@
1#!/bin/sh
2
3header_dir=$1
4
5printf "static const char *pkey_alloc_access_rights[] = {\n"
6regex='^[[:space:]]*#[[:space:]]*define[[:space:]]+PKEY_([[:alnum:]_]+)[[:space:]]+(0x[[:xdigit:]]+)[[:space:]]*'
7egrep $regex ${header_dir}/mman-common.h | \
8 sed -r "s/$regex/\2 \2 \1/g" | \
9 sort | xargs printf "\t[%s ? (ilog2(%s) + 1) : 0] = \"%s\",\n"
10printf "};\n"
diff --git a/tools/perf/util/evsel.c b/tools/perf/util/evsel.c
index a5888c704e01..d9bd632ed7db 100644
--- a/tools/perf/util/evsel.c
+++ b/tools/perf/util/evsel.c
@@ -902,8 +902,13 @@ void perf_evsel__config(struct perf_evsel *evsel, struct record_opts *opts,
902 if (opts->no_samples) 902 if (opts->no_samples)
903 attr->sample_freq = 0; 903 attr->sample_freq = 0;
904 904
905 if (opts->inherit_stat) 905 if (opts->inherit_stat) {
906 evsel->attr.read_format |=
907 PERF_FORMAT_TOTAL_TIME_ENABLED |
908 PERF_FORMAT_TOTAL_TIME_RUNNING |
909 PERF_FORMAT_ID;
906 attr->inherit_stat = 1; 910 attr->inherit_stat = 1;
911 }
907 912
908 if (opts->sample_address) { 913 if (opts->sample_address) {
909 perf_evsel__set_sample_bit(evsel, ADDR); 914 perf_evsel__set_sample_bit(evsel, ADDR);
diff --git a/tools/perf/util/intel-pt-decoder/Build b/tools/perf/util/intel-pt-decoder/Build
index 7aca5d6d7e1f..10e0814bb8d2 100644
--- a/tools/perf/util/intel-pt-decoder/Build
+++ b/tools/perf/util/intel-pt-decoder/Build
@@ -25,6 +25,6 @@ $(OUTPUT)util/intel-pt-decoder/intel-pt-insn-decoder.o: util/intel-pt-decoder/in
25 25
26CFLAGS_intel-pt-insn-decoder.o += -I$(OUTPUT)util/intel-pt-decoder 26CFLAGS_intel-pt-insn-decoder.o += -I$(OUTPUT)util/intel-pt-decoder
27 27
28ifneq ($(CC), clang) 28ifeq ($(CC_NO_CLANG), 1)
29 CFLAGS_intel-pt-insn-decoder.o += -Wno-override-init 29 CFLAGS_intel-pt-insn-decoder.o += -Wno-override-init
30endif 30endif
diff --git a/tools/perf/util/mem-events.c b/tools/perf/util/mem-events.c
index ced4f3fff035..28afe5fa84d6 100644
--- a/tools/perf/util/mem-events.c
+++ b/tools/perf/util/mem-events.c
@@ -316,6 +316,11 @@ int c2c_decode_stats(struct c2c_stats *stats, struct mem_info *mi)
316 u64 lvl = data_src->mem_lvl; 316 u64 lvl = data_src->mem_lvl;
317 u64 snoop = data_src->mem_snoop; 317 u64 snoop = data_src->mem_snoop;
318 u64 lock = data_src->mem_lock; 318 u64 lock = data_src->mem_lock;
319 /*
320 * Skylake might report unknown remote level via this
321 * bit, consider it when evaluating remote HITMs.
322 */
323 bool mrem = data_src->mem_remote;
319 int err = 0; 324 int err = 0;
320 325
321#define HITM_INC(__f) \ 326#define HITM_INC(__f) \
@@ -361,7 +366,8 @@ do { \
361 } 366 }
362 367
363 if ((lvl & P(LVL, REM_RAM1)) || 368 if ((lvl & P(LVL, REM_RAM1)) ||
364 (lvl & P(LVL, REM_RAM2))) { 369 (lvl & P(LVL, REM_RAM2)) ||
370 mrem) {
365 stats->rmt_dram++; 371 stats->rmt_dram++;
366 if (snoop & P(SNOOP, HIT)) 372 if (snoop & P(SNOOP, HIT))
367 stats->ld_shared++; 373 stats->ld_shared++;
@@ -371,7 +377,8 @@ do { \
371 } 377 }
372 378
373 if ((lvl & P(LVL, REM_CCE1)) || 379 if ((lvl & P(LVL, REM_CCE1)) ||
374 (lvl & P(LVL, REM_CCE2))) { 380 (lvl & P(LVL, REM_CCE2)) ||
381 mrem) {
375 if (snoop & P(SNOOP, HIT)) 382 if (snoop & P(SNOOP, HIT))
376 stats->rmt_hit++; 383 stats->rmt_hit++;
377 else if (snoop & P(SNOOP, HITM)) 384 else if (snoop & P(SNOOP, HITM))
diff --git a/tools/perf/util/probe-event.c b/tools/perf/util/probe-event.c
index d7cd1142f4c6..b7aaf9b2294d 100644
--- a/tools/perf/util/probe-event.c
+++ b/tools/perf/util/probe-event.c
@@ -2395,7 +2395,7 @@ kprobe_blacklist__find_by_address(struct list_head *blacklist,
2395 struct kprobe_blacklist_node *node; 2395 struct kprobe_blacklist_node *node;
2396 2396
2397 list_for_each_entry(node, blacklist, list) { 2397 list_for_each_entry(node, blacklist, list) {
2398 if (node->start <= address && address <= node->end) 2398 if (node->start <= address && address < node->end)
2399 return node; 2399 return node;
2400 } 2400 }
2401 2401
diff --git a/tools/perf/util/session.c b/tools/perf/util/session.c
index dc453f84a14c..ac863691605f 100644
--- a/tools/perf/util/session.c
+++ b/tools/perf/util/session.c
@@ -1127,6 +1127,30 @@ static void dump_sample(struct perf_evsel *evsel, union perf_event *event,
1127 sample_read__printf(sample, evsel->attr.read_format); 1127 sample_read__printf(sample, evsel->attr.read_format);
1128} 1128}
1129 1129
1130static void dump_read(struct perf_evsel *evsel, union perf_event *event)
1131{
1132 struct read_event *read_event = &event->read;
1133 u64 read_format;
1134
1135 if (!dump_trace)
1136 return;
1137
1138 printf(": %d %d %s %" PRIu64 "\n", event->read.pid, event->read.tid,
1139 evsel ? perf_evsel__name(evsel) : "FAIL",
1140 event->read.value);
1141
1142 read_format = evsel->attr.read_format;
1143
1144 if (read_format & PERF_FORMAT_TOTAL_TIME_ENABLED)
1145 printf("... time enabled : %" PRIu64 "\n", read_event->time_enabled);
1146
1147 if (read_format & PERF_FORMAT_TOTAL_TIME_RUNNING)
1148 printf("... time running : %" PRIu64 "\n", read_event->time_running);
1149
1150 if (read_format & PERF_FORMAT_ID)
1151 printf("... id : %" PRIu64 "\n", read_event->id);
1152}
1153
1130static struct machine *machines__find_for_cpumode(struct machines *machines, 1154static struct machine *machines__find_for_cpumode(struct machines *machines,
1131 union perf_event *event, 1155 union perf_event *event,
1132 struct perf_sample *sample) 1156 struct perf_sample *sample)
@@ -1271,6 +1295,7 @@ static int machines__deliver_event(struct machines *machines,
1271 evlist->stats.total_lost_samples += event->lost_samples.lost; 1295 evlist->stats.total_lost_samples += event->lost_samples.lost;
1272 return tool->lost_samples(tool, event, sample, machine); 1296 return tool->lost_samples(tool, event, sample, machine);
1273 case PERF_RECORD_READ: 1297 case PERF_RECORD_READ:
1298 dump_read(evsel, event);
1274 return tool->read(tool, event, sample, evsel, machine); 1299 return tool->read(tool, event, sample, evsel, machine);
1275 case PERF_RECORD_THROTTLE: 1300 case PERF_RECORD_THROTTLE:
1276 return tool->throttle(tool, event, sample, machine); 1301 return tool->throttle(tool, event, sample, machine);
diff --git a/tools/perf/util/symbol-elf.c b/tools/perf/util/symbol-elf.c
index a70479061fce..5c39f420111e 100644
--- a/tools/perf/util/symbol-elf.c
+++ b/tools/perf/util/symbol-elf.c
@@ -259,7 +259,7 @@ int dso__synthesize_plt_symbols(struct dso *dso, struct symsrc *ss, struct map *
259{ 259{
260 uint32_t nr_rel_entries, idx; 260 uint32_t nr_rel_entries, idx;
261 GElf_Sym sym; 261 GElf_Sym sym;
262 u64 plt_offset; 262 u64 plt_offset, plt_header_size, plt_entry_size;
263 GElf_Shdr shdr_plt; 263 GElf_Shdr shdr_plt;
264 struct symbol *f; 264 struct symbol *f;
265 GElf_Shdr shdr_rel_plt, shdr_dynsym; 265 GElf_Shdr shdr_rel_plt, shdr_dynsym;
@@ -326,6 +326,23 @@ int dso__synthesize_plt_symbols(struct dso *dso, struct symsrc *ss, struct map *
326 326
327 nr_rel_entries = shdr_rel_plt.sh_size / shdr_rel_plt.sh_entsize; 327 nr_rel_entries = shdr_rel_plt.sh_size / shdr_rel_plt.sh_entsize;
328 plt_offset = shdr_plt.sh_offset; 328 plt_offset = shdr_plt.sh_offset;
329 switch (ehdr.e_machine) {
330 case EM_ARM:
331 plt_header_size = 20;
332 plt_entry_size = 12;
333 break;
334
335 case EM_AARCH64:
336 plt_header_size = 32;
337 plt_entry_size = 16;
338 break;
339
340 default: /* FIXME: s390/alpha/mips/parisc/poperpc/sh/sparc/xtensa need to be checked */
341 plt_header_size = shdr_plt.sh_entsize;
342 plt_entry_size = shdr_plt.sh_entsize;
343 break;
344 }
345 plt_offset += plt_header_size;
329 346
330 if (shdr_rel_plt.sh_type == SHT_RELA) { 347 if (shdr_rel_plt.sh_type == SHT_RELA) {
331 GElf_Rela pos_mem, *pos; 348 GElf_Rela pos_mem, *pos;
@@ -335,7 +352,6 @@ int dso__synthesize_plt_symbols(struct dso *dso, struct symsrc *ss, struct map *
335 const char *elf_name = NULL; 352 const char *elf_name = NULL;
336 char *demangled = NULL; 353 char *demangled = NULL;
337 symidx = GELF_R_SYM(pos->r_info); 354 symidx = GELF_R_SYM(pos->r_info);
338 plt_offset += shdr_plt.sh_entsize;
339 gelf_getsym(syms, symidx, &sym); 355 gelf_getsym(syms, symidx, &sym);
340 356
341 elf_name = elf_sym__name(&sym, symstrs); 357 elf_name = elf_sym__name(&sym, symstrs);
@@ -346,11 +362,12 @@ int dso__synthesize_plt_symbols(struct dso *dso, struct symsrc *ss, struct map *
346 "%s@plt", elf_name); 362 "%s@plt", elf_name);
347 free(demangled); 363 free(demangled);
348 364
349 f = symbol__new(plt_offset, shdr_plt.sh_entsize, 365 f = symbol__new(plt_offset, plt_entry_size,
350 STB_GLOBAL, sympltname); 366 STB_GLOBAL, sympltname);
351 if (!f) 367 if (!f)
352 goto out_elf_end; 368 goto out_elf_end;
353 369
370 plt_offset += plt_entry_size;
354 symbols__insert(&dso->symbols[map->type], f); 371 symbols__insert(&dso->symbols[map->type], f);
355 ++nr; 372 ++nr;
356 } 373 }
@@ -361,7 +378,6 @@ int dso__synthesize_plt_symbols(struct dso *dso, struct symsrc *ss, struct map *
361 const char *elf_name = NULL; 378 const char *elf_name = NULL;
362 char *demangled = NULL; 379 char *demangled = NULL;
363 symidx = GELF_R_SYM(pos->r_info); 380 symidx = GELF_R_SYM(pos->r_info);
364 plt_offset += shdr_plt.sh_entsize;
365 gelf_getsym(syms, symidx, &sym); 381 gelf_getsym(syms, symidx, &sym);
366 382
367 elf_name = elf_sym__name(&sym, symstrs); 383 elf_name = elf_sym__name(&sym, symstrs);
@@ -372,11 +388,12 @@ int dso__synthesize_plt_symbols(struct dso *dso, struct symsrc *ss, struct map *
372 "%s@plt", elf_name); 388 "%s@plt", elf_name);
373 free(demangled); 389 free(demangled);
374 390
375 f = symbol__new(plt_offset, shdr_plt.sh_entsize, 391 f = symbol__new(plt_offset, plt_entry_size,
376 STB_GLOBAL, sympltname); 392 STB_GLOBAL, sympltname);
377 if (!f) 393 if (!f)
378 goto out_elf_end; 394 goto out_elf_end;
379 395
396 plt_offset += plt_entry_size;
380 symbols__insert(&dso->symbols[map->type], f); 397 symbols__insert(&dso->symbols[map->type], f);
381 ++nr; 398 ++nr;
382 } 399 }
diff --git a/tools/perf/util/values.c b/tools/perf/util/values.c
index 5de2e15e2eda..8a32bb0095e5 100644
--- a/tools/perf/util/values.c
+++ b/tools/perf/util/values.c
@@ -12,7 +12,7 @@ int perf_read_values_init(struct perf_read_values *values)
12 values->threads_max = 16; 12 values->threads_max = 16;
13 values->pid = malloc(values->threads_max * sizeof(*values->pid)); 13 values->pid = malloc(values->threads_max * sizeof(*values->pid));
14 values->tid = malloc(values->threads_max * sizeof(*values->tid)); 14 values->tid = malloc(values->threads_max * sizeof(*values->tid));
15 values->value = malloc(values->threads_max * sizeof(*values->value)); 15 values->value = zalloc(values->threads_max * sizeof(*values->value));
16 if (!values->pid || !values->tid || !values->value) { 16 if (!values->pid || !values->tid || !values->value) {
17 pr_debug("failed to allocate read_values threads arrays"); 17 pr_debug("failed to allocate read_values threads arrays");
18 goto out_free_pid; 18 goto out_free_pid;
@@ -98,15 +98,16 @@ static int perf_read_values__findnew_thread(struct perf_read_values *values,
98 return i; 98 return i;
99 } 99 }
100 100
101 i = values->threads + 1; 101 i = values->threads;
102 values->value[i] = malloc(values->counters_max * sizeof(**values->value)); 102
103 values->value[i] = zalloc(values->counters_max * sizeof(**values->value));
103 if (!values->value[i]) { 104 if (!values->value[i]) {
104 pr_debug("failed to allocate read_values counters array"); 105 pr_debug("failed to allocate read_values counters array");
105 return -ENOMEM; 106 return -ENOMEM;
106 } 107 }
107 values->pid[i] = pid; 108 values->pid[i] = pid;
108 values->tid[i] = tid; 109 values->tid[i] = tid;
109 values->threads = i; 110 values->threads = i + 1;
110 111
111 return i; 112 return i;
112} 113}
@@ -130,12 +131,16 @@ static int perf_read_values__enlarge_counters(struct perf_read_values *values)
130 131
131 for (i = 0; i < values->threads; i++) { 132 for (i = 0; i < values->threads; i++) {
132 u64 *value = realloc(values->value[i], counters_max * sizeof(**values->value)); 133 u64 *value = realloc(values->value[i], counters_max * sizeof(**values->value));
134 int j;
133 135
134 if (value) { 136 if (!value) {
135 pr_debug("failed to enlarge read_values ->values array"); 137 pr_debug("failed to enlarge read_values ->values array");
136 goto out_free_name; 138 goto out_free_name;
137 } 139 }
138 140
141 for (j = values->counters_max; j < counters_max; j++)
142 value[j] = 0;
143
139 values->value[i] = value; 144 values->value[i] = value;
140 } 145 }
141 146
@@ -187,7 +192,7 @@ int perf_read_values_add_value(struct perf_read_values *values,
187 if (cindex < 0) 192 if (cindex < 0)
188 return cindex; 193 return cindex;
189 194
190 values->value[tindex][cindex] = value; 195 values->value[tindex][cindex] += value;
191 return 0; 196 return 0;
192} 197}
193 198