diff options
author | Ingo Molnar <mingo@kernel.org> | 2017-08-29 17:13:56 -0400 |
---|---|---|
committer | Ingo Molnar <mingo@kernel.org> | 2017-08-29 17:13:56 -0400 |
commit | 1b2f76d77a277bb70d38ad0991ed7f16bbc115a9 (patch) | |
tree | b02f9b167b1c1b9df860f480b45523c70ef52acf /tools/perf | |
parent | 5da382eb6ea37e2c49ef521c636d73f6ecc3fa81 (diff) | |
parent | b2f7605076d6cdd68162c42c34caadafbbe4c69f (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.txt | 4 | ||||
-rw-r--r-- | tools/perf/Makefile.config | 4 | ||||
-rw-r--r-- | tools/perf/Makefile.perf | 26 | ||||
-rw-r--r-- | tools/perf/builtin-report.c | 6 | ||||
-rw-r--r-- | tools/perf/builtin-trace.c | 8 | ||||
-rw-r--r-- | tools/perf/trace/beauty/Build | 1 | ||||
-rw-r--r-- | tools/perf/trace/beauty/beauty.h | 3 | ||||
-rw-r--r-- | tools/perf/trace/beauty/pkey_alloc.c | 50 | ||||
-rwxr-xr-x | tools/perf/trace/beauty/pkey_alloc_access_rights.sh | 10 | ||||
-rw-r--r-- | tools/perf/util/evsel.c | 7 | ||||
-rw-r--r-- | tools/perf/util/intel-pt-decoder/Build | 2 | ||||
-rw-r--r-- | tools/perf/util/mem-events.c | 11 | ||||
-rw-r--r-- | tools/perf/util/probe-event.c | 2 | ||||
-rw-r--r-- | tools/perf/util/session.c | 25 | ||||
-rw-r--r-- | tools/perf/util/symbol-elf.c | 27 | ||||
-rw-r--r-- | tools/perf/util/values.c | 17 |
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 | |||
148 | endif | 148 | endif |
149 | 149 | ||
150 | ifeq ($(DEBUG),0) | 150 | ifeq ($(DEBUG),0) |
151 | ifeq ($(CC), clang) | 151 | ifeq ($(CC_NO_CLANG), 0) |
152 | CFLAGS += -O3 | 152 | CFLAGS += -O3 |
153 | else | 153 | else |
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 | |||
164 | MKDIR = mkdir | 164 | MKDIR = mkdir |
165 | FIND = find | 165 | FIND = find |
166 | INSTALL = install | 166 | INSTALL = install |
167 | FLEX = flex | 167 | FLEX ?= flex |
168 | BISON = bison | 168 | BISON ?= bison |
169 | STRIP = strip | 169 | STRIP = strip |
170 | AWK = awk | 170 | AWK = awk |
171 | 171 | ||
@@ -240,7 +240,7 @@ endif | |||
240 | ifeq ($(FEATURES_DUMP),) | 240 | ifeq ($(FEATURES_DUMP),) |
241 | FEATURE_DUMP_EXPORT := $(realpath $(OUTPUT)FEATURE-DUMP) | 241 | FEATURE_DUMP_EXPORT := $(realpath $(OUTPUT)FEATURE-DUMP) |
242 | else | 242 | else |
243 | FEATURE_DUMP_EXPORT := $(FEATURES_DUMP) | 243 | FEATURE_DUMP_EXPORT := $(realpath $(FEATURES_DUMP)) |
244 | endif | 244 | endif |
245 | 245 | ||
246 | export prefix bindir sharedir sysconfdir DESTDIR | 246 | export prefix bindir sharedir sysconfdir DESTDIR |
@@ -279,7 +279,13 @@ LIBTRACEEVENT = $(TE_PATH)libtraceevent.a | |||
279 | export LIBTRACEEVENT | 279 | export LIBTRACEEVENT |
280 | 280 | ||
281 | LIBTRACEEVENT_DYNAMIC_LIST = $(TE_PATH)libtraceevent-dynamic-list | 281 | LIBTRACEEVENT_DYNAMIC_LIST = $(TE_PATH)libtraceevent-dynamic-list |
282 | LIBTRACEEVENT_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. | ||
287 | DYNAMIC_LIST_LDFLAGS = -Xlinker --dynamic-list=$(LIBTRACEEVENT_DYNAMIC_LIST) | ||
288 | LIBTRACEEVENT_DYNAMIC_LIST_LDFLAGS = $(if $(findstring -static,$(LDFLAGS)),,$(DYNAMIC_LIST_LDFLAGS)) | ||
283 | 289 | ||
284 | LIBAPI = $(API_PATH)libapi.a | 290 | LIBAPI = $(API_PATH)libapi.a |
285 | export LIBAPI | 291 | export LIBAPI |
@@ -381,7 +387,8 @@ export INSTALL SHELL_PATH | |||
381 | 387 | ||
382 | SHELL = $(SHELL_PATH) | 388 | SHELL = $(SHELL_PATH) |
383 | 389 | ||
384 | beauty_ioctl_outdir := $(OUTPUT)trace/beauty/generated/ioctl | 390 | beauty_outdir := $(OUTPUT)trace/beauty/generated |
391 | beauty_ioctl_outdir := $(beauty_outdir)/ioctl | ||
385 | drm_ioctl_array := $(beauty_ioctl_outdir)/drm_ioctl_array.c | 392 | drm_ioctl_array := $(beauty_ioctl_outdir)/drm_ioctl_array.c |
386 | drm_hdr_dir := $(srctree)/tools/include/uapi/drm | 393 | drm_hdr_dir := $(srctree)/tools/include/uapi/drm |
387 | drm_ioctl_tbl := $(srctree)/tools/perf/trace/beauty/drm_ioctl.sh | 394 | drm_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 | ||
402 | pkey_alloc_access_rights_array := $(beauty_outdir)/pkey_alloc_access_rights_array.c | ||
403 | asm_generic_hdr_dir := $(srctree)/tools/include/uapi/asm-generic/ | ||
404 | pkey_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 | |||
395 | sndrv_ctl_ioctl_array := $(beauty_ioctl_outdir)/sndrv_ctl_ioctl_array.c | 409 | sndrv_ctl_ioctl_array := $(beauty_ioctl_outdir)/sndrv_ctl_ioctl_array.c |
396 | sndrv_ctl_hdr_dir := $(srctree)/tools/include/uapi/sound | 410 | sndrv_ctl_hdr_dir := $(srctree)/tools/include/uapi/sound |
397 | sndrv_ctl_ioctl_tbl := $(srctree)/tools/perf/trace/beauty/sndrv_ctl_ioctl.sh | 411 | sndrv_ctl_ioctl_tbl := $(srctree)/tools/perf/trace/beauty/sndrv_ctl_ioctl.sh |
@@ -522,6 +536,7 @@ __build-dir = $(subst $(OUTPUT),,$(dir $@)) | |||
522 | build-dir = $(if $(__build-dir),$(__build-dir),.) | 536 | build-dir = $(if $(__build-dir),$(__build-dir),.) |
523 | 537 | ||
524 | prepare: $(OUTPUT)PERF-VERSION-FILE $(OUTPUT)common-cmds.h archheaders $(drm_ioctl_array) \ | 538 | prepare: $(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 | |||
3 | ifeq ($(SRCARCH),$(filter $(SRCARCH),x86)) | 3 | ifeq ($(SRCARCH),$(filter $(SRCARCH),x86)) |
4 | libperf-y += ioctl.o | 4 | libperf-y += ioctl.o |
5 | endif | 5 | endif |
6 | libperf-y += pkey_alloc.o | ||
6 | libperf-y += statx.o | 7 | libperf-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 | |||
78 | size_t syscall_arg__scnprintf_ioctl_cmd(char *bf, size_t size, struct syscall_arg *arg); | 78 | size_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 | ||
81 | size_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 | |||
81 | size_t syscall_arg__scnprintf_open_flags(char *bf, size_t size, struct syscall_arg *arg); | 84 | size_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 | |||
13 | static 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 | |||
45 | size_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 | |||
3 | header_dir=$1 | ||
4 | |||
5 | printf "static const char *pkey_alloc_access_rights[] = {\n" | ||
6 | regex='^[[:space:]]*#[[:space:]]*define[[:space:]]+PKEY_([[:alnum:]_]+)[[:space:]]+(0x[[:xdigit:]]+)[[:space:]]*' | ||
7 | egrep $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" | ||
10 | printf "};\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 | ||
26 | CFLAGS_intel-pt-insn-decoder.o += -I$(OUTPUT)util/intel-pt-decoder | 26 | CFLAGS_intel-pt-insn-decoder.o += -I$(OUTPUT)util/intel-pt-decoder |
27 | 27 | ||
28 | ifneq ($(CC), clang) | 28 | ifeq ($(CC_NO_CLANG), 1) |
29 | CFLAGS_intel-pt-insn-decoder.o += -Wno-override-init | 29 | CFLAGS_intel-pt-insn-decoder.o += -Wno-override-init |
30 | endif | 30 | endif |
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 | ||
1130 | static 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 | |||
1130 | static struct machine *machines__find_for_cpumode(struct machines *machines, | 1154 | static 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 | ||