forked from Minki/linux
perf/core improvements and fixes:
perf list: Jiri Olsa: - Display metric expressions for --details option perf record: Alexey Budankov: - Implement --affinity=node|cpu option, leftover, the other patches in this kit were already applied. perf trace: Arnaldo Carvalho de Melo: - Fix segfaults due to not properly handling negative file descriptor syscall args. - Fix segfault related to the 'waitid' 'options' prefix showing logic. - Filter out 'gnome-terminal*' if it is a parent of 'perf trace', to reduce the syscall feedback loop in system wide sessions. BPF: Song Liu: - Silence "Couldn't synthesize bpf events" warning for EPERM. Build system: Arnaldo Carvalho de Melo: - Fix the test-all.c feature detection fast path that was broken for quite a while leading to longer build times. Event parsing: Jiri Olsa: - Fix legacy events symbol separator parsing cs-etm: Mathieu Poirier: - Fix some error path return errors and plug some memory leaks. - Add proper header file for symbols - Remove unused structure fields. - Modularize auxtrace_buffer fetch, decoder and packet processing loop. Vendor events: Paul Clarke: - Add assorted metrics for the Power8 and Power9 architectures. perf report: Thomas Richter: - Add s390 diagnostic sampling descriptor size Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com> -----BEGIN PGP SIGNATURE----- iHUEABYIAB0WIQR2GiIUctdOfX2qHhGyPKLppCJ+JwUCXGXAjAAKCRCyPKLppCJ+ J5anAP4jGwfNRQdbGpNy1FOm/XbOZP6cA+koPH97ZtelGctmDAEAlpJhglEKFuwq 6EfvI29WLa+OrSK9R+f+q6EDdwjl1gE= =f0aI -----END PGP SIGNATURE----- Merge tag 'perf-core-for-mingo-5.1-20190214' 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: perf list: Jiri Olsa: - Display metric expressions for --details option perf record: Alexey Budankov: - Implement --affinity=node|cpu option, leftover, the other patches in this kit were already applied. perf trace: Arnaldo Carvalho de Melo: - Fix segfaults due to not properly handling negative file descriptor syscall args. - Fix segfault related to the 'waitid' 'options' prefix showing logic. - Filter out 'gnome-terminal*' if it is a parent of 'perf trace', to reduce the syscall feedback loop in system wide sessions. BPF: Song Liu: - Silence "Couldn't synthesize bpf events" warning for EPERM. Build system: Arnaldo Carvalho de Melo: - Fix the test-all.c feature detection fast path that was broken for quite a while leading to longer build times. Event parsing: Jiri Olsa: - Fix legacy events symbol separator parsing cs-etm: Mathieu Poirier: - Fix some error path return errors and plug some memory leaks. - Add proper header file for symbols - Remove unused structure fields. - Modularize auxtrace_buffer fetch, decoder and packet processing loop. Vendor events: Paul Clarke: - Add assorted metrics for the Power8 and Power9 architectures. perf report: Thomas Richter: - Add s390 diagnostic sampling descriptor size Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com> Signed-off-by: Ingo Molnar <mingo@kernel.org>
This commit is contained in:
commit
43f4e6279f
@ -53,10 +53,6 @@ FEATURE_TESTS_BASIC := \
|
||||
libslang \
|
||||
libcrypto \
|
||||
libunwind \
|
||||
libunwind-x86 \
|
||||
libunwind-x86_64 \
|
||||
libunwind-arm \
|
||||
libunwind-aarch64 \
|
||||
pthread-attr-setaffinity-np \
|
||||
pthread-barrier \
|
||||
reallocarray \
|
||||
@ -70,7 +66,6 @@ FEATURE_TESTS_BASIC := \
|
||||
sched_getcpu \
|
||||
sdt \
|
||||
setns \
|
||||
libopencsd \
|
||||
libaio
|
||||
|
||||
# FEATURE_TESTS_BASIC + FEATURE_TESTS_EXTRA is the complete list
|
||||
@ -84,6 +79,11 @@ FEATURE_TESTS_EXTRA := \
|
||||
libbabeltrace \
|
||||
libbfd-liberty \
|
||||
libbfd-liberty-z \
|
||||
libopencsd \
|
||||
libunwind-x86 \
|
||||
libunwind-x86_64 \
|
||||
libunwind-arm \
|
||||
libunwind-aarch64 \
|
||||
libunwind-debug-frame \
|
||||
libunwind-debug-frame-arm \
|
||||
libunwind-debug-frame-aarch64 \
|
||||
|
@ -170,14 +170,14 @@
|
||||
# include "test-setns.c"
|
||||
#undef main
|
||||
|
||||
#define main main_test_libopencsd
|
||||
# include "test-libopencsd.c"
|
||||
#undef main
|
||||
|
||||
#define main main_test_libaio
|
||||
# include "test-libaio.c"
|
||||
#undef main
|
||||
|
||||
#define main main_test_reallocarray
|
||||
# include "test-reallocarray.c"
|
||||
#undef main
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
main_test_libpython();
|
||||
@ -217,8 +217,8 @@ int main(int argc, char *argv[])
|
||||
main_test_sched_getcpu();
|
||||
main_test_sdt();
|
||||
main_test_setns();
|
||||
main_test_libopencsd();
|
||||
main_test_libaio();
|
||||
main_test_reallocarray();
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -8,3 +8,4 @@ int main(void)
|
||||
free(get_current_dir_name());
|
||||
return 0;
|
||||
}
|
||||
#undef _GNU_SOURCE
|
||||
|
@ -7,3 +7,4 @@ int main(void)
|
||||
|
||||
return 0;
|
||||
}
|
||||
#undef _GNU_SOURCE
|
||||
|
@ -6,3 +6,5 @@ int main(void)
|
||||
{
|
||||
return !!reallocarray(NULL, 1, 1);
|
||||
}
|
||||
|
||||
#undef _GNU_SOURCE
|
||||
|
@ -8,3 +8,5 @@ int main(void)
|
||||
{
|
||||
return sched_getcpu();
|
||||
}
|
||||
|
||||
#undef _GNU_SOURCE
|
||||
|
@ -5,3 +5,4 @@ int main(void)
|
||||
{
|
||||
return setns(0, 0);
|
||||
}
|
||||
#undef _GNU_SOURCE
|
||||
|
@ -46,10 +46,10 @@ CFLAGS_builtin-trace.o += -DSTRACE_GROUPS_DIR="BUILD_STR($(STRACE_GROUPS_DIR_
|
||||
CFLAGS_builtin-report.o += -DTIPDIR="BUILD_STR($(tipdir_SQ))"
|
||||
CFLAGS_builtin-report.o += -DDOCDIR="BUILD_STR($(srcdir_SQ)/Documentation)"
|
||||
|
||||
libperf-y += util/
|
||||
libperf-y += arch/
|
||||
libperf-y += ui/
|
||||
libperf-y += scripts/
|
||||
libperf-$(CONFIG_TRACE) += trace/beauty/
|
||||
perf-y += util/
|
||||
perf-y += arch/
|
||||
perf-y += ui/
|
||||
perf-y += scripts/
|
||||
perf-$(CONFIG_TRACE) += trace/beauty/
|
||||
|
||||
gtk-y += ui/gtk/
|
||||
|
@ -454,6 +454,11 @@ Use <n> control blocks in asynchronous (Posix AIO) trace writing mode (default:
|
||||
Asynchronous mode is supported only when linking Perf tool with libc library
|
||||
providing implementation for Posix AIO API.
|
||||
|
||||
--affinity=mode::
|
||||
Set affinity mask of trace reading thread according to the policy defined by 'mode' value:
|
||||
node - thread affinity mask is set to NUMA node cpu mask of the processed mmap buffer
|
||||
cpu - thread affinity mask is set to cpu of the processed mmap buffer
|
||||
|
||||
--all-kernel::
|
||||
Configure all used events to run in kernel space.
|
||||
|
||||
|
@ -109,6 +109,13 @@ FEATURE_CHECK_LDFLAGS-libunwind = $(LIBUNWIND_LDFLAGS) $(LIBUNWIND_LIBS)
|
||||
FEATURE_CHECK_CFLAGS-libunwind-debug-frame = $(LIBUNWIND_CFLAGS)
|
||||
FEATURE_CHECK_LDFLAGS-libunwind-debug-frame = $(LIBUNWIND_LDFLAGS) $(LIBUNWIND_LIBS)
|
||||
|
||||
FEATURE_CHECK_LDFLAGS-libunwind-arm = -lunwind -lunwind-arm
|
||||
FEATURE_CHECK_LDFLAGS-libunwind-aarch64 = -lunwind -lunwind-aarch64
|
||||
FEATURE_CHECK_LDFLAGS-libunwind-x86 = -lunwind -llzma -lunwind-x86
|
||||
FEATURE_CHECK_LDFLAGS-libunwind-x86_64 = -lunwind -llzma -lunwind-x86_64
|
||||
|
||||
FEATURE_CHECK_LDFLAGS-libcrypto = -lcrypto
|
||||
|
||||
ifdef CSINCLUDES
|
||||
LIBOPENCSD_CFLAGS := -I$(CSINCLUDES)
|
||||
endif
|
||||
@ -218,6 +225,8 @@ FEATURE_CHECK_LDFLAGS-libpython := $(PYTHON_EMBED_LDOPTS)
|
||||
FEATURE_CHECK_CFLAGS-libpython-version := $(PYTHON_EMBED_CCOPTS)
|
||||
FEATURE_CHECK_LDFLAGS-libpython-version := $(PYTHON_EMBED_LDOPTS)
|
||||
|
||||
FEATURE_CHECK_LDFLAGS-libaio = -lrt
|
||||
|
||||
CFLAGS += -fno-omit-frame-pointer
|
||||
CFLAGS += -ggdb3
|
||||
CFLAGS += -funwind-tables
|
||||
@ -386,7 +395,8 @@ ifeq ($(feature-setns), 1)
|
||||
$(call detected,CONFIG_SETNS)
|
||||
endif
|
||||
|
||||
ifndef NO_CORESIGHT
|
||||
ifdef CORESIGHT
|
||||
$(call feature_check,libopencsd)
|
||||
ifeq ($(feature-libopencsd), 1)
|
||||
CFLAGS += -DHAVE_CSTRACE_SUPPORT $(LIBOPENCSD_CFLAGS)
|
||||
LDFLAGS += $(LIBOPENCSD_LDFLAGS)
|
||||
@ -482,6 +492,7 @@ endif
|
||||
ifndef NO_LIBUNWIND
|
||||
have_libunwind :=
|
||||
|
||||
$(call feature_check,libunwind-x86)
|
||||
ifeq ($(feature-libunwind-x86), 1)
|
||||
$(call detected,CONFIG_LIBUNWIND_X86)
|
||||
CFLAGS += -DHAVE_LIBUNWIND_X86_SUPPORT
|
||||
@ -490,6 +501,7 @@ ifndef NO_LIBUNWIND
|
||||
have_libunwind = 1
|
||||
endif
|
||||
|
||||
$(call feature_check,libunwind-aarch64)
|
||||
ifeq ($(feature-libunwind-aarch64), 1)
|
||||
$(call detected,CONFIG_LIBUNWIND_AARCH64)
|
||||
CFLAGS += -DHAVE_LIBUNWIND_AARCH64_SUPPORT
|
||||
|
@ -102,7 +102,7 @@ include ../scripts/utilities.mak
|
||||
# When selected, pass LLVM_CONFIG=/path/to/llvm-config to `make' if
|
||||
# llvm-config is not in $PATH.
|
||||
#
|
||||
# Define NO_CORESIGHT if you do not want support for CoreSight trace decoding.
|
||||
# Define CORESIGHT if you DO WANT support for CoreSight trace decoding.
|
||||
#
|
||||
# Define NO_AIO if you do not want support of Posix AIO based trace
|
||||
# streaming for record mode. Currently Posix AIO trace streaming is
|
||||
@ -344,9 +344,9 @@ endif
|
||||
|
||||
export PERL_PATH
|
||||
|
||||
LIB_FILE=$(OUTPUT)libperf.a
|
||||
LIBPERF_A=$(OUTPUT)libperf.a
|
||||
|
||||
PERFLIBS = $(LIB_FILE) $(LIBAPI) $(LIBTRACEEVENT) $(LIBSUBCMD)
|
||||
PERFLIBS = $(LIBAPI) $(LIBTRACEEVENT) $(LIBSUBCMD)
|
||||
ifndef NO_LIBBPF
|
||||
PERFLIBS += $(LIBBPF)
|
||||
endif
|
||||
@ -549,6 +549,8 @@ JEVENTS_IN := $(OUTPUT)pmu-events/jevents-in.o
|
||||
|
||||
PMU_EVENTS_IN := $(OUTPUT)pmu-events/pmu-events-in.o
|
||||
|
||||
LIBPERF_IN := $(OUTPUT)libperf-in.o
|
||||
|
||||
export JEVENTS
|
||||
|
||||
build := -f $(srctree)/tools/build/Makefile.build dir=. obj
|
||||
@ -565,9 +567,12 @@ $(JEVENTS): $(JEVENTS_IN)
|
||||
$(PMU_EVENTS_IN): $(JEVENTS) FORCE
|
||||
$(Q)$(MAKE) -f $(srctree)/tools/build/Makefile.build dir=pmu-events obj=pmu-events
|
||||
|
||||
$(OUTPUT)perf: $(PERFLIBS) $(PERF_IN) $(PMU_EVENTS_IN) $(LIBTRACEEVENT_DYNAMIC_LIST)
|
||||
$(LIBPERF_IN): prepare FORCE
|
||||
$(Q)$(MAKE) $(build)=libperf
|
||||
|
||||
$(OUTPUT)perf: $(PERFLIBS) $(PERF_IN) $(PMU_EVENTS_IN) $(LIBPERF_IN) $(LIBTRACEEVENT_DYNAMIC_LIST)
|
||||
$(QUIET_LINK)$(CC) $(CFLAGS) $(LDFLAGS) $(LIBTRACEEVENT_DYNAMIC_LIST_LDFLAGS) \
|
||||
$(PERF_IN) $(PMU_EVENTS_IN) $(LIBS) -o $@
|
||||
$(PERF_IN) $(PMU_EVENTS_IN) $(LIBPERF_IN) $(LIBS) -o $@
|
||||
|
||||
$(GTK_IN): FORCE
|
||||
$(Q)$(MAKE) $(build)=gtk
|
||||
@ -683,12 +688,7 @@ endif
|
||||
|
||||
$(patsubst perf-%,%.o,$(PROGRAMS)): $(wildcard */*.h)
|
||||
|
||||
LIBPERF_IN := $(OUTPUT)libperf-in.o
|
||||
|
||||
$(LIBPERF_IN): prepare FORCE
|
||||
$(Q)$(MAKE) $(build)=libperf
|
||||
|
||||
$(LIB_FILE): $(LIBPERF_IN)
|
||||
$(LIBPERF_A): $(LIBPERF_IN)
|
||||
$(QUIET_AR)$(RM) $@ && $(AR) rcs $@ $(LIBPERF_IN) $(LIB_OBJS)
|
||||
|
||||
LIBTRACEEVENT_FLAGS += plugin_dir=$(plugindir_SQ) 'EXTRA_CFLAGS=$(EXTRA_CFLAGS)' 'LDFLAGS=$(LDFLAGS)'
|
||||
@ -910,7 +910,7 @@ python-clean:
|
||||
$(python-clean)
|
||||
|
||||
clean:: $(LIBTRACEEVENT)-clean $(LIBAPI)-clean $(LIBBPF)-clean $(LIBSUBCMD)-clean config-clean fixdep-clean python-clean
|
||||
$(call QUIET_CLEAN, core-objs) $(RM) $(LIB_FILE) $(OUTPUT)perf-archive $(OUTPUT)perf-with-kcore $(LANG_BINDINGS)
|
||||
$(call QUIET_CLEAN, core-objs) $(RM) $(LIBPERF_A) $(OUTPUT)perf-archive $(OUTPUT)perf-with-kcore $(LANG_BINDINGS)
|
||||
$(Q)find $(if $(OUTPUT),$(OUTPUT),.) -name '*.o' -delete -o -name '\.*.cmd' -delete -o -name '\.*.d' -delete
|
||||
$(Q)$(RM) $(OUTPUT).config-detected
|
||||
$(call QUIET_CLEAN, core-progs) $(RM) $(ALL_PROGRAMS) perf perf-read-vdso32 perf-read-vdsox32 $(OUTPUT)pmu-events/jevents $(OUTPUT)$(LIBJVMTI).so
|
||||
|
@ -1,2 +1,2 @@
|
||||
libperf-y += common.o
|
||||
libperf-y += $(SRCARCH)/
|
||||
perf-y += common.o
|
||||
perf-y += $(SRCARCH)/
|
||||
|
@ -1,2 +1,2 @@
|
||||
libperf-y += util/
|
||||
libperf-$(CONFIG_DWARF_UNWIND) += tests/
|
||||
perf-y += util/
|
||||
perf-$(CONFIG_DWARF_UNWIND) += tests/
|
||||
|
@ -1,5 +1,5 @@
|
||||
libperf-y += regs_load.o
|
||||
libperf-y += dwarf-unwind.o
|
||||
libperf-y += vectors-page.o
|
||||
perf-y += regs_load.o
|
||||
perf-y += dwarf-unwind.o
|
||||
perf-y += vectors-page.o
|
||||
|
||||
libperf-y += arch-tests.o
|
||||
perf-y += arch-tests.o
|
||||
|
@ -1,6 +1,6 @@
|
||||
libperf-$(CONFIG_DWARF) += dwarf-regs.o
|
||||
perf-$(CONFIG_DWARF) += dwarf-regs.o
|
||||
|
||||
libperf-$(CONFIG_LOCAL_LIBUNWIND) += unwind-libunwind.o
|
||||
libperf-$(CONFIG_LIBDW_DWARF_UNWIND) += unwind-libdw.o
|
||||
perf-$(CONFIG_LOCAL_LIBUNWIND) += unwind-libunwind.o
|
||||
perf-$(CONFIG_LIBDW_DWARF_UNWIND) += unwind-libdw.o
|
||||
|
||||
libperf-$(CONFIG_AUXTRACE) += pmu.o auxtrace.o cs-etm.o
|
||||
perf-$(CONFIG_AUXTRACE) += pmu.o auxtrace.o cs-etm.o
|
||||
|
@ -1,2 +1,2 @@
|
||||
libperf-y += util/
|
||||
libperf-$(CONFIG_DWARF_UNWIND) += tests/
|
||||
perf-y += util/
|
||||
perf-$(CONFIG_DWARF_UNWIND) += tests/
|
||||
|
@ -1,4 +1,4 @@
|
||||
libperf-y += regs_load.o
|
||||
libperf-y += dwarf-unwind.o
|
||||
perf-y += regs_load.o
|
||||
perf-y += dwarf-unwind.o
|
||||
|
||||
libperf-y += arch-tests.o
|
||||
perf-y += arch-tests.o
|
||||
|
@ -1,10 +1,10 @@
|
||||
libperf-y += header.o
|
||||
libperf-y += sym-handling.o
|
||||
libperf-$(CONFIG_DWARF) += dwarf-regs.o
|
||||
libperf-$(CONFIG_LOCAL_LIBUNWIND) += unwind-libunwind.o
|
||||
libperf-$(CONFIG_LIBDW_DWARF_UNWIND) += unwind-libdw.o
|
||||
perf-y += header.o
|
||||
perf-y += sym-handling.o
|
||||
perf-$(CONFIG_DWARF) += dwarf-regs.o
|
||||
perf-$(CONFIG_LOCAL_LIBUNWIND) += unwind-libunwind.o
|
||||
perf-$(CONFIG_LIBDW_DWARF_UNWIND) += unwind-libdw.o
|
||||
|
||||
libperf-$(CONFIG_AUXTRACE) += ../../arm/util/pmu.o \
|
||||
perf-$(CONFIG_AUXTRACE) += ../../arm/util/pmu.o \
|
||||
../../arm/util/auxtrace.o \
|
||||
../../arm/util/cs-etm.o \
|
||||
arm-spe.o
|
||||
|
@ -1 +1 @@
|
||||
libperf-y += util/
|
||||
perf-y += util/
|
||||
|
@ -1 +1 @@
|
||||
libperf-y += header.o
|
||||
perf-y += header.o
|
||||
|
@ -1,2 +1,2 @@
|
||||
libperf-y += util/
|
||||
libperf-y += tests/
|
||||
perf-y += util/
|
||||
perf-y += tests/
|
||||
|
@ -1,4 +1,4 @@
|
||||
libperf-$(CONFIG_DWARF_UNWIND) += regs_load.o
|
||||
libperf-$(CONFIG_DWARF_UNWIND) += dwarf-unwind.o
|
||||
perf-$(CONFIG_DWARF_UNWIND) += regs_load.o
|
||||
perf-$(CONFIG_DWARF_UNWIND) += dwarf-unwind.o
|
||||
|
||||
libperf-y += arch-tests.o
|
||||
perf-y += arch-tests.o
|
||||
|
@ -1,11 +1,11 @@
|
||||
libperf-y += header.o
|
||||
libperf-y += sym-handling.o
|
||||
libperf-y += kvm-stat.o
|
||||
libperf-y += perf_regs.o
|
||||
libperf-y += mem-events.o
|
||||
perf-y += header.o
|
||||
perf-y += sym-handling.o
|
||||
perf-y += kvm-stat.o
|
||||
perf-y += perf_regs.o
|
||||
perf-y += mem-events.o
|
||||
|
||||
libperf-$(CONFIG_DWARF) += dwarf-regs.o
|
||||
libperf-$(CONFIG_DWARF) += skip-callchain-idx.o
|
||||
perf-$(CONFIG_DWARF) += dwarf-regs.o
|
||||
perf-$(CONFIG_DWARF) += skip-callchain-idx.o
|
||||
|
||||
libperf-$(CONFIG_LIBUNWIND) += unwind-libunwind.o
|
||||
libperf-$(CONFIG_LIBDW_DWARF_UNWIND) += unwind-libdw.o
|
||||
perf-$(CONFIG_LIBUNWIND) += unwind-libunwind.o
|
||||
perf-$(CONFIG_LIBDW_DWARF_UNWIND) += unwind-libdw.o
|
||||
|
@ -1 +1 @@
|
||||
libperf-y += util/
|
||||
perf-y += util/
|
||||
|
@ -1,9 +1,9 @@
|
||||
libperf-y += header.o
|
||||
libperf-y += kvm-stat.o
|
||||
perf-y += header.o
|
||||
perf-y += kvm-stat.o
|
||||
|
||||
libperf-$(CONFIG_DWARF) += dwarf-regs.o
|
||||
libperf-$(CONFIG_LIBDW_DWARF_UNWIND) += unwind-libdw.o
|
||||
perf-$(CONFIG_DWARF) += dwarf-regs.o
|
||||
perf-$(CONFIG_LIBDW_DWARF_UNWIND) += unwind-libdw.o
|
||||
|
||||
libperf-y += machine.o
|
||||
perf-y += machine.o
|
||||
|
||||
libperf-$(CONFIG_AUXTRACE) += auxtrace.o
|
||||
perf-$(CONFIG_AUXTRACE) += auxtrace.o
|
||||
|
@ -1 +1 @@
|
||||
libperf-y += util/
|
||||
perf-y += util/
|
||||
|
@ -1 +1 @@
|
||||
libperf-$(CONFIG_DWARF) += dwarf-regs.o
|
||||
perf-$(CONFIG_DWARF) += dwarf-regs.o
|
||||
|
@ -1 +1 @@
|
||||
libperf-y += util/
|
||||
perf-y += util/
|
||||
|
@ -1 +1 @@
|
||||
libperf-$(CONFIG_DWARF) += dwarf-regs.o
|
||||
perf-$(CONFIG_DWARF) += dwarf-regs.o
|
||||
|
@ -1,2 +1,2 @@
|
||||
libperf-y += util/
|
||||
libperf-y += tests/
|
||||
perf-y += util/
|
||||
perf-y += tests/
|
||||
|
@ -1,8 +1,8 @@
|
||||
libperf-$(CONFIG_DWARF_UNWIND) += regs_load.o
|
||||
libperf-$(CONFIG_DWARF_UNWIND) += dwarf-unwind.o
|
||||
perf-$(CONFIG_DWARF_UNWIND) += regs_load.o
|
||||
perf-$(CONFIG_DWARF_UNWIND) += dwarf-unwind.o
|
||||
|
||||
libperf-y += arch-tests.o
|
||||
libperf-y += rdpmc.o
|
||||
libperf-y += perf-time-to-tsc.o
|
||||
libperf-$(CONFIG_AUXTRACE) += insn-x86.o
|
||||
libperf-$(CONFIG_X86_64) += bp-modify.o
|
||||
perf-y += arch-tests.o
|
||||
perf-y += rdpmc.o
|
||||
perf-y += perf-time-to-tsc.o
|
||||
perf-$(CONFIG_AUXTRACE) += insn-x86.o
|
||||
perf-$(CONFIG_X86_64) += bp-modify.o
|
||||
|
@ -1,18 +1,18 @@
|
||||
libperf-y += header.o
|
||||
libperf-y += tsc.o
|
||||
libperf-y += pmu.o
|
||||
libperf-y += kvm-stat.o
|
||||
libperf-y += perf_regs.o
|
||||
libperf-y += group.o
|
||||
libperf-y += machine.o
|
||||
libperf-y += event.o
|
||||
perf-y += header.o
|
||||
perf-y += tsc.o
|
||||
perf-y += pmu.o
|
||||
perf-y += kvm-stat.o
|
||||
perf-y += perf_regs.o
|
||||
perf-y += group.o
|
||||
perf-y += machine.o
|
||||
perf-y += event.o
|
||||
|
||||
libperf-$(CONFIG_DWARF) += dwarf-regs.o
|
||||
libperf-$(CONFIG_BPF_PROLOGUE) += dwarf-regs.o
|
||||
perf-$(CONFIG_DWARF) += dwarf-regs.o
|
||||
perf-$(CONFIG_BPF_PROLOGUE) += dwarf-regs.o
|
||||
|
||||
libperf-$(CONFIG_LOCAL_LIBUNWIND) += unwind-libunwind.o
|
||||
libperf-$(CONFIG_LIBDW_DWARF_UNWIND) += unwind-libdw.o
|
||||
perf-$(CONFIG_LOCAL_LIBUNWIND) += unwind-libunwind.o
|
||||
perf-$(CONFIG_LIBDW_DWARF_UNWIND) += unwind-libdw.o
|
||||
|
||||
libperf-$(CONFIG_AUXTRACE) += auxtrace.o
|
||||
libperf-$(CONFIG_AUXTRACE) += intel-pt.o
|
||||
libperf-$(CONFIG_AUXTRACE) += intel-bts.o
|
||||
perf-$(CONFIG_AUXTRACE) += auxtrace.o
|
||||
perf-$(CONFIG_AUXTRACE) += intel-pt.o
|
||||
perf-$(CONFIG_AUXTRACE) += intel-bts.o
|
||||
|
@ -1 +1 @@
|
||||
libperf-y += util/
|
||||
perf-y += util/
|
||||
|
@ -1 +1 @@
|
||||
libperf-$(CONFIG_DWARF) += dwarf-regs.o
|
||||
perf-$(CONFIG_DWARF) += dwarf-regs.o
|
||||
|
@ -82,9 +82,9 @@ int cmd_list(int argc, const char **argv)
|
||||
else if (strcmp(argv[i], "sdt") == 0)
|
||||
print_sdt_events(NULL, NULL, raw_dump);
|
||||
else if (strcmp(argv[i], "metric") == 0)
|
||||
metricgroup__print(true, false, NULL, raw_dump);
|
||||
metricgroup__print(true, false, NULL, raw_dump, details_flag);
|
||||
else if (strcmp(argv[i], "metricgroup") == 0)
|
||||
metricgroup__print(false, true, NULL, raw_dump);
|
||||
metricgroup__print(false, true, NULL, raw_dump, details_flag);
|
||||
else if ((sep = strchr(argv[i], ':')) != NULL) {
|
||||
int sep_idx;
|
||||
|
||||
@ -102,7 +102,7 @@ int cmd_list(int argc, const char **argv)
|
||||
s[sep_idx] = '\0';
|
||||
print_tracepoint_events(s, s + sep_idx + 1, raw_dump);
|
||||
print_sdt_events(s, s + sep_idx + 1, raw_dump);
|
||||
metricgroup__print(true, true, s, raw_dump);
|
||||
metricgroup__print(true, true, s, raw_dump, details_flag);
|
||||
free(s);
|
||||
} else {
|
||||
if (asprintf(&s, "*%s*", argv[i]) < 0) {
|
||||
@ -119,7 +119,7 @@ int cmd_list(int argc, const char **argv)
|
||||
details_flag);
|
||||
print_tracepoint_events(NULL, s, raw_dump);
|
||||
print_sdt_events(NULL, s, raw_dump);
|
||||
metricgroup__print(true, true, NULL, raw_dump);
|
||||
metricgroup__print(true, true, NULL, raw_dump, details_flag);
|
||||
free(s);
|
||||
}
|
||||
}
|
||||
|
@ -1656,6 +1656,21 @@ static int parse_clockid(const struct option *opt, const char *str, int unset)
|
||||
return -1;
|
||||
}
|
||||
|
||||
static int record__parse_affinity(const struct option *opt, const char *str, int unset)
|
||||
{
|
||||
struct record_opts *opts = (struct record_opts *)opt->value;
|
||||
|
||||
if (unset || !str)
|
||||
return 0;
|
||||
|
||||
if (!strcasecmp(str, "node"))
|
||||
opts->affinity = PERF_AFFINITY_NODE;
|
||||
else if (!strcasecmp(str, "cpu"))
|
||||
opts->affinity = PERF_AFFINITY_CPU;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int record__parse_mmap_pages(const struct option *opt,
|
||||
const char *str,
|
||||
int unset __maybe_unused)
|
||||
@ -1964,6 +1979,9 @@ static struct option __record_options[] = {
|
||||
&nr_cblocks_default, "n", "Use <n> control blocks in asynchronous trace writing mode (default: 1, max: 4)",
|
||||
record__aio_parse),
|
||||
#endif
|
||||
OPT_CALLBACK(0, "affinity", &record.opts, "node|cpu",
|
||||
"Set affinity mask of trace reading thread to NUMA node cpu mask or cpu of processed mmap buffer",
|
||||
record__parse_affinity),
|
||||
OPT_END()
|
||||
};
|
||||
|
||||
|
@ -1041,6 +1041,9 @@ static const size_t trace__entry_str_size = 2048;
|
||||
|
||||
static struct file *thread_trace__files_entry(struct thread_trace *ttrace, int fd)
|
||||
{
|
||||
if (fd < 0)
|
||||
return NULL;
|
||||
|
||||
if (fd > ttrace->files.max) {
|
||||
struct file *nfiles = realloc(ttrace->files.table, (fd + 1) * sizeof(struct file));
|
||||
|
||||
@ -2768,7 +2771,8 @@ static int trace__set_filter_loop_pids(struct trace *trace)
|
||||
if (parent == NULL)
|
||||
break;
|
||||
|
||||
if (!strcmp(thread__comm_str(parent), "sshd")) {
|
||||
if (!strcmp(thread__comm_str(parent), "sshd") ||
|
||||
strstarts(thread__comm_str(parent), "gnome-terminal")) {
|
||||
pids[nr++] = parent->tid;
|
||||
break;
|
||||
}
|
||||
|
2245
tools/perf/pmu-events/arch/powerpc/power8/metrics.json
Normal file
2245
tools/perf/pmu-events/arch/powerpc/power8/metrics.json
Normal file
File diff suppressed because it is too large
Load Diff
1982
tools/perf/pmu-events/arch/powerpc/power9/metrics.json
Normal file
1982
tools/perf/pmu-events/arch/powerpc/power9/metrics.json
Normal file
File diff suppressed because it is too large
Load Diff
@ -1,2 +1,2 @@
|
||||
libperf-$(CONFIG_LIBPERL) += perl/Perf-Trace-Util/
|
||||
libperf-$(CONFIG_LIBPYTHON) += python/Perf-Trace-Util/
|
||||
perf-$(CONFIG_LIBPERL) += perl/Perf-Trace-Util/
|
||||
perf-$(CONFIG_LIBPYTHON) += python/Perf-Trace-Util/
|
||||
|
@ -1,4 +1,4 @@
|
||||
libperf-y += Context.o
|
||||
perf-y += Context.o
|
||||
|
||||
CFLAGS_Context.o += $(PERL_EMBED_CCOPTS) -Wno-redundant-decls -Wno-strict-prototypes
|
||||
CFLAGS_Context.o += -Wno-unused-parameter -Wno-nested-externs -Wno-undef
|
||||
|
@ -1,3 +1,3 @@
|
||||
libperf-y += Context.o
|
||||
perf-y += Context.o
|
||||
|
||||
CFLAGS_Context.o += $(PYTHON_EMBED_CCOPTS) -Wno-redundant-decls -Wno-strict-prototypes -Wno-unused-parameter -Wno-nested-externs
|
||||
|
@ -1330,6 +1330,26 @@ static int test__checkevent_complex_name(struct perf_evlist *evlist)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int test__sym_event_slash(struct perf_evlist *evlist)
|
||||
{
|
||||
struct perf_evsel *evsel = perf_evlist__first(evlist);
|
||||
|
||||
TEST_ASSERT_VAL("wrong type", evsel->attr.type == PERF_TYPE_HARDWARE);
|
||||
TEST_ASSERT_VAL("wrong config", evsel->attr.config == PERF_COUNT_HW_CPU_CYCLES);
|
||||
TEST_ASSERT_VAL("wrong exclude_kernel", evsel->attr.exclude_kernel);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int test__sym_event_dc(struct perf_evlist *evlist)
|
||||
{
|
||||
struct perf_evsel *evsel = perf_evlist__first(evlist);
|
||||
|
||||
TEST_ASSERT_VAL("wrong type", evsel->attr.type == PERF_TYPE_HARDWARE);
|
||||
TEST_ASSERT_VAL("wrong config", evsel->attr.config == PERF_COUNT_HW_CPU_CYCLES);
|
||||
TEST_ASSERT_VAL("wrong exclude_user", evsel->attr.exclude_user);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int count_tracepoints(void)
|
||||
{
|
||||
struct dirent *events_ent;
|
||||
@ -1670,6 +1690,16 @@ static struct evlist_test test__events[] = {
|
||||
.name = "cycles/name='COMPLEX_CYCLES_NAME:orig=cycles,desc=chip-clock-ticks'/Duk",
|
||||
.check = test__checkevent_complex_name,
|
||||
.id = 53
|
||||
},
|
||||
{
|
||||
.name = "cycles//u",
|
||||
.check = test__sym_event_slash,
|
||||
.id = 54,
|
||||
},
|
||||
{
|
||||
.name = "cycles:k",
|
||||
.check = test__sym_event_dc,
|
||||
.id = 55,
|
||||
}
|
||||
};
|
||||
|
||||
|
@ -1,15 +1,15 @@
|
||||
libperf-y += clone.o
|
||||
libperf-y += fcntl.o
|
||||
libperf-y += flock.o
|
||||
perf-y += clone.o
|
||||
perf-y += fcntl.o
|
||||
perf-y += flock.o
|
||||
ifeq ($(SRCARCH),$(filter $(SRCARCH),x86))
|
||||
libperf-y += ioctl.o
|
||||
perf-y += ioctl.o
|
||||
endif
|
||||
libperf-y += kcmp.o
|
||||
libperf-y += mount_flags.o
|
||||
libperf-y += pkey_alloc.o
|
||||
libperf-y += arch_prctl.o
|
||||
libperf-y += prctl.o
|
||||
libperf-y += renameat.o
|
||||
libperf-y += sockaddr.o
|
||||
libperf-y += socket.o
|
||||
libperf-y += statx.o
|
||||
perf-y += kcmp.o
|
||||
perf-y += mount_flags.o
|
||||
perf-y += pkey_alloc.o
|
||||
perf-y += arch_prctl.o
|
||||
perf-y += prctl.o
|
||||
perf-y += renameat.o
|
||||
perf-y += sockaddr.o
|
||||
perf-y += socket.o
|
||||
perf-y += statx.o
|
||||
|
@ -175,7 +175,7 @@ static size_t ioctl__scnprintf_cmd(unsigned long cmd, char *bf, size_t size, boo
|
||||
size_t syscall_arg__scnprintf_ioctl_cmd(char *bf, size_t size, struct syscall_arg *arg)
|
||||
{
|
||||
unsigned long cmd = arg->val;
|
||||
unsigned int fd = syscall_arg__val(arg, 0);
|
||||
int fd = syscall_arg__val(arg, 0);
|
||||
struct file *file = thread__files_entry(arg->thread, fd);
|
||||
|
||||
if (file != NULL) {
|
||||
|
@ -11,7 +11,7 @@ static size_t syscall_arg__scnprintf_waitid_options(char *bf, size_t size,
|
||||
|
||||
#define P_OPTION(n) \
|
||||
if (options & W##n) { \
|
||||
printed += scnprintf(bf + printed, size - printed, "%s%s%s", printed ? "|" : "", show_prefix ? prefix : #n); \
|
||||
printed += scnprintf(bf + printed, size - printed, "%s%s%s", printed ? "|" : "", show_prefix ? prefix : "", #n); \
|
||||
options &= ~W##n; \
|
||||
}
|
||||
|
||||
|
@ -1,14 +1,14 @@
|
||||
libperf-y += setup.o
|
||||
libperf-y += helpline.o
|
||||
libperf-y += progress.o
|
||||
libperf-y += util.o
|
||||
libperf-y += hist.o
|
||||
libperf-y += stdio/hist.o
|
||||
perf-y += setup.o
|
||||
perf-y += helpline.o
|
||||
perf-y += progress.o
|
||||
perf-y += util.o
|
||||
perf-y += hist.o
|
||||
perf-y += stdio/hist.o
|
||||
|
||||
CFLAGS_setup.o += -DLIBDIR="BUILD_STR($(LIBDIR))"
|
||||
|
||||
libperf-$(CONFIG_SLANG) += browser.o
|
||||
libperf-$(CONFIG_SLANG) += browsers/
|
||||
libperf-$(CONFIG_SLANG) += tui/
|
||||
perf-$(CONFIG_SLANG) += browser.o
|
||||
perf-$(CONFIG_SLANG) += browsers/
|
||||
perf-$(CONFIG_SLANG) += tui/
|
||||
|
||||
CFLAGS_browser.o += -DENABLE_SLFUTURE_CONST
|
||||
|
@ -1,8 +1,8 @@
|
||||
libperf-y += annotate.o
|
||||
libperf-y += hists.o
|
||||
libperf-y += map.o
|
||||
libperf-y += scripts.o
|
||||
libperf-y += header.o
|
||||
perf-y += annotate.o
|
||||
perf-y += hists.o
|
||||
perf-y += map.o
|
||||
perf-y += scripts.o
|
||||
perf-y += header.o
|
||||
|
||||
CFLAGS_annotate.o += -DENABLE_SLFUTURE_CONST
|
||||
CFLAGS_hists.o += -DENABLE_SLFUTURE_CONST
|
||||
|
@ -1,4 +1,4 @@
|
||||
libperf-y += setup.o
|
||||
libperf-y += util.o
|
||||
libperf-y += helpline.o
|
||||
libperf-y += progress.o
|
||||
perf-y += setup.o
|
||||
perf-y += util.o
|
||||
perf-y += helpline.o
|
||||
perf-y += progress.o
|
||||
|
@ -1,162 +1,162 @@
|
||||
libperf-y += annotate.o
|
||||
libperf-y += block-range.o
|
||||
libperf-y += build-id.o
|
||||
libperf-y += config.o
|
||||
libperf-y += ctype.o
|
||||
libperf-y += db-export.o
|
||||
libperf-y += env.o
|
||||
libperf-y += event.o
|
||||
libperf-y += evlist.o
|
||||
libperf-y += evsel.o
|
||||
libperf-y += evsel_fprintf.o
|
||||
libperf-y += find_bit.o
|
||||
libperf-y += get_current_dir_name.o
|
||||
libperf-y += kallsyms.o
|
||||
libperf-y += levenshtein.o
|
||||
libperf-y += llvm-utils.o
|
||||
libperf-y += mmap.o
|
||||
libperf-y += memswap.o
|
||||
libperf-y += parse-events.o
|
||||
libperf-y += perf_regs.o
|
||||
libperf-y += path.o
|
||||
libperf-y += print_binary.o
|
||||
libperf-y += rbtree.o
|
||||
libperf-y += libstring.o
|
||||
libperf-y += bitmap.o
|
||||
libperf-y += hweight.o
|
||||
libperf-y += smt.o
|
||||
libperf-y += strbuf.o
|
||||
libperf-y += string.o
|
||||
libperf-y += strlist.o
|
||||
libperf-y += strfilter.o
|
||||
libperf-y += top.o
|
||||
libperf-y += usage.o
|
||||
libperf-y += dso.o
|
||||
libperf-y += symbol.o
|
||||
libperf-y += symbol_fprintf.o
|
||||
libperf-y += color.o
|
||||
libperf-y += color_config.o
|
||||
libperf-y += metricgroup.o
|
||||
libperf-y += header.o
|
||||
libperf-y += callchain.o
|
||||
libperf-y += values.o
|
||||
libperf-y += debug.o
|
||||
libperf-y += machine.o
|
||||
libperf-y += map.o
|
||||
libperf-y += pstack.o
|
||||
libperf-y += session.o
|
||||
libperf-y += sample-raw.o
|
||||
libperf-y += s390-sample-raw.o
|
||||
libperf-$(CONFIG_TRACE) += syscalltbl.o
|
||||
libperf-y += ordered-events.o
|
||||
libperf-y += namespaces.o
|
||||
libperf-y += comm.o
|
||||
libperf-y += thread.o
|
||||
libperf-y += thread_map.o
|
||||
libperf-y += trace-event-parse.o
|
||||
libperf-y += parse-events-flex.o
|
||||
libperf-y += parse-events-bison.o
|
||||
libperf-y += pmu.o
|
||||
libperf-y += pmu-flex.o
|
||||
libperf-y += pmu-bison.o
|
||||
libperf-y += trace-event-read.o
|
||||
libperf-y += trace-event-info.o
|
||||
libperf-y += trace-event-scripting.o
|
||||
libperf-y += trace-event.o
|
||||
libperf-y += svghelper.o
|
||||
libperf-y += sort.o
|
||||
libperf-y += hist.o
|
||||
libperf-y += util.o
|
||||
libperf-y += xyarray.o
|
||||
libperf-y += cpumap.o
|
||||
libperf-y += cgroup.o
|
||||
libperf-y += target.o
|
||||
libperf-y += rblist.o
|
||||
libperf-y += intlist.o
|
||||
libperf-y += vdso.o
|
||||
libperf-y += counts.o
|
||||
libperf-y += stat.o
|
||||
libperf-y += stat-shadow.o
|
||||
libperf-y += stat-display.o
|
||||
libperf-y += record.o
|
||||
libperf-y += srcline.o
|
||||
libperf-y += srccode.o
|
||||
libperf-y += data.o
|
||||
libperf-y += tsc.o
|
||||
libperf-y += cloexec.o
|
||||
libperf-y += call-path.o
|
||||
libperf-y += rwsem.o
|
||||
libperf-y += thread-stack.o
|
||||
libperf-$(CONFIG_AUXTRACE) += auxtrace.o
|
||||
libperf-$(CONFIG_AUXTRACE) += intel-pt-decoder/
|
||||
libperf-$(CONFIG_AUXTRACE) += intel-pt.o
|
||||
libperf-$(CONFIG_AUXTRACE) += intel-bts.o
|
||||
libperf-$(CONFIG_AUXTRACE) += arm-spe.o
|
||||
libperf-$(CONFIG_AUXTRACE) += arm-spe-pkt-decoder.o
|
||||
libperf-$(CONFIG_AUXTRACE) += s390-cpumsf.o
|
||||
perf-y += annotate.o
|
||||
perf-y += block-range.o
|
||||
perf-y += build-id.o
|
||||
perf-y += config.o
|
||||
perf-y += ctype.o
|
||||
perf-y += db-export.o
|
||||
perf-y += env.o
|
||||
perf-y += event.o
|
||||
perf-y += evlist.o
|
||||
perf-y += evsel.o
|
||||
perf-y += evsel_fprintf.o
|
||||
perf-y += find_bit.o
|
||||
perf-y += get_current_dir_name.o
|
||||
perf-y += kallsyms.o
|
||||
perf-y += levenshtein.o
|
||||
perf-y += llvm-utils.o
|
||||
perf-y += mmap.o
|
||||
perf-y += memswap.o
|
||||
perf-y += parse-events.o
|
||||
perf-y += perf_regs.o
|
||||
perf-y += path.o
|
||||
perf-y += print_binary.o
|
||||
perf-y += rbtree.o
|
||||
perf-y += libstring.o
|
||||
perf-y += bitmap.o
|
||||
perf-y += hweight.o
|
||||
perf-y += smt.o
|
||||
perf-y += strbuf.o
|
||||
perf-y += string.o
|
||||
perf-y += strlist.o
|
||||
perf-y += strfilter.o
|
||||
perf-y += top.o
|
||||
perf-y += usage.o
|
||||
perf-y += dso.o
|
||||
perf-y += symbol.o
|
||||
perf-y += symbol_fprintf.o
|
||||
perf-y += color.o
|
||||
perf-y += color_config.o
|
||||
perf-y += metricgroup.o
|
||||
perf-y += header.o
|
||||
perf-y += callchain.o
|
||||
perf-y += values.o
|
||||
perf-y += debug.o
|
||||
perf-y += machine.o
|
||||
perf-y += map.o
|
||||
perf-y += pstack.o
|
||||
perf-y += session.o
|
||||
perf-y += sample-raw.o
|
||||
perf-y += s390-sample-raw.o
|
||||
perf-$(CONFIG_TRACE) += syscalltbl.o
|
||||
perf-y += ordered-events.o
|
||||
perf-y += namespaces.o
|
||||
perf-y += comm.o
|
||||
perf-y += thread.o
|
||||
perf-y += thread_map.o
|
||||
perf-y += trace-event-parse.o
|
||||
perf-y += parse-events-flex.o
|
||||
perf-y += parse-events-bison.o
|
||||
perf-y += pmu.o
|
||||
perf-y += pmu-flex.o
|
||||
perf-y += pmu-bison.o
|
||||
perf-y += trace-event-read.o
|
||||
perf-y += trace-event-info.o
|
||||
perf-y += trace-event-scripting.o
|
||||
perf-y += trace-event.o
|
||||
perf-y += svghelper.o
|
||||
perf-y += sort.o
|
||||
perf-y += hist.o
|
||||
perf-y += util.o
|
||||
perf-y += xyarray.o
|
||||
perf-y += cpumap.o
|
||||
perf-y += cgroup.o
|
||||
perf-y += target.o
|
||||
perf-y += rblist.o
|
||||
perf-y += intlist.o
|
||||
perf-y += vdso.o
|
||||
perf-y += counts.o
|
||||
perf-y += stat.o
|
||||
perf-y += stat-shadow.o
|
||||
perf-y += stat-display.o
|
||||
perf-y += record.o
|
||||
perf-y += srcline.o
|
||||
perf-y += srccode.o
|
||||
perf-y += data.o
|
||||
perf-y += tsc.o
|
||||
perf-y += cloexec.o
|
||||
perf-y += call-path.o
|
||||
perf-y += rwsem.o
|
||||
perf-y += thread-stack.o
|
||||
perf-$(CONFIG_AUXTRACE) += auxtrace.o
|
||||
perf-$(CONFIG_AUXTRACE) += intel-pt-decoder/
|
||||
perf-$(CONFIG_AUXTRACE) += intel-pt.o
|
||||
perf-$(CONFIG_AUXTRACE) += intel-bts.o
|
||||
perf-$(CONFIG_AUXTRACE) += arm-spe.o
|
||||
perf-$(CONFIG_AUXTRACE) += arm-spe-pkt-decoder.o
|
||||
perf-$(CONFIG_AUXTRACE) += s390-cpumsf.o
|
||||
|
||||
ifdef CONFIG_LIBOPENCSD
|
||||
libperf-$(CONFIG_AUXTRACE) += cs-etm.o
|
||||
libperf-$(CONFIG_AUXTRACE) += cs-etm-decoder/
|
||||
perf-$(CONFIG_AUXTRACE) += cs-etm.o
|
||||
perf-$(CONFIG_AUXTRACE) += cs-etm-decoder/
|
||||
endif
|
||||
|
||||
libperf-y += parse-branch-options.o
|
||||
libperf-y += dump-insn.o
|
||||
libperf-y += parse-regs-options.o
|
||||
libperf-y += term.o
|
||||
libperf-y += help-unknown-cmd.o
|
||||
libperf-y += mem-events.o
|
||||
libperf-y += vsprintf.o
|
||||
libperf-y += units.o
|
||||
libperf-y += time-utils.o
|
||||
libperf-y += expr-bison.o
|
||||
libperf-y += branch.o
|
||||
libperf-y += mem2node.o
|
||||
perf-y += parse-branch-options.o
|
||||
perf-y += dump-insn.o
|
||||
perf-y += parse-regs-options.o
|
||||
perf-y += term.o
|
||||
perf-y += help-unknown-cmd.o
|
||||
perf-y += mem-events.o
|
||||
perf-y += vsprintf.o
|
||||
perf-y += units.o
|
||||
perf-y += time-utils.o
|
||||
perf-y += expr-bison.o
|
||||
perf-y += branch.o
|
||||
perf-y += mem2node.o
|
||||
|
||||
libperf-$(CONFIG_LIBBPF) += bpf-loader.o
|
||||
libperf-$(CONFIG_BPF_PROLOGUE) += bpf-prologue.o
|
||||
libperf-$(CONFIG_LIBELF) += symbol-elf.o
|
||||
libperf-$(CONFIG_LIBELF) += probe-file.o
|
||||
libperf-$(CONFIG_LIBELF) += probe-event.o
|
||||
perf-$(CONFIG_LIBBPF) += bpf-loader.o
|
||||
perf-$(CONFIG_BPF_PROLOGUE) += bpf-prologue.o
|
||||
perf-$(CONFIG_LIBELF) += symbol-elf.o
|
||||
perf-$(CONFIG_LIBELF) += probe-file.o
|
||||
perf-$(CONFIG_LIBELF) += probe-event.o
|
||||
|
||||
ifndef CONFIG_LIBELF
|
||||
libperf-y += symbol-minimal.o
|
||||
perf-y += symbol-minimal.o
|
||||
endif
|
||||
|
||||
ifndef CONFIG_SETNS
|
||||
libperf-y += setns.o
|
||||
perf-y += setns.o
|
||||
endif
|
||||
|
||||
libperf-$(CONFIG_DWARF) += probe-finder.o
|
||||
libperf-$(CONFIG_DWARF) += dwarf-aux.o
|
||||
libperf-$(CONFIG_DWARF) += dwarf-regs.o
|
||||
perf-$(CONFIG_DWARF) += probe-finder.o
|
||||
perf-$(CONFIG_DWARF) += dwarf-aux.o
|
||||
perf-$(CONFIG_DWARF) += dwarf-regs.o
|
||||
|
||||
libperf-$(CONFIG_LIBDW_DWARF_UNWIND) += unwind-libdw.o
|
||||
libperf-$(CONFIG_LOCAL_LIBUNWIND) += unwind-libunwind-local.o
|
||||
libperf-$(CONFIG_LIBUNWIND) += unwind-libunwind.o
|
||||
libperf-$(CONFIG_LIBUNWIND_X86) += libunwind/x86_32.o
|
||||
libperf-$(CONFIG_LIBUNWIND_AARCH64) += libunwind/arm64.o
|
||||
perf-$(CONFIG_LIBDW_DWARF_UNWIND) += unwind-libdw.o
|
||||
perf-$(CONFIG_LOCAL_LIBUNWIND) += unwind-libunwind-local.o
|
||||
perf-$(CONFIG_LIBUNWIND) += unwind-libunwind.o
|
||||
perf-$(CONFIG_LIBUNWIND_X86) += libunwind/x86_32.o
|
||||
perf-$(CONFIG_LIBUNWIND_AARCH64) += libunwind/arm64.o
|
||||
|
||||
libperf-$(CONFIG_LIBBABELTRACE) += data-convert-bt.o
|
||||
perf-$(CONFIG_LIBBABELTRACE) += data-convert-bt.o
|
||||
|
||||
libperf-y += scripting-engines/
|
||||
perf-y += scripting-engines/
|
||||
|
||||
libperf-$(CONFIG_ZLIB) += zlib.o
|
||||
libperf-$(CONFIG_LZMA) += lzma.o
|
||||
libperf-y += demangle-java.o
|
||||
libperf-y += demangle-rust.o
|
||||
perf-$(CONFIG_ZLIB) += zlib.o
|
||||
perf-$(CONFIG_LZMA) += lzma.o
|
||||
perf-y += demangle-java.o
|
||||
perf-y += demangle-rust.o
|
||||
|
||||
ifdef CONFIG_JITDUMP
|
||||
libperf-$(CONFIG_LIBELF) += jitdump.o
|
||||
libperf-$(CONFIG_LIBELF) += genelf.o
|
||||
libperf-$(CONFIG_DWARF) += genelf_debug.o
|
||||
perf-$(CONFIG_LIBELF) += jitdump.o
|
||||
perf-$(CONFIG_LIBELF) += genelf.o
|
||||
perf-$(CONFIG_DWARF) += genelf_debug.o
|
||||
endif
|
||||
|
||||
libperf-y += perf-hooks.o
|
||||
perf-y += perf-hooks.o
|
||||
|
||||
libperf-$(CONFIG_LIBBPF) += bpf-event.o
|
||||
perf-$(CONFIG_LIBBPF) += bpf-event.o
|
||||
|
||||
libperf-$(CONFIG_CXX) += c++/
|
||||
perf-$(CONFIG_CXX) += c++/
|
||||
|
||||
CFLAGS_config.o += -DETC_PERFCONFIG="BUILD_STR($(ETC_PERFCONFIG_SQ))"
|
||||
CFLAGS_llvm-utils.o += -DPERF_INCLUDE_DIR="BUILD_STR($(perf_include_dir_SQ))"
|
||||
|
@ -236,8 +236,8 @@ int perf_event__synthesize_bpf_events(struct perf_tool *tool,
|
||||
pr_debug("%s: can't get next program: %s%s",
|
||||
__func__, strerror(errno),
|
||||
errno == EINVAL ? " -- kernel too old?" : "");
|
||||
/* don't report error on old kernel */
|
||||
err = (errno == EINVAL) ? 0 : -1;
|
||||
/* don't report error on old kernel or EPERM */
|
||||
err = (errno == EINVAL || errno == EPERM) ? 0 : -1;
|
||||
break;
|
||||
}
|
||||
fd = bpf_prog_get_fd_by_id(id);
|
||||
|
@ -1,2 +1,2 @@
|
||||
libperf-$(CONFIG_CLANGLLVM) += clang.o
|
||||
libperf-$(CONFIG_CLANGLLVM) += clang-test.o
|
||||
perf-$(CONFIG_CLANGLLVM) += clang.o
|
||||
perf-$(CONFIG_CLANGLLVM) += clang-test.o
|
||||
|
@ -1 +1 @@
|
||||
libperf-$(CONFIG_AUXTRACE) += cs-etm-decoder.o
|
||||
perf-$(CONFIG_AUXTRACE) += cs-etm-decoder.o
|
||||
|
@ -15,13 +15,6 @@
|
||||
|
||||
struct cs_etm_decoder;
|
||||
|
||||
struct cs_etm_buffer {
|
||||
const unsigned char *buf;
|
||||
size_t len;
|
||||
u64 offset;
|
||||
u64 ref_timestamp;
|
||||
};
|
||||
|
||||
enum cs_etm_sample_type {
|
||||
CS_ETM_EMPTY,
|
||||
CS_ETM_RANGE,
|
||||
@ -105,9 +98,10 @@ enum {
|
||||
CS_ETM_PROTO_PTM,
|
||||
};
|
||||
|
||||
enum {
|
||||
enum cs_etm_decoder_operation {
|
||||
CS_ETM_OPERATION_PRINT = 1,
|
||||
CS_ETM_OPERATION_DECODE,
|
||||
CS_ETM_OPERATION_MAX,
|
||||
};
|
||||
|
||||
int cs_etm_decoder__process_data_block(struct cs_etm_decoder *decoder,
|
||||
|
@ -25,6 +25,7 @@
|
||||
#include "machine.h"
|
||||
#include "map.h"
|
||||
#include "perf.h"
|
||||
#include "symbol.h"
|
||||
#include "thread.h"
|
||||
#include "thread_map.h"
|
||||
#include "thread-stack.h"
|
||||
@ -64,13 +65,10 @@ struct cs_etm_queue {
|
||||
struct thread *thread;
|
||||
struct cs_etm_decoder *decoder;
|
||||
struct auxtrace_buffer *buffer;
|
||||
const struct cs_etm_state *state;
|
||||
union perf_event *event_buf;
|
||||
unsigned int queue_nr;
|
||||
pid_t pid, tid;
|
||||
int cpu;
|
||||
u64 time;
|
||||
u64 timestamp;
|
||||
u64 offset;
|
||||
u64 period_instructions;
|
||||
struct branch_stack *last_branch;
|
||||
@ -78,11 +76,13 @@ struct cs_etm_queue {
|
||||
size_t last_branch_pos;
|
||||
struct cs_etm_packet *prev_packet;
|
||||
struct cs_etm_packet *packet;
|
||||
const unsigned char *buf;
|
||||
size_t buf_len, buf_used;
|
||||
};
|
||||
|
||||
static int cs_etm__update_queues(struct cs_etm_auxtrace *etm);
|
||||
static int cs_etm__process_timeless_queues(struct cs_etm_auxtrace *etm,
|
||||
pid_t tid, u64 time_);
|
||||
pid_t tid);
|
||||
|
||||
/* PTMs ETMIDR [11:8] set to b0011 */
|
||||
#define ETMIDR_PTM_VERSION 0x00000300
|
||||
@ -138,10 +138,83 @@ static void cs_etm__packet_dump(const char *pkt_string)
|
||||
fflush(stdout);
|
||||
}
|
||||
|
||||
static void cs_etm__set_trace_param_etmv3(struct cs_etm_trace_params *t_params,
|
||||
struct cs_etm_auxtrace *etm, int idx,
|
||||
u32 etmidr)
|
||||
{
|
||||
u64 **metadata = etm->metadata;
|
||||
|
||||
t_params[idx].protocol = cs_etm__get_v7_protocol_version(etmidr);
|
||||
t_params[idx].etmv3.reg_ctrl = metadata[idx][CS_ETM_ETMCR];
|
||||
t_params[idx].etmv3.reg_trc_id = metadata[idx][CS_ETM_ETMTRACEIDR];
|
||||
}
|
||||
|
||||
static void cs_etm__set_trace_param_etmv4(struct cs_etm_trace_params *t_params,
|
||||
struct cs_etm_auxtrace *etm, int idx)
|
||||
{
|
||||
u64 **metadata = etm->metadata;
|
||||
|
||||
t_params[idx].protocol = CS_ETM_PROTO_ETMV4i;
|
||||
t_params[idx].etmv4.reg_idr0 = metadata[idx][CS_ETMV4_TRCIDR0];
|
||||
t_params[idx].etmv4.reg_idr1 = metadata[idx][CS_ETMV4_TRCIDR1];
|
||||
t_params[idx].etmv4.reg_idr2 = metadata[idx][CS_ETMV4_TRCIDR2];
|
||||
t_params[idx].etmv4.reg_idr8 = metadata[idx][CS_ETMV4_TRCIDR8];
|
||||
t_params[idx].etmv4.reg_configr = metadata[idx][CS_ETMV4_TRCCONFIGR];
|
||||
t_params[idx].etmv4.reg_traceidr = metadata[idx][CS_ETMV4_TRCTRACEIDR];
|
||||
}
|
||||
|
||||
static int cs_etm__init_trace_params(struct cs_etm_trace_params *t_params,
|
||||
struct cs_etm_auxtrace *etm)
|
||||
{
|
||||
int i;
|
||||
u32 etmidr;
|
||||
u64 architecture;
|
||||
|
||||
for (i = 0; i < etm->num_cpu; i++) {
|
||||
architecture = etm->metadata[i][CS_ETM_MAGIC];
|
||||
|
||||
switch (architecture) {
|
||||
case __perf_cs_etmv3_magic:
|
||||
etmidr = etm->metadata[i][CS_ETM_ETMIDR];
|
||||
cs_etm__set_trace_param_etmv3(t_params, etm, i, etmidr);
|
||||
break;
|
||||
case __perf_cs_etmv4_magic:
|
||||
cs_etm__set_trace_param_etmv4(t_params, etm, i);
|
||||
break;
|
||||
default:
|
||||
return -EINVAL;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int cs_etm__init_decoder_params(struct cs_etm_decoder_params *d_params,
|
||||
struct cs_etm_queue *etmq,
|
||||
enum cs_etm_decoder_operation mode)
|
||||
{
|
||||
int ret = -EINVAL;
|
||||
|
||||
if (!(mode < CS_ETM_OPERATION_MAX))
|
||||
goto out;
|
||||
|
||||
d_params->packet_printer = cs_etm__packet_dump;
|
||||
d_params->operation = mode;
|
||||
d_params->data = etmq;
|
||||
d_params->formatted = true;
|
||||
d_params->fsyncs = false;
|
||||
d_params->hsyncs = false;
|
||||
d_params->frame_aligned = true;
|
||||
|
||||
ret = 0;
|
||||
out:
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void cs_etm__dump_event(struct cs_etm_auxtrace *etm,
|
||||
struct auxtrace_buffer *buffer)
|
||||
{
|
||||
int i, ret;
|
||||
int ret;
|
||||
const char *color = PERF_COLOR_BLUE;
|
||||
struct cs_etm_decoder_params d_params;
|
||||
struct cs_etm_trace_params *t_params;
|
||||
@ -155,48 +228,22 @@ static void cs_etm__dump_event(struct cs_etm_auxtrace *etm,
|
||||
|
||||
/* Use metadata to fill in trace parameters for trace decoder */
|
||||
t_params = zalloc(sizeof(*t_params) * etm->num_cpu);
|
||||
for (i = 0; i < etm->num_cpu; i++) {
|
||||
if (etm->metadata[i][CS_ETM_MAGIC] == __perf_cs_etmv3_magic) {
|
||||
u32 etmidr = etm->metadata[i][CS_ETM_ETMIDR];
|
||||
|
||||
t_params[i].protocol =
|
||||
cs_etm__get_v7_protocol_version(etmidr);
|
||||
t_params[i].etmv3.reg_ctrl =
|
||||
etm->metadata[i][CS_ETM_ETMCR];
|
||||
t_params[i].etmv3.reg_trc_id =
|
||||
etm->metadata[i][CS_ETM_ETMTRACEIDR];
|
||||
} else if (etm->metadata[i][CS_ETM_MAGIC] ==
|
||||
__perf_cs_etmv4_magic) {
|
||||
t_params[i].protocol = CS_ETM_PROTO_ETMV4i;
|
||||
t_params[i].etmv4.reg_idr0 =
|
||||
etm->metadata[i][CS_ETMV4_TRCIDR0];
|
||||
t_params[i].etmv4.reg_idr1 =
|
||||
etm->metadata[i][CS_ETMV4_TRCIDR1];
|
||||
t_params[i].etmv4.reg_idr2 =
|
||||
etm->metadata[i][CS_ETMV4_TRCIDR2];
|
||||
t_params[i].etmv4.reg_idr8 =
|
||||
etm->metadata[i][CS_ETMV4_TRCIDR8];
|
||||
t_params[i].etmv4.reg_configr =
|
||||
etm->metadata[i][CS_ETMV4_TRCCONFIGR];
|
||||
t_params[i].etmv4.reg_traceidr =
|
||||
etm->metadata[i][CS_ETMV4_TRCTRACEIDR];
|
||||
}
|
||||
}
|
||||
if (!t_params)
|
||||
return;
|
||||
|
||||
if (cs_etm__init_trace_params(t_params, etm))
|
||||
goto out_free;
|
||||
|
||||
/* Set decoder parameters to simply print the trace packets */
|
||||
d_params.packet_printer = cs_etm__packet_dump;
|
||||
d_params.operation = CS_ETM_OPERATION_PRINT;
|
||||
d_params.formatted = true;
|
||||
d_params.fsyncs = false;
|
||||
d_params.hsyncs = false;
|
||||
d_params.frame_aligned = true;
|
||||
if (cs_etm__init_decoder_params(&d_params, NULL,
|
||||
CS_ETM_OPERATION_PRINT))
|
||||
goto out_free;
|
||||
|
||||
decoder = cs_etm_decoder__new(etm->num_cpu, &d_params, t_params);
|
||||
|
||||
zfree(&t_params);
|
||||
|
||||
if (!decoder)
|
||||
return;
|
||||
goto out_free;
|
||||
do {
|
||||
size_t consumed;
|
||||
|
||||
@ -211,6 +258,9 @@ static void cs_etm__dump_event(struct cs_etm_auxtrace *etm,
|
||||
} while (buffer_used < buffer->size);
|
||||
|
||||
cs_etm_decoder__free(decoder);
|
||||
|
||||
out_free:
|
||||
zfree(&t_params);
|
||||
}
|
||||
|
||||
static int cs_etm__flush_events(struct perf_session *session,
|
||||
@ -234,7 +284,7 @@ static int cs_etm__flush_events(struct perf_session *session,
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
return cs_etm__process_timeless_queues(etm, -1, MAX_TIMESTAMP - 1);
|
||||
return cs_etm__process_timeless_queues(etm, -1);
|
||||
}
|
||||
|
||||
static void cs_etm__free_queue(void *priv)
|
||||
@ -326,7 +376,7 @@ static u32 cs_etm__mem_access(struct cs_etm_queue *etmq, u64 address,
|
||||
struct addr_location al;
|
||||
|
||||
if (!etmq)
|
||||
return -1;
|
||||
return 0;
|
||||
|
||||
machine = etmq->etm->machine;
|
||||
cpumode = cs_etm__cpu_mode(etmq, address);
|
||||
@ -334,7 +384,7 @@ static u32 cs_etm__mem_access(struct cs_etm_queue *etmq, u64 address,
|
||||
thread = etmq->thread;
|
||||
if (!thread) {
|
||||
if (cpumode != PERF_RECORD_MISC_KERNEL)
|
||||
return -EINVAL;
|
||||
return 0;
|
||||
thread = etmq->etm->unknown_thread;
|
||||
}
|
||||
|
||||
@ -357,12 +407,10 @@ static u32 cs_etm__mem_access(struct cs_etm_queue *etmq, u64 address,
|
||||
return len;
|
||||
}
|
||||
|
||||
static struct cs_etm_queue *cs_etm__alloc_queue(struct cs_etm_auxtrace *etm,
|
||||
unsigned int queue_nr)
|
||||
static struct cs_etm_queue *cs_etm__alloc_queue(struct cs_etm_auxtrace *etm)
|
||||
{
|
||||
int i;
|
||||
struct cs_etm_decoder_params d_params;
|
||||
struct cs_etm_trace_params *t_params;
|
||||
struct cs_etm_trace_params *t_params = NULL;
|
||||
struct cs_etm_queue *etmq;
|
||||
size_t szp = sizeof(struct cs_etm_packet);
|
||||
|
||||
@ -397,59 +445,22 @@ static struct cs_etm_queue *cs_etm__alloc_queue(struct cs_etm_auxtrace *etm,
|
||||
if (!etmq->event_buf)
|
||||
goto out_free;
|
||||
|
||||
etmq->etm = etm;
|
||||
etmq->queue_nr = queue_nr;
|
||||
etmq->pid = -1;
|
||||
etmq->tid = -1;
|
||||
etmq->cpu = -1;
|
||||
|
||||
/* Use metadata to fill in trace parameters for trace decoder */
|
||||
t_params = zalloc(sizeof(*t_params) * etm->num_cpu);
|
||||
|
||||
if (!t_params)
|
||||
goto out_free;
|
||||
|
||||
for (i = 0; i < etm->num_cpu; i++) {
|
||||
if (etm->metadata[i][CS_ETM_MAGIC] == __perf_cs_etmv3_magic) {
|
||||
u32 etmidr = etm->metadata[i][CS_ETM_ETMIDR];
|
||||
if (cs_etm__init_trace_params(t_params, etm))
|
||||
goto out_free;
|
||||
|
||||
t_params[i].protocol =
|
||||
cs_etm__get_v7_protocol_version(etmidr);
|
||||
t_params[i].etmv3.reg_ctrl =
|
||||
etm->metadata[i][CS_ETM_ETMCR];
|
||||
t_params[i].etmv3.reg_trc_id =
|
||||
etm->metadata[i][CS_ETM_ETMTRACEIDR];
|
||||
} else if (etm->metadata[i][CS_ETM_MAGIC] ==
|
||||
__perf_cs_etmv4_magic) {
|
||||
t_params[i].protocol = CS_ETM_PROTO_ETMV4i;
|
||||
t_params[i].etmv4.reg_idr0 =
|
||||
etm->metadata[i][CS_ETMV4_TRCIDR0];
|
||||
t_params[i].etmv4.reg_idr1 =
|
||||
etm->metadata[i][CS_ETMV4_TRCIDR1];
|
||||
t_params[i].etmv4.reg_idr2 =
|
||||
etm->metadata[i][CS_ETMV4_TRCIDR2];
|
||||
t_params[i].etmv4.reg_idr8 =
|
||||
etm->metadata[i][CS_ETMV4_TRCIDR8];
|
||||
t_params[i].etmv4.reg_configr =
|
||||
etm->metadata[i][CS_ETMV4_TRCCONFIGR];
|
||||
t_params[i].etmv4.reg_traceidr =
|
||||
etm->metadata[i][CS_ETMV4_TRCTRACEIDR];
|
||||
}
|
||||
}
|
||||
|
||||
/* Set decoder parameters to simply print the trace packets */
|
||||
d_params.packet_printer = cs_etm__packet_dump;
|
||||
d_params.operation = CS_ETM_OPERATION_DECODE;
|
||||
d_params.formatted = true;
|
||||
d_params.fsyncs = false;
|
||||
d_params.hsyncs = false;
|
||||
d_params.frame_aligned = true;
|
||||
d_params.data = etmq;
|
||||
/* Set decoder parameters to decode trace packets */
|
||||
if (cs_etm__init_decoder_params(&d_params, etmq,
|
||||
CS_ETM_OPERATION_DECODE))
|
||||
goto out_free;
|
||||
|
||||
etmq->decoder = cs_etm_decoder__new(etm->num_cpu, &d_params, t_params);
|
||||
|
||||
zfree(&t_params);
|
||||
|
||||
if (!etmq->decoder)
|
||||
goto out_free;
|
||||
|
||||
@ -462,14 +473,13 @@ static struct cs_etm_queue *cs_etm__alloc_queue(struct cs_etm_auxtrace *etm,
|
||||
cs_etm__mem_access))
|
||||
goto out_free_decoder;
|
||||
|
||||
etmq->offset = 0;
|
||||
etmq->period_instructions = 0;
|
||||
|
||||
zfree(&t_params);
|
||||
return etmq;
|
||||
|
||||
out_free_decoder:
|
||||
cs_etm_decoder__free(etmq->decoder);
|
||||
out_free:
|
||||
zfree(&t_params);
|
||||
zfree(&etmq->event_buf);
|
||||
zfree(&etmq->last_branch);
|
||||
zfree(&etmq->last_branch_rb);
|
||||
@ -484,24 +494,30 @@ static int cs_etm__setup_queue(struct cs_etm_auxtrace *etm,
|
||||
struct auxtrace_queue *queue,
|
||||
unsigned int queue_nr)
|
||||
{
|
||||
int ret = 0;
|
||||
struct cs_etm_queue *etmq = queue->priv;
|
||||
|
||||
if (list_empty(&queue->head) || etmq)
|
||||
return 0;
|
||||
goto out;
|
||||
|
||||
etmq = cs_etm__alloc_queue(etm, queue_nr);
|
||||
etmq = cs_etm__alloc_queue(etm);
|
||||
|
||||
if (!etmq)
|
||||
return -ENOMEM;
|
||||
if (!etmq) {
|
||||
ret = -ENOMEM;
|
||||
goto out;
|
||||
}
|
||||
|
||||
queue->priv = etmq;
|
||||
|
||||
if (queue->cpu != -1)
|
||||
etmq->cpu = queue->cpu;
|
||||
|
||||
etmq->etm = etm;
|
||||
etmq->queue_nr = queue_nr;
|
||||
etmq->cpu = queue->cpu;
|
||||
etmq->tid = queue->tid;
|
||||
etmq->pid = -1;
|
||||
etmq->offset = 0;
|
||||
etmq->period_instructions = 0;
|
||||
|
||||
return 0;
|
||||
out:
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int cs_etm__setup_queues(struct cs_etm_auxtrace *etm)
|
||||
@ -509,6 +525,9 @@ static int cs_etm__setup_queues(struct cs_etm_auxtrace *etm)
|
||||
unsigned int i;
|
||||
int ret;
|
||||
|
||||
if (!etm->kernel_start)
|
||||
etm->kernel_start = machine__kernel_start(etm->machine);
|
||||
|
||||
for (i = 0; i < etm->queues.nr_queues; i++) {
|
||||
ret = cs_etm__setup_queue(etm, &etm->queues.queue_array[i], i);
|
||||
if (ret)
|
||||
@ -666,7 +685,7 @@ static int cs_etm__inject_event(union perf_event *event,
|
||||
|
||||
|
||||
static int
|
||||
cs_etm__get_trace(struct cs_etm_buffer *buff, struct cs_etm_queue *etmq)
|
||||
cs_etm__get_trace(struct cs_etm_queue *etmq)
|
||||
{
|
||||
struct auxtrace_buffer *aux_buffer = etmq->buffer;
|
||||
struct auxtrace_buffer *old_buffer = aux_buffer;
|
||||
@ -680,7 +699,7 @@ cs_etm__get_trace(struct cs_etm_buffer *buff, struct cs_etm_queue *etmq)
|
||||
if (!aux_buffer) {
|
||||
if (old_buffer)
|
||||
auxtrace_buffer__drop_data(old_buffer);
|
||||
buff->len = 0;
|
||||
etmq->buf_len = 0;
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -700,13 +719,11 @@ cs_etm__get_trace(struct cs_etm_buffer *buff, struct cs_etm_queue *etmq)
|
||||
if (old_buffer)
|
||||
auxtrace_buffer__drop_data(old_buffer);
|
||||
|
||||
buff->offset = aux_buffer->offset;
|
||||
buff->len = aux_buffer->size;
|
||||
buff->buf = aux_buffer->data;
|
||||
etmq->buf_used = 0;
|
||||
etmq->buf_len = aux_buffer->size;
|
||||
etmq->buf = aux_buffer->data;
|
||||
|
||||
buff->ref_timestamp = aux_buffer->reference;
|
||||
|
||||
return buff->len;
|
||||
return etmq->buf_len;
|
||||
}
|
||||
|
||||
static void cs_etm__set_pid_tid_cpu(struct cs_etm_auxtrace *etm,
|
||||
@ -1135,6 +1152,32 @@ static int cs_etm__end_block(struct cs_etm_queue *etmq)
|
||||
|
||||
return 0;
|
||||
}
|
||||
/*
|
||||
* cs_etm__get_data_block: Fetch a block from the auxtrace_buffer queue
|
||||
* if need be.
|
||||
* Returns: < 0 if error
|
||||
* = 0 if no more auxtrace_buffer to read
|
||||
* > 0 if the current buffer isn't empty yet
|
||||
*/
|
||||
static int cs_etm__get_data_block(struct cs_etm_queue *etmq)
|
||||
{
|
||||
int ret;
|
||||
|
||||
if (!etmq->buf_len) {
|
||||
ret = cs_etm__get_trace(etmq);
|
||||
if (ret <= 0)
|
||||
return ret;
|
||||
/*
|
||||
* We cannot assume consecutive blocks in the data file
|
||||
* are contiguous, reset the decoder to force re-sync.
|
||||
*/
|
||||
ret = cs_etm_decoder__reset(etmq->decoder);
|
||||
if (ret)
|
||||
return ret;
|
||||
}
|
||||
|
||||
return etmq->buf_len;
|
||||
}
|
||||
|
||||
static bool cs_etm__is_svc_instr(struct cs_etm_queue *etmq,
|
||||
struct cs_etm_packet *packet,
|
||||
@ -1474,105 +1517,124 @@ static int cs_etm__set_sample_flags(struct cs_etm_queue *etmq)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int cs_etm__decode_data_block(struct cs_etm_queue *etmq)
|
||||
{
|
||||
int ret = 0;
|
||||
size_t processed = 0;
|
||||
|
||||
/*
|
||||
* Packets are decoded and added to the decoder's packet queue
|
||||
* until the decoder packet processing callback has requested that
|
||||
* processing stops or there is nothing left in the buffer. Normal
|
||||
* operations that stop processing are a timestamp packet or a full
|
||||
* decoder buffer queue.
|
||||
*/
|
||||
ret = cs_etm_decoder__process_data_block(etmq->decoder,
|
||||
etmq->offset,
|
||||
&etmq->buf[etmq->buf_used],
|
||||
etmq->buf_len,
|
||||
&processed);
|
||||
if (ret)
|
||||
goto out;
|
||||
|
||||
etmq->offset += processed;
|
||||
etmq->buf_used += processed;
|
||||
etmq->buf_len -= processed;
|
||||
|
||||
out:
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int cs_etm__process_decoder_queue(struct cs_etm_queue *etmq)
|
||||
{
|
||||
int ret;
|
||||
|
||||
/* Process each packet in this chunk */
|
||||
while (1) {
|
||||
ret = cs_etm_decoder__get_packet(etmq->decoder,
|
||||
etmq->packet);
|
||||
if (ret <= 0)
|
||||
/*
|
||||
* Stop processing this chunk on
|
||||
* end of data or error
|
||||
*/
|
||||
break;
|
||||
|
||||
/*
|
||||
* Since packet addresses are swapped in packet
|
||||
* handling within below switch() statements,
|
||||
* thus setting sample flags must be called
|
||||
* prior to switch() statement to use address
|
||||
* information before packets swapping.
|
||||
*/
|
||||
ret = cs_etm__set_sample_flags(etmq);
|
||||
if (ret < 0)
|
||||
break;
|
||||
|
||||
switch (etmq->packet->sample_type) {
|
||||
case CS_ETM_RANGE:
|
||||
/*
|
||||
* If the packet contains an instruction
|
||||
* range, generate instruction sequence
|
||||
* events.
|
||||
*/
|
||||
cs_etm__sample(etmq);
|
||||
break;
|
||||
case CS_ETM_EXCEPTION:
|
||||
case CS_ETM_EXCEPTION_RET:
|
||||
/*
|
||||
* If the exception packet is coming,
|
||||
* make sure the previous instruction
|
||||
* range packet to be handled properly.
|
||||
*/
|
||||
cs_etm__exception(etmq);
|
||||
break;
|
||||
case CS_ETM_DISCONTINUITY:
|
||||
/*
|
||||
* Discontinuity in trace, flush
|
||||
* previous branch stack
|
||||
*/
|
||||
cs_etm__flush(etmq);
|
||||
break;
|
||||
case CS_ETM_EMPTY:
|
||||
/*
|
||||
* Should not receive empty packet,
|
||||
* report error.
|
||||
*/
|
||||
pr_err("CS ETM Trace: empty packet\n");
|
||||
return -EINVAL;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int cs_etm__run_decoder(struct cs_etm_queue *etmq)
|
||||
{
|
||||
struct cs_etm_auxtrace *etm = etmq->etm;
|
||||
struct cs_etm_buffer buffer;
|
||||
size_t buffer_used, processed;
|
||||
int err = 0;
|
||||
|
||||
if (!etm->kernel_start)
|
||||
etm->kernel_start = machine__kernel_start(etm->machine);
|
||||
|
||||
/* Go through each buffer in the queue and decode them one by one */
|
||||
while (1) {
|
||||
buffer_used = 0;
|
||||
memset(&buffer, 0, sizeof(buffer));
|
||||
err = cs_etm__get_trace(&buffer, etmq);
|
||||
err = cs_etm__get_data_block(etmq);
|
||||
if (err <= 0)
|
||||
return err;
|
||||
/*
|
||||
* We cannot assume consecutive blocks in the data file are
|
||||
* contiguous, reset the decoder to force re-sync.
|
||||
*/
|
||||
err = cs_etm_decoder__reset(etmq->decoder);
|
||||
if (err != 0)
|
||||
return err;
|
||||
|
||||
/* Run trace decoder until buffer consumed or end of trace */
|
||||
do {
|
||||
processed = 0;
|
||||
err = cs_etm_decoder__process_data_block(
|
||||
etmq->decoder,
|
||||
etmq->offset,
|
||||
&buffer.buf[buffer_used],
|
||||
buffer.len - buffer_used,
|
||||
&processed);
|
||||
err = cs_etm__decode_data_block(etmq);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
etmq->offset += processed;
|
||||
buffer_used += processed;
|
||||
/*
|
||||
* Process each packet in this chunk, nothing to do if
|
||||
* an error occurs other than hoping the next one will
|
||||
* be better.
|
||||
*/
|
||||
err = cs_etm__process_decoder_queue(etmq);
|
||||
|
||||
/* Process each packet in this chunk */
|
||||
while (1) {
|
||||
err = cs_etm_decoder__get_packet(etmq->decoder,
|
||||
etmq->packet);
|
||||
if (err <= 0)
|
||||
/*
|
||||
* Stop processing this chunk on
|
||||
* end of data or error
|
||||
*/
|
||||
break;
|
||||
|
||||
/*
|
||||
* Since packet addresses are swapped in packet
|
||||
* handling within below switch() statements,
|
||||
* thus setting sample flags must be called
|
||||
* prior to switch() statement to use address
|
||||
* information before packets swapping.
|
||||
*/
|
||||
err = cs_etm__set_sample_flags(etmq);
|
||||
if (err < 0)
|
||||
break;
|
||||
|
||||
switch (etmq->packet->sample_type) {
|
||||
case CS_ETM_RANGE:
|
||||
/*
|
||||
* If the packet contains an instruction
|
||||
* range, generate instruction sequence
|
||||
* events.
|
||||
*/
|
||||
cs_etm__sample(etmq);
|
||||
break;
|
||||
case CS_ETM_EXCEPTION:
|
||||
case CS_ETM_EXCEPTION_RET:
|
||||
/*
|
||||
* If the exception packet is coming,
|
||||
* make sure the previous instruction
|
||||
* range packet to be handled properly.
|
||||
*/
|
||||
cs_etm__exception(etmq);
|
||||
break;
|
||||
case CS_ETM_DISCONTINUITY:
|
||||
/*
|
||||
* Discontinuity in trace, flush
|
||||
* previous branch stack
|
||||
*/
|
||||
cs_etm__flush(etmq);
|
||||
break;
|
||||
case CS_ETM_EMPTY:
|
||||
/*
|
||||
* Should not receive empty packet,
|
||||
* report error.
|
||||
*/
|
||||
pr_err("CS ETM Trace: empty packet\n");
|
||||
return -EINVAL;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
} while (buffer.len > buffer_used);
|
||||
} while (etmq->buf_len);
|
||||
|
||||
if (err == 0)
|
||||
/* Flush any remaining branch stack entries */
|
||||
@ -1583,7 +1645,7 @@ static int cs_etm__run_decoder(struct cs_etm_queue *etmq)
|
||||
}
|
||||
|
||||
static int cs_etm__process_timeless_queues(struct cs_etm_auxtrace *etm,
|
||||
pid_t tid, u64 time_)
|
||||
pid_t tid)
|
||||
{
|
||||
unsigned int i;
|
||||
struct auxtrace_queues *queues = &etm->queues;
|
||||
@ -1593,7 +1655,6 @@ static int cs_etm__process_timeless_queues(struct cs_etm_auxtrace *etm,
|
||||
struct cs_etm_queue *etmq = queue->priv;
|
||||
|
||||
if (etmq && ((tid == -1) || (etmq->tid == tid))) {
|
||||
etmq->time = time_;
|
||||
cs_etm__set_pid_tid_cpu(etm, queue);
|
||||
cs_etm__run_decoder(etmq);
|
||||
}
|
||||
@ -1637,8 +1698,7 @@ static int cs_etm__process_event(struct perf_session *session,
|
||||
|
||||
if (event->header.type == PERF_RECORD_EXIT)
|
||||
return cs_etm__process_timeless_queues(etm,
|
||||
event->fork.tid,
|
||||
sample->time);
|
||||
event->fork.tid);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -105,8 +105,8 @@ struct intlist *traceid_list;
|
||||
|
||||
#define CS_ETM_HEADER_SIZE (CS_HEADER_VERSION_0_MAX * sizeof(u64))
|
||||
|
||||
static const u64 __perf_cs_etmv3_magic = 0x3030303030303030ULL;
|
||||
static const u64 __perf_cs_etmv4_magic = 0x4040404040404040ULL;
|
||||
#define __perf_cs_etmv3_magic 0x3030303030303030ULL
|
||||
#define __perf_cs_etmv4_magic 0x4040404040404040ULL
|
||||
#define CS_ETMV3_PRIV_SIZE (CS_ETM_PRIV_MAX * sizeof(u64))
|
||||
#define CS_ETMV4_PRIV_SIZE (CS_ETMV4_PRIV_MAX * sizeof(u64))
|
||||
|
||||
|
@ -563,7 +563,6 @@ static int write_cmdline(struct feat_fd *ff,
|
||||
"/sys/devices/system/cpu/cpu%d/topology/thread_siblings_list"
|
||||
|
||||
struct cpu_topo {
|
||||
u32 cpu_nr;
|
||||
u32 core_sib;
|
||||
u32 thread_sib;
|
||||
char **core_siblings;
|
||||
@ -679,7 +678,6 @@ static struct cpu_topo *build_cpu_topology(void)
|
||||
goto out_free;
|
||||
|
||||
tp = addr;
|
||||
tp->cpu_nr = nr;
|
||||
addr += sizeof(*tp);
|
||||
tp->core_siblings = addr;
|
||||
addr += sz;
|
||||
@ -1042,11 +1040,9 @@ static int write_cpuid(struct feat_fd *ff,
|
||||
int ret;
|
||||
|
||||
ret = get_cpuid(buffer, sizeof(buffer));
|
||||
if (!ret)
|
||||
goto write_it;
|
||||
if (ret)
|
||||
return -1;
|
||||
|
||||
return -1;
|
||||
write_it:
|
||||
return do_write_string(ff, buffer);
|
||||
}
|
||||
|
||||
|
@ -1,4 +1,4 @@
|
||||
libperf-$(CONFIG_AUXTRACE) += intel-pt-pkt-decoder.o intel-pt-insn-decoder.o intel-pt-log.o intel-pt-decoder.o
|
||||
perf-$(CONFIG_AUXTRACE) += intel-pt-pkt-decoder.o intel-pt-insn-decoder.o intel-pt-log.o intel-pt-decoder.o
|
||||
|
||||
inat_tables_script = util/intel-pt-decoder/gen-insn-attr-x86.awk
|
||||
inat_tables_maps = util/intel-pt-decoder/x86-opcode-map.txt
|
||||
|
@ -270,7 +270,7 @@ static void metricgroup__print_strlist(struct strlist *metrics, bool raw)
|
||||
}
|
||||
|
||||
void metricgroup__print(bool metrics, bool metricgroups, char *filter,
|
||||
bool raw)
|
||||
bool raw, bool details)
|
||||
{
|
||||
struct pmu_events_map *map = perf_pmu__find_map(NULL);
|
||||
struct pmu_event *pe;
|
||||
@ -329,6 +329,12 @@ void metricgroup__print(bool metrics, bool metricgroups, char *filter,
|
||||
if (asprintf(&s, "%s\n%*s%s]",
|
||||
pe->metric_name, 8, "[", pe->desc) < 0)
|
||||
return;
|
||||
|
||||
if (details) {
|
||||
if (asprintf(&s, "%s\n%*s%s]",
|
||||
s, 8, "[", pe->metric_expr) < 0)
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
if (!s)
|
||||
|
@ -27,6 +27,7 @@ int metricgroup__parse_groups(const struct option *opt,
|
||||
const char *str,
|
||||
struct rblist *metric_events);
|
||||
|
||||
void metricgroup__print(bool metrics, bool groups, char *filter, bool raw);
|
||||
void metricgroup__print(bool metrics, bool groups, char *filter,
|
||||
bool raw, bool details);
|
||||
bool metricgroup__has_metric(const char *metric);
|
||||
#endif
|
||||
|
@ -2540,7 +2540,7 @@ void print_events(const char *event_glob, bool name_only, bool quiet_flag,
|
||||
|
||||
print_sdt_events(NULL, NULL, name_only);
|
||||
|
||||
metricgroup__print(true, true, NULL, name_only);
|
||||
metricgroup__print(true, true, NULL, name_only, details_flag);
|
||||
}
|
||||
|
||||
int parse_events__is_hardcoded_term(struct parse_events_term *term)
|
||||
|
@ -311,7 +311,7 @@ value_sym '/' event_config '/'
|
||||
$$ = list;
|
||||
}
|
||||
|
|
||||
value_sym sep_slash_dc
|
||||
value_sym sep_slash_slash_dc
|
||||
{
|
||||
struct list_head *list;
|
||||
int type = $1 >> 16;
|
||||
@ -702,7 +702,7 @@ PE_VALUE PE_ARRAY_RANGE PE_VALUE
|
||||
|
||||
sep_dc: ':' |
|
||||
|
||||
sep_slash_dc: '/' | ':' |
|
||||
sep_slash_slash_dc: '/' '/' | ':' |
|
||||
|
||||
%%
|
||||
|
||||
|
@ -352,6 +352,11 @@ static bool s390_cpumsf_validate(int machine_type,
|
||||
*dsdes = 85;
|
||||
*bsdes = 32;
|
||||
break;
|
||||
case 2964:
|
||||
case 2965:
|
||||
*dsdes = 112;
|
||||
*bsdes = 32;
|
||||
break;
|
||||
default:
|
||||
/* Illegal trailer entry */
|
||||
return false;
|
||||
|
@ -1,5 +1,5 @@
|
||||
libperf-$(CONFIG_LIBPERL) += trace-event-perl.o
|
||||
libperf-$(CONFIG_LIBPYTHON) += trace-event-python.o
|
||||
perf-$(CONFIG_LIBPERL) += trace-event-perl.o
|
||||
perf-$(CONFIG_LIBPYTHON) += trace-event-python.o
|
||||
|
||||
CFLAGS_trace-event-perl.o += $(PERL_EMBED_CCOPTS) -Wno-redundant-decls -Wno-strict-prototypes -Wno-unused-parameter -Wno-shadow -Wno-nested-externs -Wno-undef -Wno-switch-default
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user