mirror of
https://github.com/torvalds/linux.git
synced 2024-11-10 14:11:52 +00:00
perf build: Use libtraceevent from the system
Remove the LIBTRACEEVENT_DYNAMIC and LIBTRACEFS_DYNAMIC make command line variables. If libtraceevent isn't installed or NO_LIBTRACEEVENT=1 is passed to the build, don't compile in libtraceevent and libtracefs support. This also disables CONFIG_TRACE that controls "perf trace". CONFIG_LIBTRACEEVENT is used to control enablement in Build/Makefiles, HAVE_LIBTRACEEVENT is used in C code. Without HAVE_LIBTRACEEVENT tracepoints are disabled and as such the commands kmem, kwork, lock, sched and timechart are removed. The majority of commands continue to work including "perf test". Committer notes: Fixed up a tools/perf/util/Build reject and added: #include <traceevent/event-parse.h> to tools/perf/util/scripting-engines/trace-event-perl.c. Committer testing: $ rpm -qi libtraceevent-devel Name : libtraceevent-devel Version : 1.5.3 Release : 2.fc36 Architecture: x86_64 Install Date: Mon 25 Jul 2022 03:20:19 PM -03 Group : Unspecified Size : 27728 License : LGPLv2+ and GPLv2+ Signature : RSA/SHA256, Fri 15 Apr 2022 02:11:58 PM -03, Key ID 999f7cbf38ab71f4 Source RPM : libtraceevent-1.5.3-2.fc36.src.rpm Build Date : Fri 15 Apr 2022 10:57:01 AM -03 Build Host : buildvm-x86-05.iad2.fedoraproject.org Packager : Fedora Project Vendor : Fedora Project URL : https://git.kernel.org/pub/scm/libs/libtrace/libtraceevent.git/ Bug URL : https://bugz.fedoraproject.org/libtraceevent Summary : Development headers of libtraceevent Description : Development headers of libtraceevent-libs $ Default build: $ ldd ~/bin/perf | grep tracee libtraceevent.so.1 => /lib64/libtraceevent.so.1 (0x00007f1dcaf8f000) $ # perf trace -e sched:* --max-events 10 0.000 migration/0/17 sched:sched_migrate_task(comm: "", pid: 1603763 (perf), prio: 120, dest_cpu: 1) 0.005 migration/0/17 sched:sched_wake_idle_without_ipi(cpu: 1) 0.011 migration/0/17 sched:sched_switch(prev_comm: "", prev_pid: 17 (migration/0), prev_state: 1, next_comm: "", next_prio: 120) 1.173 :0/0 sched:sched_wakeup(comm: "", pid: 3138 (gnome-terminal-), prio: 120) 1.180 :0/0 sched:sched_switch(prev_comm: "", prev_prio: 120, next_comm: "", next_pid: 3138 (gnome-terminal-), next_prio: 120) 0.156 migration/1/21 sched:sched_migrate_task(comm: "", pid: 1603763 (perf), prio: 120, orig_cpu: 1, dest_cpu: 2) 0.160 migration/1/21 sched:sched_wake_idle_without_ipi(cpu: 2) 0.166 migration/1/21 sched:sched_switch(prev_comm: "", prev_pid: 21 (migration/1), prev_state: 1, next_comm: "", next_prio: 120) 1.183 :0/0 sched:sched_wakeup(comm: "", pid: 1602985 (kworker/u16:0-f), prio: 120, target_cpu: 1) 1.186 :0/0 sched:sched_switch(prev_comm: "", prev_prio: 120, next_comm: "", next_pid: 1602985 (kworker/u16:0-f), next_prio: 120) # Had to tweak tools/perf/util/setup.py to make sure the python binding shared object links with libtraceevent if -DHAVE_LIBTRACEEVENT is present in CFLAGS. Building with NO_LIBTRACEEVENT=1 uncovered some more build failures: - Make building of data-convert-bt.c to CONFIG_LIBTRACEEVENT=y - perf-$(CONFIG_LIBTRACEEVENT) += scripts/ - bpf_kwork.o needs also to be dependent on CONFIG_LIBTRACEEVENT=y - The python binding needed some fixups and util/trace-event.c can't be built and linked with the python binding shared object, so remove it in tools/perf/util/setup.py and exclude it from the list of dependencies in the python/perf.so Makefile.perf target. Building without libtraceevent-devel installed uncovered more build failures: - The python binding tools/perf/util/python.c was assuming that traceevent/parse-events.h was always available, which was the case when we defaulted to using the in-kernel tools/lib/traceevent/ files, now we need to enclose it under ifdef HAVE_LIBTRACEEVENT, just like the other parts of it that deal with tracepoints. - We have to ifdef the rules in the Build files with CONFIG_LIBTRACEEVENT=y to build builtin-trace.c and tools/perf/trace/beauty/ as we only ifdef setting CONFIG_TRACE=y when setting NO_LIBTRACEEVENT=1 in the make command line, not when we don't detect libtraceevent-devel installed in the system. Simplification here to avoid these two ways of disabling builtin-trace.c and not having CONFIG_TRACE=y when libtraceevent-devel isn't installed is the clean way. From Athira: <quote> tools/perf/arch/powerpc/util/Build -perf-y += kvm-stat.o +perf-$(CONFIG_LIBTRACEEVENT) += kvm-stat.o </quote> Then, ditto for arm64 and s390, detected by container cross build tests. - s/390 uses test__checkevent_tracepoint() that is now only available if HAVE_LIBTRACEEVENT is defined, enclose the callsite with ifder HAVE_LIBTRACEEVENT. Also from Athira: <quote> With this change, I could successfully compile in these environment: - Without libtraceevent-devel installed - With libtraceevent-devel installed - With “make NO_LIBTRACEEVENT=1” </quote> Then, finally rename CONFIG_TRACEEVENT to CONFIG_LIBTRACEEVENT for consistency with other libraries detected in tools/perf/. Signed-off-by: Ian Rogers <irogers@google.com> Tested-by: Arnaldo Carvalho de Melo <acme@redhat.com> Tested-by: Athira Rajeev <atrajeev@linux.vnet.ibm.com> Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com> Cc: Jiri Olsa <jolsa@kernel.org> Cc: Mark Rutland <mark.rutland@arm.com> Cc: Namhyung Kim <namhyung@kernel.org> Cc: Nick Desaulniers <ndesaulniers@google.com> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Stephane Eranian <eranian@google.com> Cc: bpf@vger.kernel.org Link: http://lore.kernel.org/lkml/20221205225940.3079667-3-irogers@google.com Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
This commit is contained in:
parent
40769665b6
commit
378ef0f5d9
@ -5,7 +5,6 @@ perf-y += builtin-diff.o
|
||||
perf-y += builtin-evlist.o
|
||||
perf-y += builtin-ftrace.o
|
||||
perf-y += builtin-help.o
|
||||
perf-y += builtin-sched.o
|
||||
perf-y += builtin-buildid-list.o
|
||||
perf-y += builtin-buildid-cache.o
|
||||
perf-y += builtin-kallsyms.o
|
||||
@ -13,11 +12,8 @@ perf-y += builtin-list.o
|
||||
perf-y += builtin-record.o
|
||||
perf-y += builtin-report.o
|
||||
perf-y += builtin-stat.o
|
||||
perf-y += builtin-timechart.o
|
||||
perf-y += builtin-top.o
|
||||
perf-y += builtin-script.o
|
||||
perf-y += builtin-kmem.o
|
||||
perf-y += builtin-lock.o
|
||||
perf-y += builtin-kvm.o
|
||||
perf-y += builtin-inject.o
|
||||
perf-y += builtin-mem.o
|
||||
@ -25,9 +21,18 @@ perf-y += builtin-data.o
|
||||
perf-y += builtin-version.o
|
||||
perf-y += builtin-c2c.o
|
||||
perf-y += builtin-daemon.o
|
||||
perf-y += builtin-kwork.o
|
||||
|
||||
perf-$(CONFIG_TRACE) += builtin-trace.o
|
||||
perf-$(CONFIG_LIBTRACEEVENT) += builtin-kmem.o
|
||||
perf-$(CONFIG_LIBTRACEEVENT) += builtin-kwork.o
|
||||
perf-$(CONFIG_LIBTRACEEVENT) += builtin-lock.o
|
||||
perf-$(CONFIG_LIBTRACEEVENT) += builtin-sched.o
|
||||
perf-$(CONFIG_LIBTRACEEVENT) += builtin-timechart.o
|
||||
|
||||
ifeq ($(CONFIG_LIBTRACEEVENT),y)
|
||||
perf-$(CONFIG_TRACE) += builtin-trace.o
|
||||
perf-$(CONFIG_TRACE) += trace/beauty/
|
||||
endif
|
||||
|
||||
perf-$(CONFIG_LIBELF) += builtin-probe.o
|
||||
|
||||
perf-y += bench/
|
||||
@ -51,7 +56,6 @@ CFLAGS_builtin-report.o += -DDOCDIR="BUILD_STR($(srcdir_SQ)/Documentation)"
|
||||
perf-y += util/
|
||||
perf-y += arch/
|
||||
perf-y += ui/
|
||||
perf-y += scripts/
|
||||
perf-$(CONFIG_TRACE) += trace/beauty/
|
||||
perf-$(CONFIG_LIBTRACEEVENT) += scripts/
|
||||
|
||||
gtk-y += ui/gtk/
|
||||
|
@ -763,18 +763,20 @@ ifndef NO_LIBUNWIND
|
||||
EXTLIBS += $(EXTLIBS_LIBUNWIND)
|
||||
endif
|
||||
|
||||
ifeq ($(NO_SYSCALL_TABLE),0)
|
||||
$(call detected,CONFIG_TRACE)
|
||||
else
|
||||
ifndef NO_LIBAUDIT
|
||||
$(call feature_check,libaudit)
|
||||
ifneq ($(feature-libaudit), 1)
|
||||
msg := $(warning No libaudit.h found, disables 'trace' tool, please install audit-libs-devel or libaudit-dev);
|
||||
NO_LIBAUDIT := 1
|
||||
else
|
||||
CFLAGS += -DHAVE_LIBAUDIT_SUPPORT
|
||||
EXTLIBS += -laudit
|
||||
$(call detected,CONFIG_TRACE)
|
||||
ifneq ($(NO_LIBTRACEEVENT),1)
|
||||
ifeq ($(NO_SYSCALL_TABLE),0)
|
||||
$(call detected,CONFIG_TRACE)
|
||||
else
|
||||
ifndef NO_LIBAUDIT
|
||||
$(call feature_check,libaudit)
|
||||
ifneq ($(feature-libaudit), 1)
|
||||
msg := $(warning No libaudit.h found, disables 'trace' tool, please install audit-libs-devel or libaudit-dev);
|
||||
NO_LIBAUDIT := 1
|
||||
else
|
||||
CFLAGS += -DHAVE_LIBAUDIT_SUPPORT
|
||||
EXTLIBS += -laudit
|
||||
$(call detected,CONFIG_TRACE)
|
||||
endif
|
||||
endif
|
||||
endif
|
||||
endif
|
||||
@ -1182,9 +1184,11 @@ ifdef LIBPFM4
|
||||
endif
|
||||
endif
|
||||
|
||||
ifdef LIBTRACEEVENT_DYNAMIC
|
||||
# libtraceevent is a recommended dependency picked up from the system.
|
||||
ifneq ($(NO_LIBTRACEEVENT),1)
|
||||
$(call feature_check,libtraceevent)
|
||||
ifeq ($(feature-libtraceevent), 1)
|
||||
CFLAGS += -DHAVE_LIBTRACEEVENT
|
||||
EXTLIBS += -ltraceevent
|
||||
LIBTRACEEVENT_VERSION := $(shell $(PKG_CONFIG) --modversion libtraceevent)
|
||||
LIBTRACEEVENT_VERSION_1 := $(word 1, $(subst ., ,$(LIBTRACEEVENT_VERSION)))
|
||||
@ -1192,12 +1196,11 @@ ifdef LIBTRACEEVENT_DYNAMIC
|
||||
LIBTRACEEVENT_VERSION_3 := $(word 3, $(subst ., ,$(LIBTRACEEVENT_VERSION)))
|
||||
LIBTRACEEVENT_VERSION_CPP := $(shell expr $(LIBTRACEEVENT_VERSION_1) \* 255 \* 255 + $(LIBTRACEEVENT_VERSION_2) \* 255 + $(LIBTRACEEVENT_VERSION_3))
|
||||
CFLAGS += -DLIBTRACEEVENT_VERSION=$(LIBTRACEEVENT_VERSION_CPP)
|
||||
$(call detected,CONFIG_LIBTRACEEVENT)
|
||||
else
|
||||
dummy := $(error Error: No libtraceevent devel library found, please install libtraceevent-devel);
|
||||
dummy := $(warning Warning: libtraceevent is missing limiting functionality, please install libtraceevent-dev/libtraceevent-devel)
|
||||
endif
|
||||
endif
|
||||
|
||||
ifdef LIBTRACEFS_DYNAMIC
|
||||
$(call feature_check,libtracefs)
|
||||
ifeq ($(feature-libtracefs), 1)
|
||||
EXTLIBS += -ltracefs
|
||||
@ -1207,8 +1210,6 @@ ifdef LIBTRACEFS_DYNAMIC
|
||||
LIBTRACEFS_VERSION_3 := $(word 3, $(subst ., ,$(LIBTRACEFS_VERSION)))
|
||||
LIBTRACEFS_VERSION_CPP := $(shell expr $(LIBTRACEFS_VERSION_1) \* 255 \* 255 + $(LIBTRACEFS_VERSION_2) \* 255 + $(LIBTRACEFS_VERSION_3))
|
||||
CFLAGS += -DLIBTRACEFS_VERSION=$(LIBTRACEFS_VERSION_CPP)
|
||||
else
|
||||
dummy := $(error Error: No libtracefs devel library found, please install libtracefs-dev);
|
||||
endif
|
||||
endif
|
||||
|
||||
|
@ -128,10 +128,6 @@ include ../scripts/utilities.mak
|
||||
#
|
||||
# Define BUILD_BPF_SKEL to enable BPF skeletons
|
||||
#
|
||||
# Define LIBTRACEEVENT_DYNAMIC to enable libtraceevent dynamic linking
|
||||
#
|
||||
# Define LIBTRACEFS_DYNAMIC to enable libtracefs dynamic linking
|
||||
#
|
||||
|
||||
# As per kernel Makefile, avoid funny character set dependencies
|
||||
unexport LC_ALL
|
||||
@ -242,10 +238,6 @@ sub-make: fixdep
|
||||
else # force_fixdep
|
||||
|
||||
LIBAPI_DIR = $(srctree)/tools/lib/api/
|
||||
ifndef LIBTRACEEVENT_DYNAMIC
|
||||
LIBTRACEEVENT_DIR = $(srctree)/tools/lib/traceevent/
|
||||
LIBTRACEEVENT_PLUGINS_DIR = $(LIBTRACEEVENT_DIR)/plugins
|
||||
endif
|
||||
LIBBPF_DIR = $(srctree)/tools/lib/bpf/
|
||||
LIBSUBCMD_DIR = $(srctree)/tools/lib/subcmd/
|
||||
LIBSYMBOL_DIR = $(srctree)/tools/lib/symbol/
|
||||
@ -295,31 +287,6 @@ SCRIPT_SH += perf-iostat.sh
|
||||
grep-libs = $(filter -l%,$(1))
|
||||
strip-libs = $(filter-out -l%,$(1))
|
||||
|
||||
ifndef LIBTRACEEVENT_DYNAMIC
|
||||
ifneq ($(OUTPUT),)
|
||||
LIBTRACEEVENT_OUTPUT = $(abspath $(OUTPUT))/libtraceevent
|
||||
else
|
||||
LIBTRACEEVENT_OUTPUT = $(CURDIR)/libtraceevent
|
||||
endif
|
||||
LIBTRACEEVENT_PLUGINS_OUTPUT = $(LIBTRACEEVENT_OUTPUT)_plugins
|
||||
LIBTRACEEVENT_DESTDIR = $(LIBTRACEEVENT_OUTPUT)
|
||||
LIBTRACEEVENT_PLUGINS_DESTDIR = $(LIBTRACEEVENT_PLUGINS_OUTPUT)
|
||||
LIBTRACEEVENT_INCLUDE = $(LIBTRACEEVENT_DESTDIR)/include
|
||||
LIBTRACEEVENT = $(LIBTRACEEVENT_OUTPUT)/libtraceevent.a
|
||||
export LIBTRACEEVENT
|
||||
LIBTRACEEVENT_DYNAMIC_LIST = $(LIBTRACEEVENT_PLUGINS_OUTPUT)/libtraceevent-dynamic-list
|
||||
CFLAGS += -I$(LIBTRACEEVENT_OUTPUT)/include
|
||||
#
|
||||
# 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))
|
||||
else
|
||||
LIBTRACEEVENT_DYNAMIC_LIST =
|
||||
LIBTRACEEVENT_DYNAMIC_LIST_LDFLAGS =
|
||||
endif
|
||||
|
||||
ifneq ($(OUTPUT),)
|
||||
LIBAPI_OUTPUT = $(abspath $(OUTPUT))/libapi
|
||||
else
|
||||
@ -380,13 +347,14 @@ export PYTHON_EXTBUILD_LIB PYTHON_EXTBUILD_TMP
|
||||
|
||||
python-clean := $(call QUIET_CLEAN, python) $(RM) -r $(PYTHON_EXTBUILD) $(OUTPUT)python/perf*.so
|
||||
|
||||
PYTHON_EXT_SRCS := $(shell grep -v ^\# util/python-ext-sources)
|
||||
ifndef LIBTRACEEVENT_DYNAMIC
|
||||
PYTHON_EXT_DEPS := util/python-ext-sources util/setup.py $(LIBTRACEEVENT) $(LIBAPI)
|
||||
ifeq ($(CONFIG_LIBTRACEEVENT),y)
|
||||
PYTHON_EXT_SRCS := $(shell grep -v ^\# util/python-ext-sources)
|
||||
else
|
||||
PYTHON_EXT_DEPS := util/python-ext-sources util/setup.py $(LIBAPI)
|
||||
PYTHON_EXT_SRCS := $(shell grep -v '^\#\|util/trace-event.c' util/python-ext-sources)
|
||||
endif
|
||||
|
||||
PYTHON_EXT_DEPS := util/python-ext-sources util/setup.py $(LIBAPI)
|
||||
|
||||
SCRIPTS = $(patsubst %.sh,%,$(SCRIPT_SH))
|
||||
|
||||
PROGRAMS += $(OUTPUT)perf
|
||||
@ -430,9 +398,6 @@ ifndef NO_LIBBPF
|
||||
PERFLIBS += $(LIBBPF)
|
||||
endif
|
||||
endif
|
||||
ifndef LIBTRACEEVENT_DYNAMIC
|
||||
PERFLIBS += $(LIBTRACEEVENT)
|
||||
endif
|
||||
|
||||
# We choose to avoid "if .. else if .. else .. endif endif"
|
||||
# because maintaining the nesting to match is a pain. If
|
||||
@ -682,9 +647,9 @@ all: shell_compatibility_test $(ALL_PROGRAMS) $(LANG_BINDINGS) $(OTHER_PROGRAMS)
|
||||
# Create python binding output directory if not already present
|
||||
_dummy := $(shell [ -d '$(OUTPUT)python' ] || mkdir -p '$(OUTPUT)python')
|
||||
|
||||
$(OUTPUT)python/perf.so: $(PYTHON_EXT_SRCS) $(PYTHON_EXT_DEPS) $(LIBTRACEEVENT_DYNAMIC_LIST) $(LIBPERF)
|
||||
$(OUTPUT)python/perf.so: $(PYTHON_EXT_SRCS) $(PYTHON_EXT_DEPS) $(LIBPERF)
|
||||
$(QUIET_GEN)LDSHARED="$(CC) -pthread -shared" \
|
||||
CFLAGS='$(CFLAGS)' LDFLAGS='$(LDFLAGS) $(LIBTRACEEVENT_DYNAMIC_LIST_LDFLAGS)' \
|
||||
CFLAGS='$(CFLAGS)' LDFLAGS='$(LDFLAGS)' \
|
||||
$(PYTHON_WORD) util/setup.py \
|
||||
--quiet build_ext; \
|
||||
cp $(PYTHON_EXTBUILD_LIB)perf*.so $(OUTPUT)python/
|
||||
@ -710,8 +675,8 @@ $(PERF_IN): prepare FORCE
|
||||
$(PMU_EVENTS_IN): FORCE prepare
|
||||
$(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)
|
||||
$(QUIET_LINK)$(CC) $(CFLAGS) $(LDFLAGS) $(LIBTRACEEVENT_DYNAMIC_LIST_LDFLAGS) \
|
||||
$(OUTPUT)perf: $(PERFLIBS) $(PERF_IN) $(PMU_EVENTS_IN)
|
||||
$(QUIET_LINK)$(CC) $(CFLAGS) $(LDFLAGS) \
|
||||
$(PERF_IN) $(PMU_EVENTS_IN) $(LIBS) -o $@
|
||||
|
||||
$(GTK_IN): FORCE prepare
|
||||
@ -797,10 +762,6 @@ prepare: $(OUTPUT)PERF-VERSION-FILE $(OUTPUT)common-cmds.h archheaders $(drm_ioc
|
||||
$(LIBSYMBOL) \
|
||||
bpf-skel
|
||||
|
||||
ifndef LIBTRACEEVENT_DYNAMIC
|
||||
prepare: $(LIBTRACEEVENT)
|
||||
endif
|
||||
|
||||
$(OUTPUT)%.o: %.c prepare FORCE
|
||||
$(Q)$(MAKE) -f $(srctree)/tools/build/Makefile.build dir=$(build-dir) $@
|
||||
|
||||
@ -856,38 +817,6 @@ endif
|
||||
|
||||
$(patsubst perf-%,%.o,$(PROGRAMS)): $(wildcard */*.h)
|
||||
|
||||
ifndef LIBTRACEEVENT_DYNAMIC
|
||||
LIBTRACEEVENT_FLAGS += plugin_dir=$(plugindir_SQ) 'EXTRA_CFLAGS=$(EXTRA_CFLAGS)' 'LDFLAGS=$(filter-out -static,$(LDFLAGS))'
|
||||
|
||||
$(LIBTRACEEVENT): FORCE | $(LIBTRACEEVENT_OUTPUT)
|
||||
$(Q)$(MAKE) -C $(LIBTRACEEVENT_DIR) O=$(LIBTRACEEVENT_OUTPUT) \
|
||||
DESTDIR=$(LIBTRACEEVENT_DESTDIR) prefix= \
|
||||
$@ install_headers
|
||||
|
||||
$(LIBTRACEEVENT)-clean:
|
||||
$(call QUIET_CLEAN, libtraceevent)
|
||||
$(Q)$(RM) -r -- $(LIBTRACEEVENT_OUTPUT)
|
||||
|
||||
libtraceevent_plugins: FORCE | $(LIBTRACEEVENT_PLUGINS_OUTPUT)
|
||||
$(Q)$(MAKE) -C $(LIBTRACEEVENT_PLUGINS_DIR) O=$(LIBTRACEEVENT_PLUGINS_OUTPUT) \
|
||||
DESTDIR=$(LIBTRACEEVENT_PLUGINS_DESTDIR) prefix= \
|
||||
plugins
|
||||
|
||||
libtraceevent_plugins-clean:
|
||||
$(call QUIET_CLEAN, libtraceevent_plugins)
|
||||
$(Q)$(RM) -r -- $(LIBTRACEEVENT_PLUGINS_OUTPUT)
|
||||
|
||||
$(LIBTRACEEVENT_DYNAMIC_LIST): libtraceevent_plugins
|
||||
$(Q)$(MAKE) -C $(LIBTRACEEVENT_PLUGINS_DIR) O=$(LIBTRACEEVENT_PLUGINS_OUTPUT) \
|
||||
DESTDIR=$(LIBTRACEEVENT_PLUGINS_DESTDIR) prefix= \
|
||||
$(LIBTRACEEVENT_FLAGS) $@
|
||||
|
||||
install-traceevent-plugins: libtraceevent_plugins
|
||||
$(Q)$(MAKE) -C $(LIBTRACEEVENT_PLUGINS_DIR) O=$(LIBTRACEEVENT_PLUGINS_OUTPUT) \
|
||||
DESTDIR=$(DESTDIR_SQ)$(prefix) prefix= \
|
||||
$(LIBTRACEEVENT_FLAGS) install
|
||||
endif
|
||||
|
||||
$(LIBAPI): FORCE | $(LIBAPI_OUTPUT)
|
||||
$(Q)$(MAKE) -C $(LIBAPI_DIR) O=$(LIBAPI_OUTPUT) \
|
||||
DESTDIR=$(LIBAPI_DESTDIR) prefix= \
|
||||
@ -1095,10 +1024,6 @@ install-tests: all install-gtk
|
||||
|
||||
install-bin: install-tools install-tests
|
||||
|
||||
ifndef LIBTRACEEVENT_DYNAMIC
|
||||
install-bin: install-traceevent-plugins
|
||||
endif
|
||||
|
||||
install: install-bin try-install-man
|
||||
|
||||
install-python_ext:
|
||||
@ -1124,11 +1049,6 @@ SKELETONS += $(SKEL_OUT)/kwork_trace.skel.h
|
||||
$(SKEL_TMP_OUT) $(LIBAPI_OUTPUT) $(LIBBPF_OUTPUT) $(LIBPERF_OUTPUT) $(LIBSUBCMD_OUTPUT) $(LIBSYMBOL_OUTPUT):
|
||||
$(Q)$(MKDIR) -p $@
|
||||
|
||||
ifndef LIBTRACEEVENT_DYNAMIC
|
||||
$(LIBTRACEEVENT_OUTPUT) $(LIBTRACEEVENT_PLUGINS_OUTPUT):
|
||||
$(Q)$(MKDIR) -p $@
|
||||
endif
|
||||
|
||||
ifdef BUILD_BPF_SKEL
|
||||
BPFTOOL := $(SKEL_TMP_OUT)/bootstrap/bpftool
|
||||
BPF_INCLUDE := -I$(SKEL_TMP_OUT)/.. -I$(LIBBPF_INCLUDE)
|
||||
@ -1211,10 +1131,6 @@ clean:: $(LIBAPI)-clean $(LIBBPF)-clean $(LIBSUBCMD)-clean $(LIBSYMBOL)-clean $(
|
||||
$(call QUIET_CLEAN, Documentation) \
|
||||
$(MAKE) -C $(DOC_DIR) O=$(OUTPUT) clean >/dev/null
|
||||
|
||||
ifndef LIBTRACEEVENT_DYNAMIC
|
||||
clean:: $(LIBTRACEEVENT)-clean libtraceevent_plugins-clean
|
||||
endif
|
||||
|
||||
#
|
||||
# To provide FEATURE-DUMP into $(FEATURE_DUMP_COPY)
|
||||
# file if defined, with no further action.
|
||||
@ -1232,6 +1148,6 @@ FORCE:
|
||||
.PHONY: all install clean config-clean strip install-gtk
|
||||
.PHONY: shell_compatibility_test please_set_SHELL_PATH_to_a_more_modern_shell
|
||||
.PHONY: .FORCE-PERF-VERSION-FILE TAGS tags cscope FORCE prepare
|
||||
.PHONY: libtraceevent_plugins archheaders
|
||||
.PHONY: archheaders
|
||||
|
||||
endif # force_fixdep
|
||||
|
@ -3,7 +3,7 @@ perf-y += machine.o
|
||||
perf-y += perf_regs.o
|
||||
perf-y += tsc.o
|
||||
perf-y += pmu.o
|
||||
perf-y += kvm-stat.o
|
||||
perf-$(CONFIG_LIBTRACEEVENT) += kvm-stat.o
|
||||
perf-$(CONFIG_DWARF) += dwarf-regs.o
|
||||
perf-$(CONFIG_LOCAL_LIBUNWIND) += unwind-libunwind.o
|
||||
perf-$(CONFIG_LIBDW_DWARF_UNWIND) += unwind-libdw.o
|
||||
|
@ -1,5 +1,5 @@
|
||||
perf-y += header.o
|
||||
perf-y += kvm-stat.o
|
||||
perf-$(CONFIG_LIBTRACEEVENT) += kvm-stat.o
|
||||
perf-y += perf_regs.o
|
||||
perf-y += mem-events.o
|
||||
perf-y += sym-handling.o
|
||||
|
@ -1,5 +1,5 @@
|
||||
perf-y += header.o
|
||||
perf-y += kvm-stat.o
|
||||
perf-$(CONFIG_LIBTRACEEVENT) += kvm-stat.o
|
||||
perf-y += perf_regs.o
|
||||
|
||||
perf-$(CONFIG_DWARF) += dwarf-regs.o
|
||||
|
@ -1,7 +1,7 @@
|
||||
perf-y += header.o
|
||||
perf-y += tsc.o
|
||||
perf-y += pmu.o
|
||||
perf-y += kvm-stat.o
|
||||
perf-$(CONFIG_LIBTRACEEVENT) += kvm-stat.o
|
||||
perf-y += perf_regs.o
|
||||
perf-y += topdown.o
|
||||
perf-y += machine.o
|
||||
|
@ -418,6 +418,7 @@ static int intel_pt_info_fill(struct auxtrace_record *itr,
|
||||
return 0;
|
||||
}
|
||||
|
||||
#ifdef HAVE_LIBTRACEEVENT
|
||||
static int intel_pt_track_switches(struct evlist *evlist)
|
||||
{
|
||||
const char *sched_switch = "sched:sched_switch";
|
||||
@ -439,6 +440,7 @@ static int intel_pt_track_switches(struct evlist *evlist)
|
||||
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
static void intel_pt_valid_str(char *str, size_t len, u64 valid)
|
||||
{
|
||||
@ -829,6 +831,7 @@ static int intel_pt_recording_options(struct auxtrace_record *itr,
|
||||
ptr->have_sched_switch = 2;
|
||||
}
|
||||
} else {
|
||||
#ifdef HAVE_LIBTRACEEVENT
|
||||
err = intel_pt_track_switches(evlist);
|
||||
if (err == -EPERM)
|
||||
pr_debug2("Unable to select sched:sched_switch\n");
|
||||
@ -836,6 +839,7 @@ static int intel_pt_recording_options(struct auxtrace_record *itr,
|
||||
return err;
|
||||
else
|
||||
ptr->have_sched_switch = 1;
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -499,7 +499,9 @@ int cmd_annotate(int argc, const char **argv)
|
||||
.namespaces = perf_event__process_namespaces,
|
||||
.attr = perf_event__process_attr,
|
||||
.build_id = perf_event__process_build_id,
|
||||
#ifdef HAVE_LIBTRACEEVENT
|
||||
.tracing_data = perf_event__process_tracing_data,
|
||||
#endif
|
||||
.id_index = perf_event__process_id_index,
|
||||
.auxtrace_info = perf_event__process_auxtrace_info,
|
||||
.auxtrace = perf_event__process_auxtrace,
|
||||
|
@ -78,12 +78,13 @@ static int cmd_data_convert(int argc, const char **argv)
|
||||
return bt_convert__perf2json(input_name, to_json, &opts);
|
||||
|
||||
if (to_ctf) {
|
||||
#ifdef HAVE_LIBBABELTRACE_SUPPORT
|
||||
#if defined(HAVE_LIBBABELTRACE_SUPPORT) && defined(HAVE_LIBTRACEEVENT)
|
||||
return bt_convert__perf2ctf(input_name, to_ctf, &opts);
|
||||
#else
|
||||
pr_err("The libbabeltrace support is not compiled in. perf should be "
|
||||
"compiled with environment variables LIBBABELTRACE=1 and "
|
||||
"LIBBABELTRACE_DIR=/path/to/libbabeltrace/\n");
|
||||
"LIBBABELTRACE_DIR=/path/to/libbabeltrace/.\n"
|
||||
"Check also if libbtraceevent devel files are available.\n");
|
||||
return -1;
|
||||
#endif
|
||||
}
|
||||
|
@ -607,6 +607,7 @@ static int perf_event__repipe_exit(struct perf_tool *tool,
|
||||
return err;
|
||||
}
|
||||
|
||||
#ifdef HAVE_LIBTRACEEVENT
|
||||
static int perf_event__repipe_tracing_data(struct perf_session *session,
|
||||
union perf_event *event)
|
||||
{
|
||||
@ -614,6 +615,7 @@ static int perf_event__repipe_tracing_data(struct perf_session *session,
|
||||
|
||||
return perf_event__process_tracing_data(session, event);
|
||||
}
|
||||
#endif
|
||||
|
||||
static int dso__read_build_id(struct dso *dso)
|
||||
{
|
||||
@ -807,6 +809,7 @@ static int perf_inject__sched_switch(struct perf_tool *tool,
|
||||
return 0;
|
||||
}
|
||||
|
||||
#ifdef HAVE_LIBTRACEEVENT
|
||||
static int perf_inject__sched_stat(struct perf_tool *tool,
|
||||
union perf_event *event __maybe_unused,
|
||||
struct perf_sample *sample,
|
||||
@ -836,6 +839,7 @@ found:
|
||||
build_id__mark_dso_hit(tool, event_sw, &sample_sw, evsel, machine);
|
||||
return perf_event__repipe(tool, event_sw, &sample_sw, machine);
|
||||
}
|
||||
#endif
|
||||
|
||||
static struct guest_vcpu *guest_session__vcpu(struct guest_session *gs, u32 vcpu)
|
||||
{
|
||||
@ -1961,7 +1965,9 @@ static int __cmd_inject(struct perf_inject *inject)
|
||||
inject->tool.mmap = perf_event__repipe_mmap;
|
||||
inject->tool.mmap2 = perf_event__repipe_mmap2;
|
||||
inject->tool.fork = perf_event__repipe_fork;
|
||||
#ifdef HAVE_LIBTRACEEVENT
|
||||
inject->tool.tracing_data = perf_event__repipe_tracing_data;
|
||||
#endif
|
||||
}
|
||||
|
||||
output_data_offset = perf_session__data_offset(session->evlist);
|
||||
@ -1984,8 +1990,10 @@ static int __cmd_inject(struct perf_inject *inject)
|
||||
evsel->handler = perf_inject__sched_switch;
|
||||
} else if (!strcmp(name, "sched:sched_process_exit"))
|
||||
evsel->handler = perf_inject__sched_process_exit;
|
||||
#ifdef HAVE_LIBTRACEEVENT
|
||||
else if (!strncmp(name, "sched:sched_stat_", 17))
|
||||
evsel->handler = perf_inject__sched_stat;
|
||||
#endif
|
||||
}
|
||||
} else if (inject->itrace_synth_opts.vm_time_correlation) {
|
||||
session->itrace_synth_opts = &inject->itrace_synth_opts;
|
||||
|
@ -35,6 +35,7 @@
|
||||
#include <regex.h>
|
||||
|
||||
#include <linux/ctype.h>
|
||||
#include <traceevent/event-parse.h>
|
||||
|
||||
static int kmem_slab;
|
||||
static int kmem_page;
|
||||
|
@ -63,7 +63,7 @@ static const char *get_filename_for_perf_kvm(void)
|
||||
return filename;
|
||||
}
|
||||
|
||||
#ifdef HAVE_KVM_STAT_SUPPORT
|
||||
#if defined(HAVE_KVM_STAT_SUPPORT) && defined(HAVE_LIBTRACEEVENT)
|
||||
|
||||
void exit_event_get_key(struct evsel *evsel,
|
||||
struct perf_sample *sample,
|
||||
@ -654,7 +654,7 @@ static void print_result(struct perf_kvm_stat *kvm)
|
||||
pr_info("\nLost events: %" PRIu64 "\n\n", kvm->lost_events);
|
||||
}
|
||||
|
||||
#ifdef HAVE_TIMERFD_SUPPORT
|
||||
#if defined(HAVE_TIMERFD_SUPPORT) && defined(HAVE_LIBTRACEEVENT)
|
||||
static int process_lost_event(struct perf_tool *tool,
|
||||
union perf_event *event __maybe_unused,
|
||||
struct perf_sample *sample __maybe_unused,
|
||||
@ -742,7 +742,7 @@ static bool verify_vcpu(int vcpu)
|
||||
return true;
|
||||
}
|
||||
|
||||
#ifdef HAVE_TIMERFD_SUPPORT
|
||||
#if defined(HAVE_TIMERFD_SUPPORT) && defined(HAVE_LIBTRACEEVENT)
|
||||
/* keeping the max events to a modest level to keep
|
||||
* the processing of samples per mmap smooth.
|
||||
*/
|
||||
@ -1290,7 +1290,7 @@ kvm_events_report(struct perf_kvm_stat *kvm, int argc, const char **argv)
|
||||
return kvm_events_report_vcpu(kvm);
|
||||
}
|
||||
|
||||
#ifdef HAVE_TIMERFD_SUPPORT
|
||||
#if defined(HAVE_TIMERFD_SUPPORT) && defined(HAVE_LIBTRACEEVENT)
|
||||
static struct evlist *kvm_live_event_list(void)
|
||||
{
|
||||
struct evlist *evlist;
|
||||
@ -1507,7 +1507,7 @@ static int kvm_cmd_stat(const char *file_name, int argc, const char **argv)
|
||||
if (strlen(argv[1]) > 2 && strstarts("report", argv[1]))
|
||||
return kvm_events_report(&kvm, argc - 1 , argv + 1);
|
||||
|
||||
#ifdef HAVE_TIMERFD_SUPPORT
|
||||
#if defined(HAVE_TIMERFD_SUPPORT) && defined(HAVE_LIBTRACEEVENT)
|
||||
if (!strncmp(argv[1], "live", 4))
|
||||
return kvm_events_live(&kvm, argc - 1 , argv + 1);
|
||||
#endif
|
||||
@ -1644,7 +1644,7 @@ int cmd_kvm(int argc, const char **argv)
|
||||
return cmd_top(argc, argv);
|
||||
else if (strlen(argv[0]) > 2 && strstarts("buildid-list", argv[0]))
|
||||
return __cmd_buildid_list(file_name, argc, argv);
|
||||
#ifdef HAVE_KVM_STAT_SUPPORT
|
||||
#if defined(HAVE_KVM_STAT_SUPPORT) && defined(HAVE_LIBTRACEEVENT)
|
||||
else if (strlen(argv[0]) > 2 && strstarts("stat", argv[0]))
|
||||
return kvm_cmd_stat(file_name, argc, argv);
|
||||
#endif
|
||||
|
@ -23,6 +23,7 @@
|
||||
|
||||
#include <subcmd/pager.h>
|
||||
#include <subcmd/parse-options.h>
|
||||
#include <traceevent/event-parse.h>
|
||||
|
||||
#include <errno.h>
|
||||
#include <inttypes.h>
|
||||
|
@ -1701,8 +1701,10 @@ static void record__init_features(struct record *rec)
|
||||
if (rec->no_buildid)
|
||||
perf_header__clear_feat(&session->header, HEADER_BUILD_ID);
|
||||
|
||||
#ifdef HAVE_LIBTRACEEVENT
|
||||
if (!have_tracepoints(&rec->evlist->core.entries))
|
||||
perf_header__clear_feat(&session->header, HEADER_TRACING_DATA);
|
||||
#endif
|
||||
|
||||
if (!rec->opts.branch_stack)
|
||||
perf_header__clear_feat(&session->header, HEADER_BRANCH_STACK);
|
||||
|
@ -67,6 +67,10 @@
|
||||
#include <unistd.h>
|
||||
#include <linux/mman.h>
|
||||
|
||||
#ifdef HAVE_LIBTRACEEVENT
|
||||
#include <traceevent/event-parse.h>
|
||||
#endif
|
||||
|
||||
struct report {
|
||||
struct perf_tool tool;
|
||||
struct perf_session *session;
|
||||
@ -1199,7 +1203,9 @@ int cmd_report(int argc, const char **argv)
|
||||
.lost = perf_event__process_lost,
|
||||
.read = process_read_event,
|
||||
.attr = process_attr,
|
||||
#ifdef HAVE_LIBTRACEEVENT
|
||||
.tracing_data = perf_event__process_tracing_data,
|
||||
#endif
|
||||
.build_id = perf_event__process_build_id,
|
||||
.id_index = perf_event__process_id_index,
|
||||
.auxtrace_info = perf_event__process_auxtrace_info,
|
||||
@ -1660,6 +1666,7 @@ repeat:
|
||||
report.range_num);
|
||||
}
|
||||
|
||||
#ifdef HAVE_LIBTRACEEVENT
|
||||
if (session->tevent.pevent &&
|
||||
tep_set_function_resolver(session->tevent.pevent,
|
||||
machine__resolve_kernel_addr,
|
||||
@ -1668,7 +1675,7 @@ repeat:
|
||||
__func__);
|
||||
return -1;
|
||||
}
|
||||
|
||||
#endif
|
||||
sort__setup_elide(stdout);
|
||||
|
||||
ret = __cmd_report(&report);
|
||||
|
@ -62,6 +62,9 @@
|
||||
#include "perf.h"
|
||||
|
||||
#include <linux/ctype.h>
|
||||
#ifdef HAVE_LIBTRACEEVENT
|
||||
#include <traceevent/event-parse.h>
|
||||
#endif
|
||||
|
||||
static char const *script_name;
|
||||
static char const *generate_script_lang;
|
||||
@ -2154,12 +2157,12 @@ static void process_event(struct perf_script *script,
|
||||
perf_sample__fprintf_bts(sample, evsel, thread, al, addr_al, machine, fp);
|
||||
return;
|
||||
}
|
||||
|
||||
#ifdef HAVE_LIBTRACEEVENT
|
||||
if (PRINT_FIELD(TRACE) && sample->raw_data) {
|
||||
event_format__fprintf(evsel->tp_format, sample->cpu,
|
||||
sample->raw_data, sample->raw_size, fp);
|
||||
}
|
||||
|
||||
#endif
|
||||
if (attr->type == PERF_TYPE_SYNTH && PRINT_FIELD(SYNTH))
|
||||
perf_sample__fprintf_synth(sample, evsel, fp);
|
||||
|
||||
@ -2283,8 +2286,10 @@ static void process_stat_interval(u64 tstamp)
|
||||
|
||||
static void setup_scripting(void)
|
||||
{
|
||||
#ifdef HAVE_LIBTRACEEVENT
|
||||
setup_perl_scripting();
|
||||
setup_python_scripting();
|
||||
#endif
|
||||
}
|
||||
|
||||
static int flush_scripting(void)
|
||||
@ -3784,7 +3789,9 @@ int cmd_script(int argc, const char **argv)
|
||||
.fork = perf_event__process_fork,
|
||||
.attr = process_attr,
|
||||
.event_update = perf_event__process_event_update,
|
||||
#ifdef HAVE_LIBTRACEEVENT
|
||||
.tracing_data = perf_event__process_tracing_data,
|
||||
#endif
|
||||
.feature = process_feature_event,
|
||||
.build_id = perf_event__process_build_id,
|
||||
.id_index = perf_event__process_id_index,
|
||||
@ -4215,6 +4222,7 @@ script_found:
|
||||
else
|
||||
symbol_conf.use_callchain = false;
|
||||
|
||||
#ifdef HAVE_LIBTRACEEVENT
|
||||
if (session->tevent.pevent &&
|
||||
tep_set_function_resolver(session->tevent.pevent,
|
||||
machine__resolve_kernel_addr,
|
||||
@ -4223,7 +4231,7 @@ script_found:
|
||||
err = -1;
|
||||
goto out_delete;
|
||||
}
|
||||
|
||||
#endif
|
||||
if (generate_script_lang) {
|
||||
struct stat perf_stat;
|
||||
int input;
|
||||
@ -4259,9 +4267,12 @@ script_found:
|
||||
err = -ENOENT;
|
||||
goto out_delete;
|
||||
}
|
||||
|
||||
#ifdef HAVE_LIBTRACEEVENT
|
||||
err = scripting_ops->generate_script(session->tevent.pevent,
|
||||
"perf-script");
|
||||
#else
|
||||
err = scripting_ops->generate_script(NULL, "perf-script");
|
||||
#endif
|
||||
goto out_delete;
|
||||
}
|
||||
|
||||
|
@ -38,6 +38,7 @@
|
||||
#include "util/string2.h"
|
||||
#include "util/tracepoint.h"
|
||||
#include <linux/err.h>
|
||||
#include <traceevent/event-parse.h>
|
||||
|
||||
#ifdef LACKS_OPEN_MEMSTREAM_PROTOTYPE
|
||||
FILE *open_memstream(char **ptr, size_t *sizeloc);
|
||||
|
@ -15,7 +15,6 @@
|
||||
*/
|
||||
|
||||
#include "util/record.h"
|
||||
#include <traceevent/event-parse.h>
|
||||
#include <api/fs/tracing_path.h>
|
||||
#include <bpf/bpf.h>
|
||||
#include "util/bpf_map.h"
|
||||
@ -80,6 +79,10 @@
|
||||
#include <linux/ctype.h>
|
||||
#include <perf/mmap.h>
|
||||
|
||||
#ifdef HAVE_LIBTRACEEVENT
|
||||
#include <traceevent/event-parse.h>
|
||||
#endif
|
||||
|
||||
#ifndef O_CLOEXEC
|
||||
# define O_CLOEXEC 02000000
|
||||
#endif
|
||||
|
@ -82,6 +82,7 @@ static void library_status(void)
|
||||
STATUS(HAVE_AIO_SUPPORT, aio);
|
||||
STATUS(HAVE_ZSTD_SUPPORT, zstd);
|
||||
STATUS(HAVE_LIBPFM, libpfm4);
|
||||
STATUS(HAVE_LIBTRACEEVENT, libtraceevent);
|
||||
}
|
||||
|
||||
int cmd_version(int argc, const char **argv)
|
||||
|
@ -70,20 +70,26 @@ static struct cmd_struct commands[] = {
|
||||
{ "report", cmd_report, 0 },
|
||||
{ "bench", cmd_bench, 0 },
|
||||
{ "stat", cmd_stat, 0 },
|
||||
#ifdef HAVE_LIBTRACEEVENT
|
||||
{ "timechart", cmd_timechart, 0 },
|
||||
#endif
|
||||
{ "top", cmd_top, 0 },
|
||||
{ "annotate", cmd_annotate, 0 },
|
||||
{ "version", cmd_version, 0 },
|
||||
{ "script", cmd_script, 0 },
|
||||
#ifdef HAVE_LIBTRACEEVENT
|
||||
{ "sched", cmd_sched, 0 },
|
||||
#endif
|
||||
#ifdef HAVE_LIBELF_SUPPORT
|
||||
{ "probe", cmd_probe, 0 },
|
||||
#endif
|
||||
#ifdef HAVE_LIBTRACEEVENT
|
||||
{ "kmem", cmd_kmem, 0 },
|
||||
{ "lock", cmd_lock, 0 },
|
||||
#endif
|
||||
{ "kvm", cmd_kvm, 0 },
|
||||
{ "test", cmd_test, 0 },
|
||||
#if defined(HAVE_LIBAUDIT_SUPPORT) || defined(HAVE_SYSCALL_TABLE_SUPPORT)
|
||||
#if defined(HAVE_LIBTRACEEVENT) && (defined(HAVE_LIBAUDIT_SUPPORT) || defined(HAVE_SYSCALL_TABLE_SUPPORT))
|
||||
{ "trace", cmd_trace, 0 },
|
||||
#endif
|
||||
{ "inject", cmd_inject, 0 },
|
||||
@ -91,7 +97,9 @@ static struct cmd_struct commands[] = {
|
||||
{ "data", cmd_data, 0 },
|
||||
{ "ftrace", cmd_ftrace, 0 },
|
||||
{ "daemon", cmd_daemon, 0 },
|
||||
#ifdef HAVE_LIBTRACEEVENT
|
||||
{ "kwork", cmd_kwork, 0 },
|
||||
#endif
|
||||
};
|
||||
|
||||
struct pager_config {
|
||||
@ -500,14 +508,18 @@ int main(int argc, const char **argv)
|
||||
argv[0] = cmd;
|
||||
}
|
||||
if (strstarts(cmd, "trace")) {
|
||||
#if defined(HAVE_LIBAUDIT_SUPPORT) || defined(HAVE_SYSCALL_TABLE_SUPPORT)
|
||||
setup_path();
|
||||
argv[0] = "trace";
|
||||
return cmd_trace(argc, argv);
|
||||
#else
|
||||
#ifndef HAVE_LIBTRACEEVENT
|
||||
fprintf(stderr,
|
||||
"trace command not available: missing libtraceevent devel package at build time.\n");
|
||||
goto out;
|
||||
#elif !defined(HAVE_LIBAUDIT_SUPPORT) && !defined(HAVE_SYSCALL_TABLE_SUPPORT)
|
||||
fprintf(stderr,
|
||||
"trace command not available: missing audit-libs devel package at build time.\n");
|
||||
goto out;
|
||||
#else
|
||||
setup_path();
|
||||
argv[0] = "trace";
|
||||
return cmd_trace(argc, argv);
|
||||
#endif
|
||||
}
|
||||
/* Look for flags.. */
|
||||
|
@ -1,3 +1,3 @@
|
||||
perf-y += Context.o
|
||||
perf-$(CONFIG_LIBTRACEEVENT) += Context.o
|
||||
|
||||
CFLAGS_Context.o += $(PYTHON_EMBED_CCOPTS) -Wno-redundant-decls -Wno-strict-prototypes -Wno-unused-parameter -Wno-nested-externs
|
||||
|
@ -6,13 +6,13 @@ perf-y += parse-events.o
|
||||
perf-y += dso-data.o
|
||||
perf-y += attr.o
|
||||
perf-y += vmlinux-kallsyms.o
|
||||
perf-y += openat-syscall.o
|
||||
perf-y += openat-syscall-all-cpus.o
|
||||
perf-y += openat-syscall-tp-fields.o
|
||||
perf-y += mmap-basic.o
|
||||
perf-$(CONFIG_LIBTRACEEVENT) += openat-syscall.o
|
||||
perf-$(CONFIG_LIBTRACEEVENT) += openat-syscall-all-cpus.o
|
||||
perf-$(CONFIG_LIBTRACEEVENT) += openat-syscall-tp-fields.o
|
||||
perf-$(CONFIG_LIBTRACEEVENT) += mmap-basic.o
|
||||
perf-y += perf-record.o
|
||||
perf-y += evsel-roundtrip-name.o
|
||||
perf-y += evsel-tp-sched.o
|
||||
perf-$(CONFIG_LIBTRACEEVENT) += evsel-tp-sched.o
|
||||
perf-y += fdarray.o
|
||||
perf-y += pmu.o
|
||||
perf-y += pmu-events.o
|
||||
@ -30,7 +30,7 @@ perf-y += task-exit.o
|
||||
perf-y += sw-clock.o
|
||||
perf-y += mmap-thread-lookup.o
|
||||
perf-y += thread-maps-share.o
|
||||
perf-y += switch-tracking.o
|
||||
perf-$(CONFIG_LIBTRACEEVENT) += switch-tracking.o
|
||||
perf-y += keep-tracking.o
|
||||
perf-y += code-reading.o
|
||||
perf-y += sample-parsing.o
|
||||
|
@ -38,9 +38,11 @@ struct test_suite *__weak arch_tests[] = {
|
||||
|
||||
static struct test_suite *generic_tests[] = {
|
||||
&suite__vmlinux_matches_kallsyms,
|
||||
#ifdef HAVE_LIBTRACEEVENT
|
||||
&suite__openat_syscall_event,
|
||||
&suite__openat_syscall_event_on_all_cpus,
|
||||
&suite__basic_mmap,
|
||||
#endif
|
||||
&suite__mem,
|
||||
&suite__parse_events,
|
||||
&suite__expr,
|
||||
@ -51,8 +53,10 @@ static struct test_suite *generic_tests[] = {
|
||||
&suite__dso_data_cache,
|
||||
&suite__dso_data_reopen,
|
||||
&suite__perf_evsel__roundtrip_name_test,
|
||||
#ifdef HAVE_LIBTRACEEVENT
|
||||
&suite__perf_evsel__tp_sched_test,
|
||||
&suite__syscall_openat_tp_fields,
|
||||
#endif
|
||||
&suite__attr,
|
||||
&suite__hists_link,
|
||||
&suite__python_use,
|
||||
@ -71,7 +75,9 @@ static struct test_suite *generic_tests[] = {
|
||||
&suite__thread_maps_share,
|
||||
&suite__hists_output,
|
||||
&suite__hists_cumulate,
|
||||
#ifdef HAVE_LIBTRACEEVENT
|
||||
&suite__switch_tracking,
|
||||
#endif
|
||||
&suite__fdarray__filter,
|
||||
&suite__fdarray__add,
|
||||
&suite__kmod_path__parse,
|
||||
|
@ -20,6 +20,8 @@
|
||||
#define PERF_TP_SAMPLE_TYPE (PERF_SAMPLE_RAW | PERF_SAMPLE_TIME | \
|
||||
PERF_SAMPLE_CPU | PERF_SAMPLE_PERIOD)
|
||||
|
||||
#ifdef HAVE_LIBTRACEEVENT
|
||||
|
||||
#if defined(__s390x__)
|
||||
/* Return true if kvm module is available and loaded. Test this
|
||||
* and return success when trace point kvm_s390_create_vm
|
||||
@ -76,6 +78,7 @@ static int test__checkevent_tracepoint_multi(struct evlist *evlist)
|
||||
}
|
||||
return TEST_OK;
|
||||
}
|
||||
#endif /* HAVE_LIBTRACEEVENT */
|
||||
|
||||
static int test__checkevent_raw(struct evlist *evlist)
|
||||
{
|
||||
@ -222,6 +225,7 @@ static int test__checkevent_breakpoint_rw(struct evlist *evlist)
|
||||
return TEST_OK;
|
||||
}
|
||||
|
||||
#ifdef HAVE_LIBTRACEEVENT
|
||||
static int test__checkevent_tracepoint_modifier(struct evlist *evlist)
|
||||
{
|
||||
struct evsel *evsel = evlist__first(evlist);
|
||||
@ -252,6 +256,7 @@ test__checkevent_tracepoint_multi_modifier(struct evlist *evlist)
|
||||
|
||||
return test__checkevent_tracepoint_multi(evlist);
|
||||
}
|
||||
#endif /* HAVE_LIBTRACEEVENT */
|
||||
|
||||
static int test__checkevent_raw_modifier(struct evlist *evlist)
|
||||
{
|
||||
@ -453,6 +458,7 @@ static int test__checkevent_pmu(struct evlist *evlist)
|
||||
return TEST_OK;
|
||||
}
|
||||
|
||||
#ifdef HAVE_LIBTRACEEVENT
|
||||
static int test__checkevent_list(struct evlist *evlist)
|
||||
{
|
||||
struct evsel *evsel = evlist__first(evlist);
|
||||
@ -491,6 +497,7 @@ static int test__checkevent_list(struct evlist *evlist)
|
||||
|
||||
return TEST_OK;
|
||||
}
|
||||
#endif
|
||||
|
||||
static int test__checkevent_pmu_name(struct evlist *evlist)
|
||||
{
|
||||
@ -762,6 +769,7 @@ static int test__group2(struct evlist *evlist)
|
||||
return TEST_OK;
|
||||
}
|
||||
|
||||
#ifdef HAVE_LIBTRACEEVENT
|
||||
static int test__group3(struct evlist *evlist __maybe_unused)
|
||||
{
|
||||
struct evsel *evsel, *leader;
|
||||
@ -853,6 +861,7 @@ static int test__group3(struct evlist *evlist __maybe_unused)
|
||||
|
||||
return TEST_OK;
|
||||
}
|
||||
#endif
|
||||
|
||||
static int test__group4(struct evlist *evlist __maybe_unused)
|
||||
{
|
||||
@ -1460,6 +1469,7 @@ static int test__sym_event_dc(struct evlist *evlist)
|
||||
return TEST_OK;
|
||||
}
|
||||
|
||||
#ifdef HAVE_LIBTRACEEVENT
|
||||
static int count_tracepoints(void)
|
||||
{
|
||||
struct dirent *events_ent;
|
||||
@ -1513,6 +1523,7 @@ static int test__all_tracepoints(struct evlist *evlist)
|
||||
|
||||
return test__checkevent_tracepoint_multi(evlist);
|
||||
}
|
||||
#endif /* HAVE_LIBTRACEVENT */
|
||||
|
||||
static int test__hybrid_hw_event_with_pmu(struct evlist *evlist)
|
||||
{
|
||||
@ -1642,6 +1653,7 @@ struct evlist_test {
|
||||
};
|
||||
|
||||
static const struct evlist_test test__events[] = {
|
||||
#ifdef HAVE_LIBTRACEEVENT
|
||||
{
|
||||
.name = "syscalls:sys_enter_openat",
|
||||
.check = test__checkevent_tracepoint,
|
||||
@ -1652,6 +1664,7 @@ static const struct evlist_test test__events[] = {
|
||||
.check = test__checkevent_tracepoint_multi,
|
||||
/* 1 */
|
||||
},
|
||||
#endif
|
||||
{
|
||||
.name = "r1a",
|
||||
.check = test__checkevent_raw,
|
||||
@ -1702,6 +1715,7 @@ static const struct evlist_test test__events[] = {
|
||||
.check = test__checkevent_breakpoint_w,
|
||||
/* 1 */
|
||||
},
|
||||
#ifdef HAVE_LIBTRACEEVENT
|
||||
{
|
||||
.name = "syscalls:sys_enter_openat:k",
|
||||
.check = test__checkevent_tracepoint_modifier,
|
||||
@ -1712,6 +1726,7 @@ static const struct evlist_test test__events[] = {
|
||||
.check = test__checkevent_tracepoint_multi_modifier,
|
||||
/* 3 */
|
||||
},
|
||||
#endif
|
||||
{
|
||||
.name = "r1a:kp",
|
||||
.check = test__checkevent_raw_modifier,
|
||||
@ -1757,11 +1772,13 @@ static const struct evlist_test test__events[] = {
|
||||
.check = test__checkevent_breakpoint_w_modifier,
|
||||
/* 2 */
|
||||
},
|
||||
#ifdef HAVE_LIBTRACEEVENT
|
||||
{
|
||||
.name = "r1,syscalls:sys_enter_openat:k,1:1:hp",
|
||||
.check = test__checkevent_list,
|
||||
/* 3 */
|
||||
},
|
||||
#endif
|
||||
{
|
||||
.name = "instructions:G",
|
||||
.check = test__checkevent_exclude_host_modifier,
|
||||
@ -1792,11 +1809,13 @@ static const struct evlist_test test__events[] = {
|
||||
.check = test__group2,
|
||||
/* 9 */
|
||||
},
|
||||
#ifdef HAVE_LIBTRACEEVENT
|
||||
{
|
||||
.name = "group1{syscalls:sys_enter_openat:H,cycles:kppp},group2{cycles,1:3}:G,instructions:u",
|
||||
.check = test__group3,
|
||||
/* 0 */
|
||||
},
|
||||
#endif
|
||||
{
|
||||
.name = "{cycles:u,instructions:kp}:p",
|
||||
.check = test__group4,
|
||||
@ -1807,11 +1826,13 @@ static const struct evlist_test test__events[] = {
|
||||
.check = test__group5,
|
||||
/* 2 */
|
||||
},
|
||||
#ifdef HAVE_LIBTRACEEVENT
|
||||
{
|
||||
.name = "*:*",
|
||||
.check = test__all_tracepoints,
|
||||
/* 3 */
|
||||
},
|
||||
#endif
|
||||
{
|
||||
.name = "{cycles,cache-misses:G}:H",
|
||||
.check = test__group_gh1,
|
||||
@ -1867,7 +1888,7 @@ static const struct evlist_test test__events[] = {
|
||||
.check = test__checkevent_breakpoint_len_rw_modifier,
|
||||
/* 4 */
|
||||
},
|
||||
#if defined(__s390x__)
|
||||
#if defined(__s390x__) && defined(HAVE_LIBTRACEEVENT)
|
||||
{
|
||||
.name = "kvm-s390:kvm_s390_create_vm",
|
||||
.check = test__checkevent_tracepoint,
|
||||
|
@ -69,7 +69,6 @@ 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
|
||||
@ -77,11 +76,12 @@ perf-y += pmus.o
|
||||
perf-y += pmu-flex.o
|
||||
perf-y += pmu-bison.o
|
||||
perf-y += pmu-hybrid.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-$(CONFIG_LIBTRACEEVENT) += trace-event-info.o
|
||||
perf-$(CONFIG_LIBTRACEEVENT) += trace-event-scripting.o
|
||||
perf-$(CONFIG_LIBTRACEEVENT) += trace-event.o
|
||||
perf-$(CONFIG_LIBTRACEEVENT) += trace-event-parse.o
|
||||
perf-$(CONFIG_LIBTRACEEVENT) += trace-event-read.o
|
||||
perf-y += sort.o
|
||||
perf-y += hist.o
|
||||
perf-y += util.o
|
||||
@ -153,8 +153,12 @@ perf-$(CONFIG_PERF_BPF_SKEL) += bpf_counter.o
|
||||
perf-$(CONFIG_PERF_BPF_SKEL) += bpf_counter_cgroup.o
|
||||
perf-$(CONFIG_PERF_BPF_SKEL) += bpf_ftrace.o
|
||||
perf-$(CONFIG_PERF_BPF_SKEL) += bpf_off_cpu.o
|
||||
perf-$(CONFIG_PERF_BPF_SKEL) += bpf_kwork.o
|
||||
perf-$(CONFIG_PERF_BPF_SKEL) += bpf_lock_contention.o
|
||||
|
||||
ifeq ($(CONFIG_LIBTRACEEVENT),y)
|
||||
perf-$(CONFIG_PERF_BPF_SKEL) += bpf_kwork.o
|
||||
endif
|
||||
|
||||
perf-$(CONFIG_BPF_PROLOGUE) += bpf-prologue.o
|
||||
perf-$(CONFIG_LIBELF) += symbol-elf.o
|
||||
perf-$(CONFIG_LIBELF) += probe-file.o
|
||||
@ -189,7 +193,10 @@ perf-$(CONFIG_LIBUNWIND) += unwind-libunwind.o
|
||||
perf-$(CONFIG_LIBUNWIND_X86) += libunwind/x86_32.o
|
||||
perf-$(CONFIG_LIBUNWIND_AARCH64) += libunwind/arm64.o
|
||||
|
||||
perf-$(CONFIG_LIBBABELTRACE) += data-convert-bt.o
|
||||
ifeq ($(CONFIG_LIBTRACEEVENT),y)
|
||||
perf-$(CONFIG_LIBBABELTRACE) += data-convert-bt.o
|
||||
endif
|
||||
|
||||
perf-y += data-convert-json.o
|
||||
|
||||
perf-y += scripting-engines/
|
||||
|
@ -19,7 +19,6 @@
|
||||
#include <babeltrace/ctf-writer/event-fields.h>
|
||||
#include <babeltrace/ctf-ir/utils.h>
|
||||
#include <babeltrace/ctf/events.h>
|
||||
#include <traceevent/event-parse.h>
|
||||
#include "asm/bug.h"
|
||||
#include "data-convert.h"
|
||||
#include "session.h"
|
||||
@ -36,6 +35,10 @@
|
||||
#include "clockid.h"
|
||||
#include "util/sample.h"
|
||||
|
||||
#ifdef HAVE_LIBTRACEEVENT
|
||||
#include <traceevent/event-parse.h>
|
||||
#endif
|
||||
|
||||
#define pr_N(n, fmt, ...) \
|
||||
eprintf(n, debug_data_convert, fmt, ##__VA_ARGS__)
|
||||
|
||||
|
@ -27,6 +27,10 @@
|
||||
#include "util/thread.h"
|
||||
#include "util/tool.h"
|
||||
|
||||
#ifdef HAVE_LIBTRACEEVENT
|
||||
#include <traceevent/event-parse.h>
|
||||
#endif
|
||||
|
||||
struct convert_json {
|
||||
struct perf_tool tool;
|
||||
FILE *out;
|
||||
@ -217,6 +221,7 @@ static int process_sample_event(struct perf_tool *tool,
|
||||
}
|
||||
output_json_format(out, false, 3, "]");
|
||||
|
||||
#ifdef HAVE_LIBTRACEEVENT
|
||||
if (sample->raw_data) {
|
||||
int i;
|
||||
struct tep_format_field **fields;
|
||||
@ -236,7 +241,7 @@ static int process_sample_event(struct perf_tool *tool,
|
||||
free(fields);
|
||||
}
|
||||
}
|
||||
|
||||
#endif
|
||||
output_json_format(out, false, 2, "}");
|
||||
return 0;
|
||||
}
|
||||
@ -313,7 +318,9 @@ int bt_convert__perf2json(const char *input_name, const char *output_name,
|
||||
.exit = perf_event__process_exit,
|
||||
.fork = perf_event__process_fork,
|
||||
.lost = perf_event__process_lost,
|
||||
#ifdef HAVE_LIBTRACEEVENT
|
||||
.tracing_data = perf_event__process_tracing_data,
|
||||
#endif
|
||||
.build_id = perf_event__process_build_id,
|
||||
.id_index = perf_event__process_id_index,
|
||||
.auxtrace_info = perf_event__process_auxtrace_info,
|
||||
|
@ -290,6 +290,7 @@ struct evsel *evlist__add_aux_dummy(struct evlist *evlist, bool system_wide)
|
||||
return evsel;
|
||||
}
|
||||
|
||||
#ifdef HAVE_LIBTRACEEVENT
|
||||
struct evsel *evlist__add_sched_switch(struct evlist *evlist, bool system_wide)
|
||||
{
|
||||
struct evsel *evsel = evsel__newtp_idx("sched", "sched_switch", 0);
|
||||
@ -305,7 +306,8 @@ struct evsel *evlist__add_sched_switch(struct evlist *evlist, bool system_wide)
|
||||
|
||||
evlist__add(evlist, evsel);
|
||||
return evsel;
|
||||
};
|
||||
}
|
||||
#endif
|
||||
|
||||
int evlist__add_attrs(struct evlist *evlist, struct perf_event_attr *attrs, size_t nr_attrs)
|
||||
{
|
||||
@ -376,6 +378,7 @@ struct evsel *evlist__find_tracepoint_by_name(struct evlist *evlist, const char
|
||||
return NULL;
|
||||
}
|
||||
|
||||
#ifdef HAVE_LIBTRACEEVENT
|
||||
int evlist__add_newtp(struct evlist *evlist, const char *sys, const char *name, void *handler)
|
||||
{
|
||||
struct evsel *evsel = evsel__newtp(sys, name);
|
||||
@ -387,6 +390,7 @@ int evlist__add_newtp(struct evlist *evlist, const char *sys, const char *name,
|
||||
evlist__add(evlist, evsel);
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
struct evlist_cpu_iterator evlist__cpu_begin(struct evlist *evlist, struct affinity *affinity)
|
||||
{
|
||||
|
@ -127,7 +127,9 @@ static inline struct evsel *evlist__add_dummy_on_all_cpus(struct evlist *evlist)
|
||||
{
|
||||
return evlist__add_aux_dummy(evlist, true);
|
||||
}
|
||||
#ifdef HAVE_LIBTRACEEVENT
|
||||
struct evsel *evlist__add_sched_switch(struct evlist *evlist, bool system_wide);
|
||||
#endif
|
||||
|
||||
int evlist__add_sb_event(struct evlist *evlist, struct perf_event_attr *attr,
|
||||
evsel__sb_cb_t cb, void *data);
|
||||
@ -135,7 +137,9 @@ void evlist__set_cb(struct evlist *evlist, evsel__sb_cb_t cb, void *data);
|
||||
int evlist__start_sb_thread(struct evlist *evlist, struct target *target);
|
||||
void evlist__stop_sb_thread(struct evlist *evlist);
|
||||
|
||||
#ifdef HAVE_LIBTRACEEVENT
|
||||
int evlist__add_newtp(struct evlist *evlist, const char *sys, const char *name, void *handler);
|
||||
#endif
|
||||
|
||||
int __evlist__set_tracepoints_handlers(struct evlist *evlist,
|
||||
const struct evsel_str_handler *assocs,
|
||||
|
@ -12,7 +12,6 @@
|
||||
#include <linux/bitops.h>
|
||||
#include <api/fs/fs.h>
|
||||
#include <api/fs/tracing_path.h>
|
||||
#include <traceevent/event-parse.h>
|
||||
#include <linux/hw_breakpoint.h>
|
||||
#include <linux/perf_event.h>
|
||||
#include <linux/compiler.h>
|
||||
@ -57,6 +56,10 @@
|
||||
|
||||
#include <linux/ctype.h>
|
||||
|
||||
#ifdef HAVE_LIBTRACEEVENT
|
||||
#include <traceevent/event-parse.h>
|
||||
#endif
|
||||
|
||||
struct perf_missing_features perf_missing_features;
|
||||
|
||||
static clockid_t clockid;
|
||||
@ -439,7 +442,9 @@ struct evsel *evsel__clone(struct evsel *orig)
|
||||
goto out_err;
|
||||
}
|
||||
evsel->cgrp = cgroup__get(orig->cgrp);
|
||||
#ifdef HAVE_LIBTRACEEVENT
|
||||
evsel->tp_format = orig->tp_format;
|
||||
#endif
|
||||
evsel->handler = orig->handler;
|
||||
evsel->core.leader = orig->core.leader;
|
||||
|
||||
@ -479,6 +484,7 @@ out_err:
|
||||
/*
|
||||
* Returns pointer with encoded error via <linux/err.h> interface.
|
||||
*/
|
||||
#ifdef HAVE_LIBTRACEEVENT
|
||||
struct evsel *evsel__newtp_idx(const char *sys, const char *name, int idx)
|
||||
{
|
||||
struct evsel *evsel = zalloc(perf_evsel__object.size);
|
||||
@ -516,6 +522,7 @@ out_free:
|
||||
out_err:
|
||||
return ERR_PTR(err);
|
||||
}
|
||||
#endif
|
||||
|
||||
const char *const evsel__hw_names[PERF_COUNT_HW_MAX] = {
|
||||
"cycles",
|
||||
@ -2758,6 +2765,7 @@ u16 evsel__id_hdr_size(struct evsel *evsel)
|
||||
return size;
|
||||
}
|
||||
|
||||
#ifdef HAVE_LIBTRACEEVENT
|
||||
struct tep_format_field *evsel__field(struct evsel *evsel, const char *name)
|
||||
{
|
||||
return tep_find_field(evsel->tp_format, name);
|
||||
@ -2831,6 +2839,7 @@ u64 evsel__intval(struct evsel *evsel, struct perf_sample *sample, const char *n
|
||||
|
||||
return field ? format_field__intval(field, sample, evsel->needs_swap) : 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
bool evsel__fallback(struct evsel *evsel, int err, char *msg, size_t msgsize)
|
||||
{
|
||||
|
@ -72,7 +72,9 @@ struct evsel {
|
||||
char *name;
|
||||
char *group_name;
|
||||
const char *pmu_name;
|
||||
#ifdef HAVE_LIBTRACEEVENT
|
||||
struct tep_event *tp_format;
|
||||
#endif
|
||||
char *filter;
|
||||
unsigned long max_events;
|
||||
double scale;
|
||||
@ -223,11 +225,14 @@ static inline struct evsel *evsel__new(struct perf_event_attr *attr)
|
||||
}
|
||||
|
||||
struct evsel *evsel__clone(struct evsel *orig);
|
||||
struct evsel *evsel__newtp_idx(const char *sys, const char *name, int idx);
|
||||
|
||||
int copy_config_terms(struct list_head *dst, struct list_head *src);
|
||||
void free_config_terms(struct list_head *config_terms);
|
||||
|
||||
|
||||
#ifdef HAVE_LIBTRACEEVENT
|
||||
struct evsel *evsel__newtp_idx(const char *sys, const char *name, int idx);
|
||||
|
||||
/*
|
||||
* Returns pointer with encoded error via <linux/err.h> interface.
|
||||
*/
|
||||
@ -235,10 +240,13 @@ static inline struct evsel *evsel__newtp(const char *sys, const char *name)
|
||||
{
|
||||
return evsel__newtp_idx(sys, name, 0);
|
||||
}
|
||||
#endif
|
||||
|
||||
struct evsel *evsel__new_cycles(bool precise, __u32 type, __u64 config);
|
||||
|
||||
#ifdef HAVE_LIBTRACEEVENT
|
||||
struct tep_event *event_format__new(const char *sys, const char *name);
|
||||
#endif
|
||||
|
||||
void evsel__init(struct evsel *evsel, struct perf_event_attr *attr, int idx);
|
||||
void evsel__exit(struct evsel *evsel);
|
||||
@ -323,6 +331,7 @@ bool evsel__precise_ip_fallback(struct evsel *evsel);
|
||||
|
||||
struct perf_sample;
|
||||
|
||||
#ifdef HAVE_LIBTRACEEVENT
|
||||
void *evsel__rawptr(struct evsel *evsel, struct perf_sample *sample, const char *name);
|
||||
u64 evsel__intval(struct evsel *evsel, struct perf_sample *sample, const char *name);
|
||||
|
||||
@ -330,6 +339,7 @@ static inline char *evsel__strval(struct evsel *evsel, struct perf_sample *sampl
|
||||
{
|
||||
return evsel__rawptr(evsel, sample, name);
|
||||
}
|
||||
#endif
|
||||
|
||||
struct tep_format_field;
|
||||
|
||||
|
@ -2,7 +2,6 @@
|
||||
#include <inttypes.h>
|
||||
#include <stdio.h>
|
||||
#include <stdbool.h>
|
||||
#include <traceevent/event-parse.h>
|
||||
#include "evsel.h"
|
||||
#include "util/evsel_fprintf.h"
|
||||
#include "util/event.h"
|
||||
@ -13,6 +12,10 @@
|
||||
#include "srcline.h"
|
||||
#include "dso.h"
|
||||
|
||||
#ifdef HAVE_LIBTRACEEVENT
|
||||
#include <traceevent/event-parse.h>
|
||||
#endif
|
||||
|
||||
static int comma_fprintf(FILE *fp, bool *first, const char *fmt, ...)
|
||||
{
|
||||
va_list args;
|
||||
@ -74,6 +77,7 @@ int evsel__fprintf(struct evsel *evsel, struct perf_attr_details *details, FILE
|
||||
term, (u64)evsel->core.attr.sample_freq);
|
||||
}
|
||||
|
||||
#ifdef HAVE_LIBTRACEEVENT
|
||||
if (details->trace_fields) {
|
||||
struct tep_format_field *field;
|
||||
|
||||
@ -96,6 +100,7 @@ int evsel__fprintf(struct evsel *evsel, struct perf_attr_details *details, FILE
|
||||
field = field->next;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
out:
|
||||
fputc('\n', fp);
|
||||
return ++printed;
|
||||
|
@ -6,6 +6,7 @@
|
||||
#include <sys/types.h>
|
||||
#include <byteswap.h>
|
||||
#include <unistd.h>
|
||||
#include <regex.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <linux/compiler.h>
|
||||
@ -55,6 +56,10 @@
|
||||
#include <linux/ctype.h>
|
||||
#include <internal/lib.h>
|
||||
|
||||
#ifdef HAVE_LIBTRACEEVENT
|
||||
#include <traceevent/event-parse.h>
|
||||
#endif
|
||||
|
||||
/*
|
||||
* magic2 = "PERFILE2"
|
||||
* must be a numerical value to let the endianness
|
||||
@ -298,6 +303,7 @@ static int do_read_bitmap(struct feat_fd *ff, unsigned long **pset, u64 *psize)
|
||||
return 0;
|
||||
}
|
||||
|
||||
#ifdef HAVE_LIBTRACEEVENT
|
||||
static int write_tracing_data(struct feat_fd *ff,
|
||||
struct evlist *evlist)
|
||||
{
|
||||
@ -306,6 +312,7 @@ static int write_tracing_data(struct feat_fd *ff,
|
||||
|
||||
return read_tracing_data(ff->fd, &evlist->core.entries);
|
||||
}
|
||||
#endif
|
||||
|
||||
static int write_build_id(struct feat_fd *ff,
|
||||
struct evlist *evlist __maybe_unused)
|
||||
@ -2394,12 +2401,14 @@ FEAT_PROCESS_STR_FUN(arch, arch);
|
||||
FEAT_PROCESS_STR_FUN(cpudesc, cpu_desc);
|
||||
FEAT_PROCESS_STR_FUN(cpuid, cpuid);
|
||||
|
||||
#ifdef HAVE_LIBTRACEEVENT
|
||||
static int process_tracing_data(struct feat_fd *ff, void *data)
|
||||
{
|
||||
ssize_t ret = trace_report(ff->fd, data, false);
|
||||
|
||||
return ret < 0 ? -1 : 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
static int process_build_id(struct feat_fd *ff, void *data __maybe_unused)
|
||||
{
|
||||
@ -3366,7 +3375,9 @@ err:
|
||||
const struct perf_header_feature_ops feat_ops[HEADER_LAST_FEATURE];
|
||||
|
||||
const struct perf_header_feature_ops feat_ops[HEADER_LAST_FEATURE] = {
|
||||
#ifdef HAVE_LIBTRACEEVENT
|
||||
FEAT_OPN(TRACING_DATA, tracing_data, false),
|
||||
#endif
|
||||
FEAT_OPN(BUILD_ID, build_id, false),
|
||||
FEAT_OPR(HOSTNAME, hostname, false),
|
||||
FEAT_OPR(OSRELEASE, osrelease, false),
|
||||
@ -4082,6 +4093,7 @@ static int read_attr(int fd, struct perf_header *ph,
|
||||
return ret <= 0 ? -1 : 0;
|
||||
}
|
||||
|
||||
#ifdef HAVE_LIBTRACEEVENT
|
||||
static int evsel__prepare_tracepoint_event(struct evsel *evsel, struct tep_handle *pevent)
|
||||
{
|
||||
struct tep_event *event;
|
||||
@ -4125,6 +4137,7 @@ static int evlist__prepare_tracepoint_events(struct evlist *evlist, struct tep_h
|
||||
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
int perf_session__read_header(struct perf_session *session, int repipe_fd)
|
||||
{
|
||||
@ -4230,11 +4243,15 @@ int perf_session__read_header(struct perf_session *session, int repipe_fd)
|
||||
lseek(fd, tmp, SEEK_SET);
|
||||
}
|
||||
|
||||
#ifdef HAVE_LIBTRACEEVENT
|
||||
perf_header__process_sections(header, fd, &session->tevent,
|
||||
perf_file_section__process);
|
||||
|
||||
if (evlist__prepare_tracepoint_events(session->evlist, session->tevent.pevent))
|
||||
goto out_delete_evlist;
|
||||
#else
|
||||
perf_header__process_sections(header, fd, NULL, perf_file_section__process);
|
||||
#endif
|
||||
|
||||
return 0;
|
||||
out_errno:
|
||||
@ -4412,6 +4429,7 @@ int perf_event__process_event_update(struct perf_tool *tool __maybe_unused,
|
||||
return 0;
|
||||
}
|
||||
|
||||
#ifdef HAVE_LIBTRACEEVENT
|
||||
int perf_event__process_tracing_data(struct perf_session *session,
|
||||
union perf_event *event)
|
||||
{
|
||||
@ -4459,6 +4477,7 @@ int perf_event__process_tracing_data(struct perf_session *session,
|
||||
|
||||
return size_read + padding;
|
||||
}
|
||||
#endif
|
||||
|
||||
int perf_event__process_build_id(struct perf_session *session,
|
||||
union perf_event *event)
|
||||
|
@ -160,8 +160,10 @@ int perf_event__process_event_update(struct perf_tool *tool,
|
||||
union perf_event *event,
|
||||
struct evlist **pevlist);
|
||||
size_t perf_event__fprintf_event_update(union perf_event *event, FILE *fp);
|
||||
#ifdef HAVE_LIBTRACEEVENT
|
||||
int perf_event__process_tracing_data(struct perf_session *session,
|
||||
union perf_event *event);
|
||||
#endif
|
||||
int perf_event__process_build_id(struct perf_session *session,
|
||||
union perf_event *event);
|
||||
bool is_perf_magic(u64 magic);
|
||||
|
@ -3142,6 +3142,7 @@ static int intel_pt_sync_switch(struct intel_pt *pt, int cpu, pid_t tid,
|
||||
return 1;
|
||||
}
|
||||
|
||||
#ifdef HAVE_LIBTRACEEVENT
|
||||
static int intel_pt_process_switch(struct intel_pt *pt,
|
||||
struct perf_sample *sample)
|
||||
{
|
||||
@ -3165,6 +3166,7 @@ static int intel_pt_process_switch(struct intel_pt *pt,
|
||||
|
||||
return machine__set_current_tid(pt->machine, cpu, -1, tid);
|
||||
}
|
||||
#endif /* HAVE_LIBTRACEEVENT */
|
||||
|
||||
static int intel_pt_context_switch_in(struct intel_pt *pt,
|
||||
struct perf_sample *sample)
|
||||
@ -3433,9 +3435,12 @@ static int intel_pt_process_event(struct perf_session *session,
|
||||
return err;
|
||||
}
|
||||
|
||||
#ifdef HAVE_LIBTRACEEVENT
|
||||
if (pt->switch_evsel && event->header.type == PERF_RECORD_SAMPLE)
|
||||
err = intel_pt_process_switch(pt, sample);
|
||||
else if (event->header.type == PERF_RECORD_ITRACE_START)
|
||||
else
|
||||
#endif
|
||||
if (event->header.type == PERF_RECORD_ITRACE_START)
|
||||
err = intel_pt_process_itrace_start(pt, event, sample);
|
||||
else if (event->header.type == PERF_RECORD_AUX_OUTPUT_HW_ID)
|
||||
err = intel_pt_process_aux_output_hw_id(pt, event, sample);
|
||||
|
@ -445,6 +445,7 @@ out_free_terms:
|
||||
return ret;
|
||||
}
|
||||
|
||||
#ifdef HAVE_LIBTRACEEVENT
|
||||
static void tracepoint_error(struct parse_events_error *e, int err,
|
||||
const char *sys, const char *name)
|
||||
{
|
||||
@ -593,6 +594,7 @@ static int add_tracepoint_multi_sys(struct list_head *list, int *idx,
|
||||
closedir(events_dir);
|
||||
return ret;
|
||||
}
|
||||
#endif /* HAVE_LIBTRACEEVENT */
|
||||
|
||||
#ifdef HAVE_LIBBPF_SUPPORT
|
||||
struct __add_bpf_event_param {
|
||||
@ -1143,6 +1145,7 @@ static int config_term_pmu(struct perf_event_attr *attr,
|
||||
return config_term_common(attr, term, err);
|
||||
}
|
||||
|
||||
#ifdef HAVE_LIBTRACEEVENT
|
||||
static int config_term_tracepoint(struct perf_event_attr *attr,
|
||||
struct parse_events_term *term,
|
||||
struct parse_events_error *err)
|
||||
@ -1170,6 +1173,7 @@ static int config_term_tracepoint(struct perf_event_attr *attr,
|
||||
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
static int config_attr(struct perf_event_attr *attr,
|
||||
struct list_head *head,
|
||||
@ -1325,6 +1329,7 @@ int parse_events_add_tracepoint(struct list_head *list, int *idx,
|
||||
struct parse_events_error *err,
|
||||
struct list_head *head_config)
|
||||
{
|
||||
#ifdef HAVE_LIBTRACEEVENT
|
||||
if (head_config) {
|
||||
struct perf_event_attr attr;
|
||||
|
||||
@ -1339,6 +1344,16 @@ int parse_events_add_tracepoint(struct list_head *list, int *idx,
|
||||
else
|
||||
return add_tracepoint_event(list, idx, sys, event,
|
||||
err, head_config);
|
||||
#else
|
||||
(void)list;
|
||||
(void)idx;
|
||||
(void)sys;
|
||||
(void)event;
|
||||
(void)head_config;
|
||||
parse_events_error__handle(err, 0, strdup("unsupported tracepoint"),
|
||||
strdup("libtraceevent is necessary for tracepoint support"));
|
||||
return -1;
|
||||
#endif
|
||||
}
|
||||
|
||||
int parse_events_add_numeric(struct parse_events_state *parse_state,
|
||||
|
@ -18,7 +18,6 @@ struct parse_events_error;
|
||||
struct option;
|
||||
struct perf_pmu;
|
||||
|
||||
bool have_tracepoints(struct list_head *evlist);
|
||||
bool is_event_supported(u8 type, u64 config);
|
||||
|
||||
const char *event_type(int type);
|
||||
|
@ -5,7 +5,9 @@
|
||||
#include <poll.h>
|
||||
#include <linux/err.h>
|
||||
#include <perf/cpumap.h>
|
||||
#ifdef HAVE_LIBTRACEEVENT
|
||||
#include <traceevent/event-parse.h>
|
||||
#endif
|
||||
#include <perf/mmap.h>
|
||||
#include "evlist.h"
|
||||
#include "callchain.h"
|
||||
@ -417,6 +419,7 @@ static PyObject *pyrf_sample_event__repr(struct pyrf_event *pevent)
|
||||
return ret;
|
||||
}
|
||||
|
||||
#ifdef HAVE_LIBTRACEEVENT
|
||||
static bool is_tracepoint(struct pyrf_event *pevent)
|
||||
{
|
||||
return pevent->evsel->core.attr.type == PERF_TYPE_TRACEPOINT;
|
||||
@ -486,14 +489,17 @@ get_tracepoint_field(struct pyrf_event *pevent, PyObject *attr_name)
|
||||
|
||||
return tracepoint_field(pevent, field);
|
||||
}
|
||||
#endif /* HAVE_LIBTRACEEVENT */
|
||||
|
||||
static PyObject*
|
||||
pyrf_sample_event__getattro(struct pyrf_event *pevent, PyObject *attr_name)
|
||||
{
|
||||
PyObject *obj = NULL;
|
||||
|
||||
#ifdef HAVE_LIBTRACEEVENT
|
||||
if (is_tracepoint(pevent))
|
||||
obj = get_tracepoint_field(pevent, attr_name);
|
||||
#endif
|
||||
|
||||
return obj ?: PyObject_GenericGetAttr((PyObject *) pevent, attr_name);
|
||||
}
|
||||
@ -1326,6 +1332,9 @@ static struct {
|
||||
static PyObject *pyrf__tracepoint(struct pyrf_evsel *pevsel,
|
||||
PyObject *args, PyObject *kwargs)
|
||||
{
|
||||
#ifndef HAVE_LIBTRACEEVENT
|
||||
return NULL;
|
||||
#else
|
||||
struct tep_event *tp_format;
|
||||
static char *kwlist[] = { "sys", "name", NULL };
|
||||
char *sys = NULL;
|
||||
@ -1340,6 +1349,7 @@ static PyObject *pyrf__tracepoint(struct pyrf_evsel *pevsel,
|
||||
return _PyLong_FromLong(-1);
|
||||
|
||||
return _PyLong_FromLong(tp_format->id);
|
||||
#endif // HAVE_LIBTRACEEVENT
|
||||
}
|
||||
|
||||
static PyMethodDef perf__methods[] = {
|
||||
|
@ -1,5 +1,7 @@
|
||||
perf-$(CONFIG_LIBPERL) += trace-event-perl.o
|
||||
perf-$(CONFIG_LIBPYTHON) += trace-event-python.o
|
||||
ifeq ($(CONFIG_LIBTRACEEVENT),y)
|
||||
perf-$(CONFIG_LIBPERL) += trace-event-perl.o
|
||||
perf-$(CONFIG_LIBPYTHON) += trace-event-python.o
|
||||
endif
|
||||
|
||||
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 -Wno-bad-function-cast -Wno-declaration-after-statement -Wno-switch-enum
|
||||
|
||||
|
@ -27,6 +27,7 @@
|
||||
#include <errno.h>
|
||||
#include <linux/bitmap.h>
|
||||
#include <linux/time64.h>
|
||||
#include <traceevent/event-parse.h>
|
||||
|
||||
#include <stdbool.h>
|
||||
/* perl needs the following define, right after including stdbool.h */
|
||||
|
@ -30,6 +30,7 @@
|
||||
#include <linux/bitmap.h>
|
||||
#include <linux/compiler.h>
|
||||
#include <linux/time64.h>
|
||||
#include <traceevent/event-parse.h>
|
||||
|
||||
#include "../build-id.h"
|
||||
#include "../counts.h"
|
||||
|
@ -314,7 +314,9 @@ void perf_session__delete(struct perf_session *session)
|
||||
evlist__delete(session->evlist);
|
||||
perf_data__close(session->data);
|
||||
}
|
||||
#ifdef HAVE_LIBTRACEEVENT
|
||||
trace_event__cleanup(&session->tevent);
|
||||
#endif
|
||||
free(session);
|
||||
}
|
||||
|
||||
|
@ -33,7 +33,9 @@ struct perf_session {
|
||||
struct auxtrace *auxtrace;
|
||||
struct itrace_synth_opts *itrace_synth_opts;
|
||||
struct list_head auxtrace_index;
|
||||
#ifdef HAVE_LIBTRACEEVENT
|
||||
struct trace_event tevent;
|
||||
#endif
|
||||
struct perf_record_time_conv time_conv;
|
||||
bool repipe;
|
||||
bool one_mmap;
|
||||
|
@ -63,12 +63,18 @@ libperf = getenv('LIBPERF')
|
||||
ext_sources = [f.strip() for f in open('util/python-ext-sources')
|
||||
if len(f.strip()) > 0 and f[0] != '#']
|
||||
|
||||
extra_libraries = []
|
||||
|
||||
if '-DHAVE_LIBTRACEEVENT' in cflags:
|
||||
extra_libraries += [ 'traceevent' ]
|
||||
else:
|
||||
ext_sources.remove('util/trace-event.c')
|
||||
|
||||
# use full paths with source files
|
||||
ext_sources = list(map(lambda x: '%s/%s' % (src_perf, x) , ext_sources))
|
||||
|
||||
extra_libraries = []
|
||||
if '-DHAVE_LIBNUMA_SUPPORT' in cflags:
|
||||
extra_libraries = [ 'numa' ]
|
||||
extra_libraries += [ 'numa' ]
|
||||
if '-DHAVE_LIBCAP_SUPPORT' in cflags:
|
||||
extra_libraries += [ 'cap' ]
|
||||
|
||||
|
@ -22,7 +22,6 @@
|
||||
#include "srcline.h"
|
||||
#include "strlist.h"
|
||||
#include "strbuf.h"
|
||||
#include <traceevent/event-parse.h>
|
||||
#include "mem-events.h"
|
||||
#include "annotate.h"
|
||||
#include "event.h"
|
||||
@ -32,6 +31,10 @@
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/string.h>
|
||||
|
||||
#ifdef HAVE_LIBTRACEEVENT
|
||||
#include <traceevent/event-parse.h>
|
||||
#endif
|
||||
|
||||
regex_t parent_regex;
|
||||
const char default_parent_pattern[] = "^sys_|^do_page_fault";
|
||||
const char *parent_pattern = default_parent_pattern;
|
||||
@ -743,6 +746,7 @@ struct sort_entry sort_time = {
|
||||
|
||||
/* --sort trace */
|
||||
|
||||
#ifdef HAVE_LIBTRACEEVENT
|
||||
static char *get_trace_output(struct hist_entry *he)
|
||||
{
|
||||
struct trace_seq seq;
|
||||
@ -806,6 +810,7 @@ struct sort_entry sort_trace = {
|
||||
.se_snprintf = hist_entry__trace_snprintf,
|
||||
.se_width_idx = HISTC_TRACE,
|
||||
};
|
||||
#endif /* HAVE_LIBTRACEEVENT */
|
||||
|
||||
/* sort keys for branch stacks */
|
||||
|
||||
@ -2022,7 +2027,9 @@ static struct sort_dimension common_sort_dimensions[] = {
|
||||
DIM(SORT_LOCAL_WEIGHT, "local_weight", sort_local_weight),
|
||||
DIM(SORT_GLOBAL_WEIGHT, "weight", sort_global_weight),
|
||||
DIM(SORT_TRANSACTION, "transaction", sort_transaction),
|
||||
#ifdef HAVE_LIBTRACEEVENT
|
||||
DIM(SORT_TRACE, "trace", sort_trace),
|
||||
#endif
|
||||
DIM(SORT_SYM_SIZE, "symbol_size", sort_sym_size),
|
||||
DIM(SORT_DSO_SIZE, "dso_size", sort_dso_size),
|
||||
DIM(SORT_CGROUP, "cgroup", sort_cgroup),
|
||||
@ -2206,7 +2213,14 @@ bool perf_hpp__is_ ## key ## _entry(struct perf_hpp_fmt *fmt) \
|
||||
return hse->se == &sort_ ## key ; \
|
||||
}
|
||||
|
||||
#ifdef HAVE_LIBTRACEEVENT
|
||||
MK_SORT_ENTRY_CHK(trace)
|
||||
#else
|
||||
bool perf_hpp__is_trace_entry(struct perf_hpp_fmt *fmt __maybe_unused)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
#endif
|
||||
MK_SORT_ENTRY_CHK(srcline)
|
||||
MK_SORT_ENTRY_CHK(srcfile)
|
||||
MK_SORT_ENTRY_CHK(thread)
|
||||
@ -2347,6 +2361,17 @@ static int __sort_dimension__add_hpp_output(struct sort_dimension *sd,
|
||||
return 0;
|
||||
}
|
||||
|
||||
#ifndef HAVE_LIBTRACEEVENT
|
||||
bool perf_hpp__is_dynamic_entry(struct perf_hpp_fmt *fmt __maybe_unused)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
bool perf_hpp__defined_dynamic_entry(struct perf_hpp_fmt *fmt __maybe_unused,
|
||||
struct hists *hists __maybe_unused)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
#else
|
||||
struct hpp_dynamic_entry {
|
||||
struct perf_hpp_fmt hpp;
|
||||
struct evsel *evsel;
|
||||
@ -2621,6 +2646,7 @@ __alloc_dynamic_entry(struct evsel *evsel, struct tep_format_field *field,
|
||||
|
||||
return hde;
|
||||
}
|
||||
#endif /* HAVE_LIBTRACEEVENT */
|
||||
|
||||
struct perf_hpp_fmt *perf_hpp_fmt__dup(struct perf_hpp_fmt *fmt)
|
||||
{
|
||||
@ -2633,6 +2659,7 @@ struct perf_hpp_fmt *perf_hpp_fmt__dup(struct perf_hpp_fmt *fmt)
|
||||
new_hse = memdup(hse, sizeof(*hse));
|
||||
if (new_hse)
|
||||
new_fmt = &new_hse->hpp;
|
||||
#ifdef HAVE_LIBTRACEEVENT
|
||||
} else if (perf_hpp__is_dynamic_entry(fmt)) {
|
||||
struct hpp_dynamic_entry *hde, *new_hde;
|
||||
|
||||
@ -2640,6 +2667,7 @@ struct perf_hpp_fmt *perf_hpp_fmt__dup(struct perf_hpp_fmt *fmt)
|
||||
new_hde = memdup(hde, sizeof(*hde));
|
||||
if (new_hde)
|
||||
new_fmt = &new_hde->hpp;
|
||||
#endif
|
||||
} else {
|
||||
new_fmt = memdup(fmt, sizeof(*fmt));
|
||||
}
|
||||
@ -2719,6 +2747,7 @@ static struct evsel *find_evsel(struct evlist *evlist, char *event_name)
|
||||
return evsel;
|
||||
}
|
||||
|
||||
#ifdef HAVE_LIBTRACEEVENT
|
||||
static int __dynamic_dimension__add(struct evsel *evsel,
|
||||
struct tep_format_field *field,
|
||||
bool raw_trace, int level)
|
||||
@ -2789,13 +2818,13 @@ static int add_all_matching_fields(struct evlist *evlist,
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
#endif /* HAVE_LIBTRACEEVENT */
|
||||
|
||||
static int add_dynamic_entry(struct evlist *evlist, const char *tok,
|
||||
int level)
|
||||
{
|
||||
char *str, *event_name, *field_name, *opt_name;
|
||||
struct evsel *evsel;
|
||||
struct tep_format_field *field;
|
||||
bool raw_trace = symbol_conf.raw_trace;
|
||||
int ret = 0;
|
||||
|
||||
@ -2820,6 +2849,7 @@ static int add_dynamic_entry(struct evlist *evlist, const char *tok,
|
||||
raw_trace = true;
|
||||
}
|
||||
|
||||
#ifdef HAVE_LIBTRACEEVENT
|
||||
if (!strcmp(field_name, "trace_fields")) {
|
||||
ret = add_all_dynamic_fields(evlist, raw_trace, level);
|
||||
goto out;
|
||||
@ -2829,6 +2859,7 @@ static int add_dynamic_entry(struct evlist *evlist, const char *tok,
|
||||
ret = add_all_matching_fields(evlist, field_name, raw_trace, level);
|
||||
goto out;
|
||||
}
|
||||
#endif
|
||||
|
||||
evsel = find_evsel(evlist, event_name);
|
||||
if (evsel == NULL) {
|
||||
@ -2843,10 +2874,12 @@ static int add_dynamic_entry(struct evlist *evlist, const char *tok,
|
||||
goto out;
|
||||
}
|
||||
|
||||
#ifdef HAVE_LIBTRACEEVENT
|
||||
if (!strcmp(field_name, "*")) {
|
||||
ret = add_evsel_fields(evsel, raw_trace, level);
|
||||
} else {
|
||||
field = tep_find_any_field(evsel->tp_format, field_name);
|
||||
struct tep_format_field *field = tep_find_any_field(evsel->tp_format, field_name);
|
||||
|
||||
if (field == NULL) {
|
||||
pr_debug("Cannot find event field for %s.%s\n",
|
||||
event_name, field_name);
|
||||
@ -2855,6 +2888,10 @@ static int add_dynamic_entry(struct evlist *evlist, const char *tok,
|
||||
|
||||
ret = __dynamic_dimension__add(evsel, field, raw_trace, level);
|
||||
}
|
||||
#else
|
||||
(void)level;
|
||||
(void)raw_trace;
|
||||
#endif /* HAVE_LIBTRACEEVENT */
|
||||
|
||||
out:
|
||||
free(str);
|
||||
@ -2955,11 +2992,11 @@ int sort_dimension__add(struct perf_hpp_list *list, const char *tok,
|
||||
for (i = 0; i < ARRAY_SIZE(common_sort_dimensions); i++) {
|
||||
struct sort_dimension *sd = &common_sort_dimensions[i];
|
||||
|
||||
if (strncasecmp(tok, sd->name, strlen(tok)))
|
||||
if (!sd->name || strncasecmp(tok, sd->name, strlen(tok)))
|
||||
continue;
|
||||
|
||||
for (j = 0; j < ARRAY_SIZE(dynamic_headers); j++) {
|
||||
if (!strcmp(dynamic_headers[j], sd->name))
|
||||
if (sd->name && !strcmp(dynamic_headers[j], sd->name))
|
||||
sort_dimension_add_dynamic_header(sd);
|
||||
}
|
||||
|
||||
@ -3009,7 +3046,7 @@ int sort_dimension__add(struct perf_hpp_list *list, const char *tok,
|
||||
for (i = 0; i < ARRAY_SIZE(bstack_sort_dimensions); i++) {
|
||||
struct sort_dimension *sd = &bstack_sort_dimensions[i];
|
||||
|
||||
if (strncasecmp(tok, sd->name, strlen(tok)))
|
||||
if (!sd->name || strncasecmp(tok, sd->name, strlen(tok)))
|
||||
continue;
|
||||
|
||||
if (sort__mode != SORT_MODE__BRANCH)
|
||||
@ -3025,7 +3062,7 @@ int sort_dimension__add(struct perf_hpp_list *list, const char *tok,
|
||||
for (i = 0; i < ARRAY_SIZE(memory_sort_dimensions); i++) {
|
||||
struct sort_dimension *sd = &memory_sort_dimensions[i];
|
||||
|
||||
if (strncasecmp(tok, sd->name, strlen(tok)))
|
||||
if (!sd->name || strncasecmp(tok, sd->name, strlen(tok)))
|
||||
continue;
|
||||
|
||||
if (sort__mode != SORT_MODE__MEMORY)
|
||||
@ -3339,7 +3376,7 @@ int output_field_add(struct perf_hpp_list *list, char *tok)
|
||||
for (i = 0; i < ARRAY_SIZE(common_sort_dimensions); i++) {
|
||||
struct sort_dimension *sd = &common_sort_dimensions[i];
|
||||
|
||||
if (strncasecmp(tok, sd->name, strlen(tok)))
|
||||
if (!sd->name || strncasecmp(tok, sd->name, strlen(tok)))
|
||||
continue;
|
||||
|
||||
return __sort_dimension__add_output(list, sd);
|
||||
@ -3357,7 +3394,7 @@ int output_field_add(struct perf_hpp_list *list, char *tok)
|
||||
for (i = 0; i < ARRAY_SIZE(bstack_sort_dimensions); i++) {
|
||||
struct sort_dimension *sd = &bstack_sort_dimensions[i];
|
||||
|
||||
if (strncasecmp(tok, sd->name, strlen(tok)))
|
||||
if (!sd->name || strncasecmp(tok, sd->name, strlen(tok)))
|
||||
continue;
|
||||
|
||||
if (sort__mode != SORT_MODE__BRANCH)
|
||||
@ -3369,7 +3406,7 @@ int output_field_add(struct perf_hpp_list *list, char *tok)
|
||||
for (i = 0; i < ARRAY_SIZE(memory_sort_dimensions); i++) {
|
||||
struct sort_dimension *sd = &memory_sort_dimensions[i];
|
||||
|
||||
if (strncasecmp(tok, sd->name, strlen(tok)))
|
||||
if (!sd->name || strncasecmp(tok, sd->name, strlen(tok)))
|
||||
continue;
|
||||
|
||||
if (sort__mode != SORT_MODE__MEMORY)
|
||||
@ -3508,6 +3545,9 @@ void reset_output_field(void)
|
||||
|
||||
static void add_key(struct strbuf *sb, const char *str, int *llen)
|
||||
{
|
||||
if (!str)
|
||||
return;
|
||||
|
||||
if (*llen >= 75) {
|
||||
strbuf_addstr(sb, "\n\t\t\t ");
|
||||
*llen = INDENT;
|
||||
|
@ -2157,6 +2157,7 @@ int perf_event__synthesize_attr(struct perf_tool *tool, struct perf_event_attr *
|
||||
return err;
|
||||
}
|
||||
|
||||
#ifdef HAVE_LIBTRACEEVENT
|
||||
int perf_event__synthesize_tracing_data(struct perf_tool *tool, int fd, struct evlist *evlist,
|
||||
perf_event__handler_t process)
|
||||
{
|
||||
@ -2203,6 +2204,7 @@ int perf_event__synthesize_tracing_data(struct perf_tool *tool, int fd, struct e
|
||||
|
||||
return aligned_size;
|
||||
}
|
||||
#endif
|
||||
|
||||
int perf_event__synthesize_build_id(struct perf_tool *tool, struct dso *pos, u16 misc,
|
||||
perf_event__handler_t process, struct machine *machine)
|
||||
@ -2355,6 +2357,7 @@ int perf_event__synthesize_for_pipe(struct perf_tool *tool,
|
||||
}
|
||||
ret += err;
|
||||
|
||||
#ifdef HAVE_LIBTRACEEVENT
|
||||
if (have_tracepoints(&evlist->core.entries)) {
|
||||
int fd = perf_data__fd(data);
|
||||
|
||||
@ -2374,6 +2377,9 @@ int perf_event__synthesize_for_pipe(struct perf_tool *tool,
|
||||
}
|
||||
ret += err;
|
||||
}
|
||||
#else
|
||||
(void)data;
|
||||
#endif
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
@ -11,6 +11,8 @@
|
||||
#include "trace-event.h"
|
||||
|
||||
#include <linux/ctype.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <traceevent/event-parse.h>
|
||||
|
||||
static int get_common_field(struct scripting_context *context,
|
||||
int *offset, int *size, const char *type)
|
||||
|
@ -11,6 +11,7 @@
|
||||
#include <sys/stat.h>
|
||||
#include <sys/wait.h>
|
||||
#include <sys/mman.h>
|
||||
#include <traceevent/event-parse.h>
|
||||
#include <fcntl.h>
|
||||
#include <unistd.h>
|
||||
#include <errno.h>
|
||||
|
@ -9,6 +9,7 @@
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <errno.h>
|
||||
#include <traceevent/event-parse.h>
|
||||
|
||||
#include "debug.h"
|
||||
#include "trace-event.h"
|
||||
|
@ -1,5 +1,4 @@
|
||||
// SPDX-License-Identifier: GPL-2.0
|
||||
|
||||
#include <stdio.h>
|
||||
#include <unistd.h>
|
||||
#include <stdlib.h>
|
||||
|
@ -2,9 +2,11 @@
|
||||
#ifndef _PERF_UTIL_TRACE_EVENT_H
|
||||
#define _PERF_UTIL_TRACE_EVENT_H
|
||||
|
||||
#include <traceevent/event-parse.h>
|
||||
#include "parse-events.h"
|
||||
#include <stdbool.h>
|
||||
#include <stdio.h>
|
||||
#include <linux/types.h>
|
||||
|
||||
struct evlist;
|
||||
struct machine;
|
||||
struct perf_sample;
|
||||
union perf_event;
|
||||
@ -18,6 +20,11 @@ struct trace_event {
|
||||
struct tep_plugin_list *plugin_list;
|
||||
};
|
||||
|
||||
typedef char *(tep_func_resolver_t)(void *priv,
|
||||
unsigned long long *addrp, char **modp);
|
||||
|
||||
bool have_tracepoints(struct list_head *evlist);
|
||||
|
||||
int trace_event__init(struct trace_event *t);
|
||||
void trace_event__cleanup(struct trace_event *t);
|
||||
int trace_event__register_resolver(struct machine *machine,
|
||||
|
Loading…
Reference in New Issue
Block a user