perf/core improvements and fixes:
- 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> -----BEGIN PGP SIGNATURE----- iQIzBAABCAAdFiEELb9bqkb7Te0zijNb1lAW81NSqkAFAlmlww4ACgkQ1lAW81NS qkBbjA/+OJ4EJVAZicGw7M8pbgxEI7nis7mVk3I6ezDezynnuA83JYkoqmaN8YU0 iLNo0ScY6DZVBq9ZHN+i3WpifgZ2I186Wb3tvOUvumGQWduDP/dOqZu2GXZZeIpv 2dP94XLaG0MoukE26E+jG2Sjl9ZvdinaM+LXanXIGBnrIv41FoCF9aTDCAEUJZJP 1QZGGDRhxf5yMfPTJzRRUY219Eg+mb6EL1JGi79DDPoeIl07GIQ7gP4/LYvNDDEC 4KDCwzJBb5qbe38x4WWH4bJh2Q2CEKB/zdWeVTAcpwCi6B3OuUbWnNGzPZ8HSGwh eZ5a73/si76Svjhg18fkA/IY1AqdASJohCQIv2jhMvu4outuNlMnXiyxTJpQhNxa RqJeYgTmkFSPwOtlh/WCXK6LvQw867WUCWi+xO4Xy66AtXyvXmy7+H21sxAus1BM U115U4spZJUxjn5jqlyg8FH4EcfujV1yulJ3bfFu5cz3lgJNYZjM6IXvvSewlhA4 3j2gfwHuExRvkWGWcvmF4OypajLBYa6Z0ax9Gdz3NSBtoY4cD6NB5MAFvpbng0+w kQ/eAn6PxxkBJzL2s/N+PBJGa57S1U+tCdhLWjewi5TEZdDJDDQQ/d3O2ECU1OyG 8RmilqNMBAyICr2KpEEYfK4kyqoGSjzukgPb+Rx9EgG+kDeqLYE= =xoPe -----END PGP SIGNATURE----- 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>zero-colors
commit
1b2f76d77a
|
@ -177,7 +177,7 @@
|
|||
#define X86_FEATURE_PERFCTR_NB ( 6*32+24) /* NB performance counter extensions */
|
||||
#define X86_FEATURE_BPEXT (6*32+26) /* data breakpoint extension */
|
||||
#define X86_FEATURE_PTSC ( 6*32+27) /* performance time-stamp counter */
|
||||
#define X86_FEATURE_PERFCTR_L2 ( 6*32+28) /* L2 performance counter extensions */
|
||||
#define X86_FEATURE_PERFCTR_LLC ( 6*32+28) /* Last Level Cache performance counter extensions */
|
||||
#define X86_FEATURE_MWAITX ( 6*32+29) /* MWAIT extension (MONITORX/MWAITX) */
|
||||
|
||||
/*
|
||||
|
@ -196,7 +196,6 @@
|
|||
|
||||
#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 */
|
||||
|
@ -287,7 +286,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 */
|
||||
#define X86_FEATURE_V_VMSAVE_VMLOAD (15*32+15) /* Virtual VMSAVE VMLOAD */
|
||||
|
||||
/* Intel-defined CPU features, CPUID level 0x00000007:0 (ecx), word 16 */
|
||||
#define X86_FEATURE_AVX512VBMI (16*32+ 1) /* AVX512 Vector Bit Manipulation instructions*/
|
||||
|
|
|
@ -21,13 +21,11 @@
|
|||
# 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
|
||||
|
@ -51,7 +49,7 @@
|
|||
#define DISABLED_MASK1 0
|
||||
#define DISABLED_MASK2 0
|
||||
#define DISABLED_MASK3 (DISABLE_CYRIX_ARR|DISABLE_CENTAUR_MCR|DISABLE_K6_MTRR)
|
||||
#define DISABLED_MASK4 (DISABLE_PCID)
|
||||
#define DISABLED_MASK4 0
|
||||
#define DISABLED_MASK5 0
|
||||
#define DISABLED_MASK6 0
|
||||
#define DISABLED_MASK7 0
|
||||
|
|
|
@ -8,7 +8,7 @@ ex:
|
|||
include $(srctree)/tools/build/Makefile.include
|
||||
|
||||
ex: ex-in.o libex-in.o
|
||||
gcc -o $@ $^
|
||||
$(CC) -o $@ $^
|
||||
|
||||
ex.%: fixdep FORCE
|
||||
make -f $(srctree)/tools/build/Makefile.build dir=. $@
|
||||
|
|
|
@ -8,9 +8,9 @@ srctree := $(patsubst %/,%,$(dir $(srctree)))
|
|||
#$(info Determined 'srctree' to be $(srctree))
|
||||
endif
|
||||
|
||||
CC = $(CROSS_COMPILE)gcc
|
||||
AR = $(CROSS_COMPILE)ar
|
||||
LD = $(CROSS_COMPILE)ld
|
||||
CC ?= $(CROSS_COMPILE)gcc
|
||||
AR ?= $(CROSS_COMPILE)ar
|
||||
LD ?= $(CROSS_COMPILE)ld
|
||||
|
||||
MAKEFLAGS += --no-print-directory
|
||||
|
||||
|
@ -19,7 +19,7 @@ LIBFILE = $(OUTPUT)libapi.a
|
|||
CFLAGS := $(EXTRA_WARNINGS) $(EXTRA_CFLAGS)
|
||||
CFLAGS += -ggdb3 -Wall -Wextra -std=gnu99 -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=2 -fPIC
|
||||
|
||||
ifeq ($(CC), clang)
|
||||
ifeq ($(CC_NO_CLANG), 0)
|
||||
CFLAGS += -O3
|
||||
else
|
||||
CFLAGS += -O6
|
||||
|
|
|
@ -21,7 +21,7 @@ LIBFILE = $(OUTPUT)libsubcmd.a
|
|||
CFLAGS := $(EXTRA_WARNINGS) $(EXTRA_CFLAGS)
|
||||
CFLAGS += -ggdb3 -Wall -Wextra -std=gnu99 -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=2 -fPIC
|
||||
|
||||
ifeq ($(CC), clang)
|
||||
ifeq ($(CC_NO_CLANG), 0)
|
||||
CFLAGS += -O3
|
||||
else
|
||||
CFLAGS += -O6
|
||||
|
|
|
@ -41,13 +41,13 @@ report::
|
|||
|
||||
- a symbolically formed event like 'pmu/param1=0x3,param2/' where
|
||||
param1 and param2 are defined as formats for the PMU in
|
||||
/sys/bus/event_sources/devices/<pmu>/format/*
|
||||
/sys/bus/event_source/devices/<pmu>/format/*
|
||||
|
||||
- a symbolically formed event like 'pmu/config=M,config1=N,config2=K/'
|
||||
where M, N, K are numbers (in decimal, hex, octal format).
|
||||
Acceptable values for each of 'config', 'config1' and 'config2'
|
||||
parameters are defined by corresponding entries in
|
||||
/sys/bus/event_sources/devices/<pmu>/format/*
|
||||
/sys/bus/event_source/devices/<pmu>/format/*
|
||||
|
||||
-i::
|
||||
--no-inherit::
|
||||
|
|
|
@ -148,7 +148,7 @@ ifndef DEBUG
|
|||
endif
|
||||
|
||||
ifeq ($(DEBUG),0)
|
||||
ifeq ($(CC), clang)
|
||||
ifeq ($(CC_NO_CLANG), 0)
|
||||
CFLAGS += -O3
|
||||
else
|
||||
CFLAGS += -O6
|
||||
|
@ -184,7 +184,7 @@ ifdef PYTHON_CONFIG
|
|||
PYTHON_EMBED_LDFLAGS := $(call strip-libs,$(PYTHON_EMBED_LDOPTS))
|
||||
PYTHON_EMBED_LIBADD := $(call grep-libs,$(PYTHON_EMBED_LDOPTS)) -lutil
|
||||
PYTHON_EMBED_CCOPTS := $(shell $(PYTHON_CONFIG_SQ) --cflags 2>/dev/null)
|
||||
ifeq ($(CC), clang)
|
||||
ifeq ($(CC_NO_CLANG), 1)
|
||||
PYTHON_EMBED_CCOPTS := $(filter-out -specs=%,$(PYTHON_EMBED_CCOPTS))
|
||||
endif
|
||||
FLAGS_PYTHON_EMBED := $(PYTHON_EMBED_CCOPTS) $(PYTHON_EMBED_LDOPTS)
|
||||
|
|
|
@ -164,8 +164,8 @@ LN = ln -f
|
|||
MKDIR = mkdir
|
||||
FIND = find
|
||||
INSTALL = install
|
||||
FLEX = flex
|
||||
BISON = bison
|
||||
FLEX ?= flex
|
||||
BISON ?= bison
|
||||
STRIP = strip
|
||||
AWK = awk
|
||||
|
||||
|
@ -240,7 +240,7 @@ endif
|
|||
ifeq ($(FEATURES_DUMP),)
|
||||
FEATURE_DUMP_EXPORT := $(realpath $(OUTPUT)FEATURE-DUMP)
|
||||
else
|
||||
FEATURE_DUMP_EXPORT := $(FEATURES_DUMP)
|
||||
FEATURE_DUMP_EXPORT := $(realpath $(FEATURES_DUMP))
|
||||
endif
|
||||
|
||||
export prefix bindir sharedir sysconfdir DESTDIR
|
||||
|
@ -279,7 +279,13 @@ LIBTRACEEVENT = $(TE_PATH)libtraceevent.a
|
|||
export LIBTRACEEVENT
|
||||
|
||||
LIBTRACEEVENT_DYNAMIC_LIST = $(TE_PATH)libtraceevent-dynamic-list
|
||||
LIBTRACEEVENT_DYNAMIC_LIST_LDFLAGS = -Xlinker --dynamic-list=$(LIBTRACEEVENT_DYNAMIC_LIST)
|
||||
|
||||
#
|
||||
# The static build has no dynsym table, so this does not work for
|
||||
# static build. Looks like linker starts to scream about that now
|
||||
# (in Fedora 26) so we need to switch it off for static build.
|
||||
DYNAMIC_LIST_LDFLAGS = -Xlinker --dynamic-list=$(LIBTRACEEVENT_DYNAMIC_LIST)
|
||||
LIBTRACEEVENT_DYNAMIC_LIST_LDFLAGS = $(if $(findstring -static,$(LDFLAGS)),,$(DYNAMIC_LIST_LDFLAGS))
|
||||
|
||||
LIBAPI = $(API_PATH)libapi.a
|
||||
export LIBAPI
|
||||
|
@ -381,7 +387,8 @@ export INSTALL SHELL_PATH
|
|||
|
||||
SHELL = $(SHELL_PATH)
|
||||
|
||||
beauty_ioctl_outdir := $(OUTPUT)trace/beauty/generated/ioctl
|
||||
beauty_outdir := $(OUTPUT)trace/beauty/generated
|
||||
beauty_ioctl_outdir := $(beauty_outdir)/ioctl
|
||||
drm_ioctl_array := $(beauty_ioctl_outdir)/drm_ioctl_array.c
|
||||
drm_hdr_dir := $(srctree)/tools/include/uapi/drm
|
||||
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
|
|||
$(drm_ioctl_array): $(drm_hdr_dir)/drm.h $(drm_hdr_dir)/i915_drm.h $(drm_ioctl_tbl)
|
||||
$(Q)$(SHELL) '$(drm_ioctl_tbl)' $(drm_hdr_dir) > $@
|
||||
|
||||
pkey_alloc_access_rights_array := $(beauty_outdir)/pkey_alloc_access_rights_array.c
|
||||
asm_generic_hdr_dir := $(srctree)/tools/include/uapi/asm-generic/
|
||||
pkey_alloc_access_rights_tbl := $(srctree)/tools/perf/trace/beauty/pkey_alloc_access_rights.sh
|
||||
|
||||
$(pkey_alloc_access_rights_array): $(asm_generic_hdr_dir)/mman-common.h $(pkey_alloc_access_rights_tbl)
|
||||
$(Q)$(SHELL) '$(pkey_alloc_access_rights_tbl)' $(asm_generic_hdr_dir) > $@
|
||||
|
||||
sndrv_ctl_ioctl_array := $(beauty_ioctl_outdir)/sndrv_ctl_ioctl_array.c
|
||||
sndrv_ctl_hdr_dir := $(srctree)/tools/include/uapi/sound
|
||||
sndrv_ctl_ioctl_tbl := $(srctree)/tools/perf/trace/beauty/sndrv_ctl_ioctl.sh
|
||||
|
@ -522,6 +536,7 @@ __build-dir = $(subst $(OUTPUT),,$(dir $@))
|
|||
build-dir = $(if $(__build-dir),$(__build-dir),.)
|
||||
|
||||
prepare: $(OUTPUT)PERF-VERSION-FILE $(OUTPUT)common-cmds.h archheaders $(drm_ioctl_array) \
|
||||
$(pkey_alloc_access_rights_array) \
|
||||
$(sndrv_pcm_ioctl_array) \
|
||||
$(sndrv_ctl_ioctl_array) \
|
||||
$(kvm_ioctl_array) \
|
||||
|
@ -797,6 +812,7 @@ clean:: $(LIBTRACEEVENT)-clean $(LIBAPI)-clean $(LIBBPF)-clean $(LIBSUBCMD)-clea
|
|||
$(OUTPUT)tests/llvm-src-{base,kbuild,prologue,relocation}.c \
|
||||
$(OUTPUT)pmu-events/pmu-events.c \
|
||||
$(OUTPUT)$(drm_ioctl_array) \
|
||||
$(OUTPUT)$(pkey_alloc_access_rights_array) \
|
||||
$(OUTPUT)$(sndrv_ctl_ioctl_array) \
|
||||
$(OUTPUT)$(sndrv_pcm_ioctl_array) \
|
||||
$(OUTPUT)$(kvm_ioctl_array) \
|
||||
|
|
|
@ -241,7 +241,7 @@ static int process_read_event(struct perf_tool *tool,
|
|||
const char *name = evsel ? perf_evsel__name(evsel) : "unknown";
|
||||
int err = perf_read_values_add_value(&rep->show_threads_values,
|
||||
event->read.pid, event->read.tid,
|
||||
event->read.id,
|
||||
evsel->idx,
|
||||
name,
|
||||
event->read.value);
|
||||
|
||||
|
@ -249,10 +249,6 @@ static int process_read_event(struct perf_tool *tool,
|
|||
return err;
|
||||
}
|
||||
|
||||
dump_printf(": %d %d %s %" PRIu64 "\n", event->read.pid, event->read.tid,
|
||||
evsel ? perf_evsel__name(evsel) : "FAIL",
|
||||
event->read.value);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
@ -693,6 +693,14 @@ static struct syscall_fmt {
|
|||
[4] = { .scnprintf = SCA_PERF_FLAGS, /* flags */ }, }, },
|
||||
{ .name = "pipe2",
|
||||
.arg = { [1] = { .scnprintf = SCA_PIPE_FLAGS, /* flags */ }, }, },
|
||||
{ .name = "pkey_alloc",
|
||||
.arg = { [1] = { .scnprintf = SCA_PKEY_ALLOC_ACCESS_RIGHTS, /* access_rights */ }, }, },
|
||||
{ .name = "pkey_free",
|
||||
.arg = { [0] = { .scnprintf = SCA_INT, /* key */ }, }, },
|
||||
{ .name = "pkey_mprotect",
|
||||
.arg = { [0] = { .scnprintf = SCA_HEX, /* start */ },
|
||||
[2] = { .scnprintf = SCA_MMAP_PROT, /* prot */ },
|
||||
[3] = { .scnprintf = SCA_INT, /* pkey */ }, }, },
|
||||
{ .name = "poll", .timeout = true, },
|
||||
{ .name = "ppoll", .timeout = true, },
|
||||
{ .name = "pread", .alias = "pread64", },
|
||||
|
|
|
@ -3,4 +3,5 @@ libperf-y += fcntl.o
|
|||
ifeq ($(SRCARCH),$(filter $(SRCARCH),x86))
|
||||
libperf-y += ioctl.o
|
||||
endif
|
||||
libperf-y += pkey_alloc.o
|
||||
libperf-y += statx.o
|
||||
|
|
|
@ -78,6 +78,9 @@ size_t syscall_arg__scnprintf_fcntl_arg(char *bf, size_t size, struct syscall_ar
|
|||
size_t syscall_arg__scnprintf_ioctl_cmd(char *bf, size_t size, struct syscall_arg *arg);
|
||||
#define SCA_IOCTL_CMD syscall_arg__scnprintf_ioctl_cmd
|
||||
|
||||
size_t syscall_arg__scnprintf_pkey_alloc_access_rights(char *bf, size_t size, struct syscall_arg *arg);
|
||||
#define SCA_PKEY_ALLOC_ACCESS_RIGHTS syscall_arg__scnprintf_pkey_alloc_access_rights
|
||||
|
||||
size_t syscall_arg__scnprintf_open_flags(char *bf, size_t size, struct syscall_arg *arg);
|
||||
#define SCA_OPEN_FLAGS syscall_arg__scnprintf_open_flags
|
||||
|
||||
|
|
|
@ -0,0 +1,50 @@
|
|||
/*
|
||||
* trace/beauty/pkey_alloc.c
|
||||
*
|
||||
* Copyright (C) 2017, Red Hat Inc, Arnaldo Carvalho de Melo <acme@redhat.com>
|
||||
*
|
||||
* Released under the GPL v2. (and only v2, not any later version)
|
||||
*/
|
||||
|
||||
#include "trace/beauty/beauty.h"
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/log2.h>
|
||||
|
||||
static size_t pkey_alloc__scnprintf_access_rights(int access_rights, char *bf, size_t size)
|
||||
{
|
||||
int i, printed = 0;
|
||||
|
||||
#include "trace/beauty/generated/pkey_alloc_access_rights_array.c"
|
||||
static DEFINE_STRARRAY(pkey_alloc_access_rights);
|
||||
|
||||
if (access_rights == 0) {
|
||||
const char *s = strarray__pkey_alloc_access_rights.entries[0];
|
||||
if (s)
|
||||
return scnprintf(bf, size, "%s", s);
|
||||
return scnprintf(bf, size, "%d", 0);
|
||||
}
|
||||
|
||||
for (i = 1; i < strarray__pkey_alloc_access_rights.nr_entries; ++i) {
|
||||
int bit = 1 << (i - 1);
|
||||
|
||||
if (!(access_rights & bit))
|
||||
continue;
|
||||
|
||||
if (printed != 0)
|
||||
printed += scnprintf(bf + printed, size - printed, "|");
|
||||
|
||||
if (strarray__pkey_alloc_access_rights.entries[i] != NULL)
|
||||
printed += scnprintf(bf + printed, size - printed, "%s", strarray__pkey_alloc_access_rights.entries[i]);
|
||||
else
|
||||
printed += scnprintf(bf + printed, size - printed, "0x%#", bit);
|
||||
}
|
||||
|
||||
return printed;
|
||||
}
|
||||
|
||||
size_t syscall_arg__scnprintf_pkey_alloc_access_rights(char *bf, size_t size, struct syscall_arg *arg)
|
||||
{
|
||||
unsigned long cmd = arg->val;
|
||||
|
||||
return pkey_alloc__scnprintf_access_rights(cmd, bf, size);
|
||||
}
|
|
@ -0,0 +1,10 @@
|
|||
#!/bin/sh
|
||||
|
||||
header_dir=$1
|
||||
|
||||
printf "static const char *pkey_alloc_access_rights[] = {\n"
|
||||
regex='^[[:space:]]*#[[:space:]]*define[[:space:]]+PKEY_([[:alnum:]_]+)[[:space:]]+(0x[[:xdigit:]]+)[[:space:]]*'
|
||||
egrep $regex ${header_dir}/mman-common.h | \
|
||||
sed -r "s/$regex/\2 \2 \1/g" | \
|
||||
sort | xargs printf "\t[%s ? (ilog2(%s) + 1) : 0] = \"%s\",\n"
|
||||
printf "};\n"
|
|
@ -902,8 +902,13 @@ void perf_evsel__config(struct perf_evsel *evsel, struct record_opts *opts,
|
|||
if (opts->no_samples)
|
||||
attr->sample_freq = 0;
|
||||
|
||||
if (opts->inherit_stat)
|
||||
if (opts->inherit_stat) {
|
||||
evsel->attr.read_format |=
|
||||
PERF_FORMAT_TOTAL_TIME_ENABLED |
|
||||
PERF_FORMAT_TOTAL_TIME_RUNNING |
|
||||
PERF_FORMAT_ID;
|
||||
attr->inherit_stat = 1;
|
||||
}
|
||||
|
||||
if (opts->sample_address) {
|
||||
perf_evsel__set_sample_bit(evsel, ADDR);
|
||||
|
|
|
@ -25,6 +25,6 @@ $(OUTPUT)util/intel-pt-decoder/intel-pt-insn-decoder.o: util/intel-pt-decoder/in
|
|||
|
||||
CFLAGS_intel-pt-insn-decoder.o += -I$(OUTPUT)util/intel-pt-decoder
|
||||
|
||||
ifneq ($(CC), clang)
|
||||
ifeq ($(CC_NO_CLANG), 1)
|
||||
CFLAGS_intel-pt-insn-decoder.o += -Wno-override-init
|
||||
endif
|
||||
|
|
|
@ -316,6 +316,11 @@ int c2c_decode_stats(struct c2c_stats *stats, struct mem_info *mi)
|
|||
u64 lvl = data_src->mem_lvl;
|
||||
u64 snoop = data_src->mem_snoop;
|
||||
u64 lock = data_src->mem_lock;
|
||||
/*
|
||||
* Skylake might report unknown remote level via this
|
||||
* bit, consider it when evaluating remote HITMs.
|
||||
*/
|
||||
bool mrem = data_src->mem_remote;
|
||||
int err = 0;
|
||||
|
||||
#define HITM_INC(__f) \
|
||||
|
@ -361,7 +366,8 @@ do { \
|
|||
}
|
||||
|
||||
if ((lvl & P(LVL, REM_RAM1)) ||
|
||||
(lvl & P(LVL, REM_RAM2))) {
|
||||
(lvl & P(LVL, REM_RAM2)) ||
|
||||
mrem) {
|
||||
stats->rmt_dram++;
|
||||
if (snoop & P(SNOOP, HIT))
|
||||
stats->ld_shared++;
|
||||
|
@ -371,7 +377,8 @@ do { \
|
|||
}
|
||||
|
||||
if ((lvl & P(LVL, REM_CCE1)) ||
|
||||
(lvl & P(LVL, REM_CCE2))) {
|
||||
(lvl & P(LVL, REM_CCE2)) ||
|
||||
mrem) {
|
||||
if (snoop & P(SNOOP, HIT))
|
||||
stats->rmt_hit++;
|
||||
else if (snoop & P(SNOOP, HITM))
|
||||
|
|
|
@ -2395,7 +2395,7 @@ kprobe_blacklist__find_by_address(struct list_head *blacklist,
|
|||
struct kprobe_blacklist_node *node;
|
||||
|
||||
list_for_each_entry(node, blacklist, list) {
|
||||
if (node->start <= address && address <= node->end)
|
||||
if (node->start <= address && address < node->end)
|
||||
return node;
|
||||
}
|
||||
|
||||
|
|
|
@ -1127,6 +1127,30 @@ static void dump_sample(struct perf_evsel *evsel, union perf_event *event,
|
|||
sample_read__printf(sample, evsel->attr.read_format);
|
||||
}
|
||||
|
||||
static void dump_read(struct perf_evsel *evsel, union perf_event *event)
|
||||
{
|
||||
struct read_event *read_event = &event->read;
|
||||
u64 read_format;
|
||||
|
||||
if (!dump_trace)
|
||||
return;
|
||||
|
||||
printf(": %d %d %s %" PRIu64 "\n", event->read.pid, event->read.tid,
|
||||
evsel ? perf_evsel__name(evsel) : "FAIL",
|
||||
event->read.value);
|
||||
|
||||
read_format = evsel->attr.read_format;
|
||||
|
||||
if (read_format & PERF_FORMAT_TOTAL_TIME_ENABLED)
|
||||
printf("... time enabled : %" PRIu64 "\n", read_event->time_enabled);
|
||||
|
||||
if (read_format & PERF_FORMAT_TOTAL_TIME_RUNNING)
|
||||
printf("... time running : %" PRIu64 "\n", read_event->time_running);
|
||||
|
||||
if (read_format & PERF_FORMAT_ID)
|
||||
printf("... id : %" PRIu64 "\n", read_event->id);
|
||||
}
|
||||
|
||||
static struct machine *machines__find_for_cpumode(struct machines *machines,
|
||||
union perf_event *event,
|
||||
struct perf_sample *sample)
|
||||
|
@ -1271,6 +1295,7 @@ static int machines__deliver_event(struct machines *machines,
|
|||
evlist->stats.total_lost_samples += event->lost_samples.lost;
|
||||
return tool->lost_samples(tool, event, sample, machine);
|
||||
case PERF_RECORD_READ:
|
||||
dump_read(evsel, event);
|
||||
return tool->read(tool, event, sample, evsel, machine);
|
||||
case PERF_RECORD_THROTTLE:
|
||||
return tool->throttle(tool, event, sample, machine);
|
||||
|
|
|
@ -259,7 +259,7 @@ int dso__synthesize_plt_symbols(struct dso *dso, struct symsrc *ss, struct map *
|
|||
{
|
||||
uint32_t nr_rel_entries, idx;
|
||||
GElf_Sym sym;
|
||||
u64 plt_offset;
|
||||
u64 plt_offset, plt_header_size, plt_entry_size;
|
||||
GElf_Shdr shdr_plt;
|
||||
struct symbol *f;
|
||||
GElf_Shdr shdr_rel_plt, shdr_dynsym;
|
||||
|
@ -326,6 +326,23 @@ int dso__synthesize_plt_symbols(struct dso *dso, struct symsrc *ss, struct map *
|
|||
|
||||
nr_rel_entries = shdr_rel_plt.sh_size / shdr_rel_plt.sh_entsize;
|
||||
plt_offset = shdr_plt.sh_offset;
|
||||
switch (ehdr.e_machine) {
|
||||
case EM_ARM:
|
||||
plt_header_size = 20;
|
||||
plt_entry_size = 12;
|
||||
break;
|
||||
|
||||
case EM_AARCH64:
|
||||
plt_header_size = 32;
|
||||
plt_entry_size = 16;
|
||||
break;
|
||||
|
||||
default: /* FIXME: s390/alpha/mips/parisc/poperpc/sh/sparc/xtensa need to be checked */
|
||||
plt_header_size = shdr_plt.sh_entsize;
|
||||
plt_entry_size = shdr_plt.sh_entsize;
|
||||
break;
|
||||
}
|
||||
plt_offset += plt_header_size;
|
||||
|
||||
if (shdr_rel_plt.sh_type == SHT_RELA) {
|
||||
GElf_Rela pos_mem, *pos;
|
||||
|
@ -335,7 +352,6 @@ int dso__synthesize_plt_symbols(struct dso *dso, struct symsrc *ss, struct map *
|
|||
const char *elf_name = NULL;
|
||||
char *demangled = NULL;
|
||||
symidx = GELF_R_SYM(pos->r_info);
|
||||
plt_offset += shdr_plt.sh_entsize;
|
||||
gelf_getsym(syms, symidx, &sym);
|
||||
|
||||
elf_name = elf_sym__name(&sym, symstrs);
|
||||
|
@ -346,11 +362,12 @@ int dso__synthesize_plt_symbols(struct dso *dso, struct symsrc *ss, struct map *
|
|||
"%s@plt", elf_name);
|
||||
free(demangled);
|
||||
|
||||
f = symbol__new(plt_offset, shdr_plt.sh_entsize,
|
||||
f = symbol__new(plt_offset, plt_entry_size,
|
||||
STB_GLOBAL, sympltname);
|
||||
if (!f)
|
||||
goto out_elf_end;
|
||||
|
||||
plt_offset += plt_entry_size;
|
||||
symbols__insert(&dso->symbols[map->type], f);
|
||||
++nr;
|
||||
}
|
||||
|
@ -361,7 +378,6 @@ int dso__synthesize_plt_symbols(struct dso *dso, struct symsrc *ss, struct map *
|
|||
const char *elf_name = NULL;
|
||||
char *demangled = NULL;
|
||||
symidx = GELF_R_SYM(pos->r_info);
|
||||
plt_offset += shdr_plt.sh_entsize;
|
||||
gelf_getsym(syms, symidx, &sym);
|
||||
|
||||
elf_name = elf_sym__name(&sym, symstrs);
|
||||
|
@ -372,11 +388,12 @@ int dso__synthesize_plt_symbols(struct dso *dso, struct symsrc *ss, struct map *
|
|||
"%s@plt", elf_name);
|
||||
free(demangled);
|
||||
|
||||
f = symbol__new(plt_offset, shdr_plt.sh_entsize,
|
||||
f = symbol__new(plt_offset, plt_entry_size,
|
||||
STB_GLOBAL, sympltname);
|
||||
if (!f)
|
||||
goto out_elf_end;
|
||||
|
||||
plt_offset += plt_entry_size;
|
||||
symbols__insert(&dso->symbols[map->type], f);
|
||||
++nr;
|
||||
}
|
||||
|
|
|
@ -12,7 +12,7 @@ int perf_read_values_init(struct perf_read_values *values)
|
|||
values->threads_max = 16;
|
||||
values->pid = malloc(values->threads_max * sizeof(*values->pid));
|
||||
values->tid = malloc(values->threads_max * sizeof(*values->tid));
|
||||
values->value = malloc(values->threads_max * sizeof(*values->value));
|
||||
values->value = zalloc(values->threads_max * sizeof(*values->value));
|
||||
if (!values->pid || !values->tid || !values->value) {
|
||||
pr_debug("failed to allocate read_values threads arrays");
|
||||
goto out_free_pid;
|
||||
|
@ -98,15 +98,16 @@ static int perf_read_values__findnew_thread(struct perf_read_values *values,
|
|||
return i;
|
||||
}
|
||||
|
||||
i = values->threads + 1;
|
||||
values->value[i] = malloc(values->counters_max * sizeof(**values->value));
|
||||
i = values->threads;
|
||||
|
||||
values->value[i] = zalloc(values->counters_max * sizeof(**values->value));
|
||||
if (!values->value[i]) {
|
||||
pr_debug("failed to allocate read_values counters array");
|
||||
return -ENOMEM;
|
||||
}
|
||||
values->pid[i] = pid;
|
||||
values->tid[i] = tid;
|
||||
values->threads = i;
|
||||
values->threads = i + 1;
|
||||
|
||||
return i;
|
||||
}
|
||||
|
@ -130,12 +131,16 @@ static int perf_read_values__enlarge_counters(struct perf_read_values *values)
|
|||
|
||||
for (i = 0; i < values->threads; i++) {
|
||||
u64 *value = realloc(values->value[i], counters_max * sizeof(**values->value));
|
||||
int j;
|
||||
|
||||
if (value) {
|
||||
if (!value) {
|
||||
pr_debug("failed to enlarge read_values ->values array");
|
||||
goto out_free_name;
|
||||
}
|
||||
|
||||
for (j = values->counters_max; j < counters_max; j++)
|
||||
value[j] = 0;
|
||||
|
||||
values->value[i] = value;
|
||||
}
|
||||
|
||||
|
@ -187,7 +192,7 @@ int perf_read_values_add_value(struct perf_read_values *values,
|
|||
if (cindex < 0)
|
||||
return cindex;
|
||||
|
||||
values->value[tindex][cindex] = value;
|
||||
values->value[tindex][cindex] += value;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
@ -39,7 +39,9 @@ EXTRA_WARNINGS += -Wundef
|
|||
EXTRA_WARNINGS += -Wwrite-strings
|
||||
EXTRA_WARNINGS += -Wformat
|
||||
|
||||
ifneq ($(CC), clang)
|
||||
CC_NO_CLANG := $(shell $(CC) -dM -E -x c /dev/null | grep -Fq "__clang__"; echo $$?)
|
||||
|
||||
ifeq ($(CC_NO_CLANG), 1)
|
||||
EXTRA_WARNINGS += -Wstrict-aliasing=3
|
||||
endif
|
||||
|
||||
|
|
Loading…
Reference in New Issue