2019-05-19 05:07:45 -07:00
# SPDX-License-Identifier: GPL-2.0-only
2013-03-15 08:28:49 -07:00
2014-01-03 07:32:32 -07:00
i f e q ( $( src -perf ) , )
src-perf := $( srctree) /tools/perf
e n d i f
2013-03-15 08:28:49 -07:00
2014-01-03 07:32:32 -07:00
i f e q ( $( obj -perf ) , )
obj-perf := $( OUTPUT)
2013-03-15 08:28:49 -07:00
e n d i f
2014-01-03 07:32:32 -07:00
i f n e q ( $( obj -perf ) , )
obj-perf := $( abspath $( obj-perf) ) /
e n d i f
2015-07-19 02:30:05 -07:00
$( shell printf "" > $ ( OUTPUT ) .config -detected )
2015-07-01 04:54:42 -07:00
detected = $( shell echo " $( 1) =y " >> $( OUTPUT) .config-detected)
detected_var = $( shell echo " $( 1) = $( $( 1) ) " >> $( OUTPUT) .config-detected)
2014-12-31 09:37:00 -07:00
2020-10-09 05:25:23 -07:00
CFLAGS := $( EXTRA_CFLAGS) $( filter-out -Wnested-externs,$( EXTRA_WARNINGS) )
2021-10-29 09:30:41 -07:00
HOSTCFLAGS := $( filter-out -Wnested-externs,$( EXTRA_WARNINGS) )
2014-01-03 07:32:32 -07:00
2022-08-26 09:42:42 -07:00
# Enabled Wthread-safety analysis for clang builds.
i f e q ( $( CC_NO_CLANG ) , 0 )
CFLAGS += -Wthread-safety
e n d i f
2016-01-11 06:47:58 -07:00
i n c l u d e $( srctree ) / t o o l s / s c r i p t s / M a k e f i l e . a r c h
2014-01-03 07:32:32 -07:00
2017-04-09 20:02:37 -07:00
$( call detected_var ,SRCARCH )
2014-12-29 07:03:09 -07:00
2020-05-28 08:03:40 -07:00
i f n e q ( $( NO_SYSCALL_TABLE ) , 1 )
NO_SYSCALL_TABLE := 1
2024-08-30 15:53:47 -07:00
ifeq ( $( SRCARCH) ,$( filter $( SRCARCH) ,x86 powerpc arm64 s390 mips loongarch) )
NO_SYSCALL_TABLE := 0
2020-05-28 07:47:24 -07:00
endif
2020-05-28 08:03:40 -07:00
ifneq ( $( NO_SYSCALL_TABLE) ,1)
CFLAGS += -DHAVE_SYSCALL_TABLE_SUPPORT
endif
2020-05-28 07:47:24 -07:00
e n d i f
2016-02-19 22:02:47 -07:00
# Additional ARCH settings for ppc
2017-04-09 20:02:37 -07:00
i f e q ( $( SRCARCH ) , p o w e r p c )
2018-01-29 01:34:17 -07:00
CFLAGS += -I$( OUTPUT) arch/powerpc/include/generated
2016-04-28 02:31:09 -07:00
LIBUNWIND_LIBS := -lunwind -lunwind-ppc64
2016-02-19 22:02:47 -07:00
e n d i f
2014-01-03 07:32:32 -07:00
# Additional ARCH settings for x86
2017-04-09 20:02:37 -07:00
i f e q ( $( SRCARCH ) , x 8 6 )
2014-12-29 07:03:09 -07:00
$( call detected,CONFIG_X86)
2024-08-30 15:53:47 -07:00
CFLAGS += -I$( OUTPUT) arch/x86/include/generated
2015-01-11 19:20:55 -07:00
ifeq ( ${ IS_64_BIT } , 1)
2024-08-30 15:53:47 -07:00
CFLAGS += -DHAVE_ARCH_X86_64_SUPPORT
2013-04-14 19:06:58 -07:00
ARCH_INCLUDE = ../../arch/x86/lib/memcpy_64.S ../../arch/x86/lib/memset_64.S
2017-08-20 04:39:32 -07:00
LIBUNWIND_LIBS = -lunwind-x86_64 -lunwind -llzma
2014-12-29 05:52:36 -07:00
$( call detected,CONFIG_X86_64)
2013-11-01 06:51:32 -07:00
else
2015-05-19 06:05:43 -07:00
LIBUNWIND_LIBS = -lunwind-x86 -llzma -lunwind
2013-04-14 19:06:58 -07:00
endif
2013-03-15 08:28:49 -07:00
e n d i f
2014-04-28 05:32:33 -07:00
2017-04-09 20:02:37 -07:00
i f e q ( $( SRCARCH ) , a r m )
2013-09-26 04:36:36 -07:00
LIBUNWIND_LIBS = -lunwind -lunwind-arm
e n d i f
2013-03-15 08:28:49 -07:00
2017-04-09 20:02:37 -07:00
i f e q ( $( SRCARCH ) , a r m 6 4 )
2018-07-06 14:34:54 -07:00
CFLAGS += -I$( OUTPUT) arch/arm64/include/generated
2014-04-28 05:32:33 -07:00
LIBUNWIND_LIBS = -lunwind -lunwind-aarch64
e n d i f
2023-05-01 02:19:59 -07:00
i f e q ( $( SRCARCH ) , l o o n g a r c h )
CFLAGS += -I$( OUTPUT) arch/loongarch/include/generated
LIBUNWIND_LIBS = -lunwind -lunwind-loongarch64
e n d i f
2016-01-19 03:23:38 -07:00
i f e q ( $( ARCH ) , s 3 9 0 )
2017-12-13 13:46:54 -07:00
CFLAGS += -fPIC -I$( OUTPUT) arch/s390/include/generated
2016-01-19 03:23:38 -07:00
e n d i f
2021-02-03 20:35:23 -07:00
i f e q ( $( ARCH ) , m i p s )
2021-02-03 20:35:24 -07:00
CFLAGS += -I$( OUTPUT) arch/mips/include/generated
2021-02-03 20:35:23 -07:00
LIBUNWIND_LIBS = -lunwind -lunwind-mips
e n d i f
2014-05-16 01:41:11 -07:00
# So far there's only x86 and arm libdw unwind support merged in perf.
2014-04-20 01:50:00 -07:00
# Disable it on all other architectures in case libdw unwind
# support is detected in system. Add supported architectures
# to the check.
2023-05-01 02:19:59 -07:00
i f n e q ( $( SRCARCH ) , $( filter $ ( SRCARCH ) ,x 86 arm arm 64 powerpc s 390 csky riscv loongarch ) )
2014-04-20 01:50:00 -07:00
NO_LIBDW_DWARF_UNWIND := 1
e n d i f
2013-12-10 05:24:04 -07:00
i f e q ( $( LIBUNWIND_LIBS ) , )
NO_LIBUNWIND := 1
e n d i f
2016-01-28 22:57:30 -07:00
#
# For linking with debug library, run like:
#
# make DEBUG=1 LIBUNWIND_DIR=/opt/libunwind/
#
2016-06-02 20:33:10 -07:00
libunwind_arch_set_flags = $( eval $( libunwind_arch_set_flags_code) )
d e f i n e l i b u n w i n d _ a r c h _ s e t _ f l a g s _ c o d e
FEATURE_CHECK_CFLAGS-libunwind-$( 1) = -I$( LIBUNWIND_DIR) /include
FEATURE_CHECK_LDFLAGS-libunwind-$( 1) = -L$( LIBUNWIND_DIR) /lib
e n d e f
2016-01-28 22:57:30 -07:00
i f d e f L I B U N W I N D _ D I R
LIBUNWIND_CFLAGS = -I$( LIBUNWIND_DIR) /include
LIBUNWIND_LDFLAGS = -L$( LIBUNWIND_DIR) /lib
2023-05-01 02:19:59 -07:00
LIBUNWIND_ARCHS = x86 x86_64 arm aarch64 debug-frame-arm debug-frame-aarch64 loongarch
2016-06-02 20:33:10 -07:00
$( foreach libunwind_arch,$( LIBUNWIND_ARCHS) ,$( call libunwind_arch_set_flags,$( libunwind_arch) ) )
2016-01-28 22:57:30 -07:00
e n d i f
# Set per-feature check compilation flags
FEATURE_CHECK_CFLAGS-libunwind = $( LIBUNWIND_CFLAGS)
2016-06-02 20:33:14 -07:00
FEATURE_CHECK_LDFLAGS-libunwind = $( LIBUNWIND_LDFLAGS) $( LIBUNWIND_LIBS)
2016-01-28 22:57:30 -07:00
FEATURE_CHECK_CFLAGS-libunwind-debug-frame = $( LIBUNWIND_CFLAGS)
2016-06-02 20:33:14 -07:00
FEATURE_CHECK_LDFLAGS-libunwind-debug-frame = $( LIBUNWIND_LDFLAGS) $( LIBUNWIND_LIBS)
2013-12-10 05:24:04 -07:00
perf unwind: Do not overwrite FEATURE_CHECK_LDFLAGS-libunwind-{x86,aarch64}
When setting LIBUNWIND_DIR, we first set
FEATURE_CHECK_LDFLAGS-libunwind-{aarch64,x86} = -L$(LIBUNWIND_DIR)/lib.
<committer note>
This happens a bit before, the overwritting, in:
libunwind_arch_set_flags = $(eval $(libunwind_arch_set_flags_code))
define libunwind_arch_set_flags_code
FEATURE_CHECK_CFLAGS-libunwind-$(1) = -I$(LIBUNWIND_DIR)/include
FEATURE_CHECK_LDFLAGS-libunwind-$(1) = -L$(LIBUNWIND_DIR)/lib
endef
ifdef LIBUNWIND_DIR
LIBUNWIND_CFLAGS = -I$(LIBUNWIND_DIR)/include
LIBUNWIND_LDFLAGS = -L$(LIBUNWIND_DIR)/lib
LIBUNWIND_ARCHS = x86 x86_64 arm aarch64 debug-frame-arm debug-frame-aarch64
$(foreach libunwind_arch,$(LIBUNWIND_ARCHS),$(call libunwind_arch_set_flags,$(libunwind_arch)))
endif
Look at that 'foreach' on all the LIBUNWIND_ARCHS.
</>
After commit 5c4d7c82c0dc ("perf unwind: Do not put libunwind-{x86,aarch64}
in FEATURE_TESTS_BASIC"), FEATURE_CHECK_LDFLAGS-libunwind-{x86,aarch64} is
overwritten. As a result, the remote libunwind libraries cannot be searched
from $(LIBUNWIND_DIR)/lib directory during feature check tests. Fix it with
variable appending.
Before this patch:
perf$ make VF=1 LIBUNWIND_DIR=/opt/libunwind_aarch64
BUILD: Doing 'make -j16' parallel build
<SNIP>
...
... libopencsd: [ OFF ]
... libunwind-x86: [ OFF ]
... libunwind-x86_64: [ OFF ]
... libunwind-arm: [ OFF ]
... libunwind-aarch64: [ OFF ]
... libunwind-debug-frame: [ OFF ]
... libunwind-debug-frame-arm: [ OFF ]
... libunwind-debug-frame-aarch64: [ OFF ]
... cxx: [ OFF ]
<SNIP>
perf$ cat ../build/feature/test-libunwind-aarch64.make.output
/usr/bin/ld: cannot find -lunwind-aarch64
/usr/bin/ld: cannot find -lunwind-aarch64
collect2: error: ld returned 1 exit status
After this patch:
perf$ make VF=1 LIBUNWIND_DIR=/opt/libunwind_aarch64
BUILD: Doing 'make -j16' parallel build
<SNIP>
... libopencsd: [ OFF ]
... libunwind-x86: [ OFF ]
... libunwind-x86_64: [ OFF ]
... libunwind-arm: [ OFF ]
... libunwind-aarch64: [ on ]
... libunwind-debug-frame: [ OFF ]
... libunwind-debug-frame-arm: [ OFF ]
... libunwind-debug-frame-aarch64: [ OFF ]
... cxx: [ OFF ]
<SNIP>
perf$ cat ../build/feature/test-libunwind-aarch64.make.output
perf$ ldd ./perf
linux-vdso.so.1 (0x00007ffdf07da000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f30953dc000)
librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007f30951d4000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f3094e36000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f3094c32000)
libelf.so.1 => /usr/lib/x86_64-linux-gnu/libelf.so.1 (0x00007f3094a18000)
libdw.so.1 => /usr/lib/x86_64-linux-gnu/libdw.so.1 (0x00007f30947cc000)
libunwind-x86_64.so.8 => /usr/lib/x86_64-linux-gnu/libunwind-x86_64.so.8 (0x00007f30945ad000)
libunwind.so.8 => /usr/lib/x86_64-linux-gnu/libunwind.so.8 (0x00007f3094392000)
liblzma.so.5 => /lib/x86_64-linux-gnu/liblzma.so.5 (0x00007f309416c000)
libunwind-aarch64.so.8 => not found
libslang.so.2 => /lib/x86_64-linux-gnu/libslang.so.2 (0x00007f3093c8a000)
libpython2.7.so.1.0 => /usr/local/lib/libpython2.7.so.1.0 (0x00007f309386b000)
libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007f309364e000)
libnuma.so.1 => /usr/lib/x86_64-linux-gnu/libnuma.so.1 (0x00007f3093443000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f3093052000)
/lib64/ld-linux-x86-64.so.2 (0x00007f3096097000)
libbz2.so.1.0 => /lib/x86_64-linux-gnu/libbz2.so.1.0 (0x00007f3092e42000)
libutil.so.1 => /lib/x86_64-linux-gnu/libutil.so.1 (0x00007f3092c3f000)
Fixes: 5c4d7c82c0dceccf ("perf unwind: Do not put libunwind-{x86,aarch64} in FEATURE_TESTS_BASIC")
Signed-off-by: Li Huafei <lihuafei1@huawei.com>
Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
Cc: He Kuang <hekuang@huawei.com>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Mark Rutland <mark.rutland@arm.com>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Zhang Jinhao <zhangjinhao2@huawei.com>
Link: http://lore.kernel.org/lkml/20210823134340.60955-1-lihuafei1@huawei.com
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2021-08-23 06:43:40 -07:00
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
2019-02-12 12:34:32 -07:00
2019-02-12 12:19:45 -07:00
FEATURE_CHECK_LDFLAGS-libcrypto = -lcrypto
2018-01-17 10:52:10 -07:00
i f d e f C S I N C L U D E S
LIBOPENCSD_CFLAGS := -I$( CSINCLUDES)
e n d i f
2023-07-07 08:45:46 -07:00
OPENCSDLIBS := -lopencsd_c_api -lopencsd
2021-12-03 14:05:44 -07:00
i f e q ( $( findstring -static ,$ {LDFLAGS }) , - s t a t i c )
2023-07-07 08:45:46 -07:00
OPENCSDLIBS += -lstdc++
2021-12-03 14:05:44 -07:00
e n d i f
2018-01-17 10:52:10 -07:00
i f d e f C S L I B S
LIBOPENCSD_LDFLAGS := -L$( CSLIBS)
e n d i f
FEATURE_CHECK_CFLAGS-libopencsd := $( LIBOPENCSD_CFLAGS)
FEATURE_CHECK_LDFLAGS-libopencsd := $( LIBOPENCSD_LDFLAGS) $( OPENCSDLIBS)
2016-01-28 22:57:30 -07:00
# for linking with debug library, run like:
# make DEBUG=1 LIBDW_DIR=/opt/libdw/
i f d e f L I B D W _ D I R
LIBDW_CFLAGS := -I$( LIBDW_DIR) /include
LIBDW_LDFLAGS := -L$( LIBDW_DIR) /lib
2014-02-19 08:52:56 -07:00
e n d i f
2017-08-20 04:39:27 -07:00
DWARFLIBS := -ldw
i f e q ( $( findstring -static ,$ {LDFLAGS }) , - s t a t i c )
2024-09-18 18:35:12 -07:00
DWARFLIBS += -lelf -lz -llzma -lbz2 -lzstd
2024-07-17 01:22:08 -07:00
2024-09-18 18:35:11 -07:00
LIBDW_VERSION := $( shell $( PKG_CONFIG) --modversion libdw) .0.0
2024-07-17 01:22:08 -07:00
LIBDW_VERSION_1 := $( word 1, $( subst ., ,$( LIBDW_VERSION) ) )
LIBDW_VERSION_2 := $( word 2, $( subst ., ,$( LIBDW_VERSION) ) )
# Elfutils merged libebl.a into libdw.a starting from version 0.177,
# Link libebl.a only if libdw is older than this version.
ifeq ( $( shell test $( LIBDW_VERSION_2) -lt 177; echo $$ ?) ,0)
DWARFLIBS += -lebl
endif
2024-09-18 18:35:12 -07:00
# Must put -ldl after -lebl for dependency
DWARFLIBS += -ldl
2017-08-20 04:39:27 -07:00
e n d i f
2016-01-28 22:57:30 -07:00
FEATURE_CHECK_CFLAGS-libdw-dwarf-unwind := $( LIBDW_CFLAGS)
2017-08-20 04:39:27 -07:00
FEATURE_CHECK_LDFLAGS-libdw-dwarf-unwind := $( LIBDW_LDFLAGS) $( DWARFLIBS)
2014-02-19 08:52:56 -07:00
2016-01-28 22:57:30 -07:00
# for linking with debug library, run like:
# make DEBUG=1 LIBBABELTRACE_DIR=/opt/libbabeltrace/
i f d e f L I B B A B E L T R A C E _ D I R
LIBBABELTRACE_CFLAGS := -I$( LIBBABELTRACE_DIR) /include
LIBBABELTRACE_LDFLAGS := -L$( LIBBABELTRACE_DIR) /lib
2015-02-20 15:16:58 -07:00
e n d i f
2016-01-28 22:57:30 -07:00
FEATURE_CHECK_CFLAGS-libbabeltrace := $( LIBBABELTRACE_CFLAGS)
FEATURE_CHECK_LDFLAGS-libbabeltrace := $( LIBBABELTRACE_LDFLAGS) -lbabeltrace-ctf
2015-02-20 15:16:58 -07:00
2024-02-17 00:40:42 -07:00
# for linking with debug library, run like:
# make DEBUG=1 LIBCAPSTONE_DIR=/opt/capstone/
i f d e f L I B C A P S T O N E _ D I R
LIBCAPSTONE_CFLAGS := -I$( LIBCAPSTONE_DIR) /include
LIBCAPSTONE_LDFLAGS := -L$( LIBCAPSTONE_DIR) /
e n d i f
FEATURE_CHECK_CFLAGS-libcapstone := $( LIBCAPSTONE_CFLAGS)
FEATURE_CHECK_LDFLAGS-libcapstone := $( LIBCAPSTONE_LDFLAGS) -lcapstone
2019-03-18 10:39:49 -07:00
i f d e f L I B Z S T D _ D I R
LIBZSTD_CFLAGS := -I$( LIBZSTD_DIR) /lib
LIBZSTD_LDFLAGS := -L$( LIBZSTD_DIR) /lib
e n d i f
FEATURE_CHECK_CFLAGS-libzstd := $( LIBZSTD_CFLAGS)
FEATURE_CHECK_LDFLAGS-libzstd := $( LIBZSTD_LDFLAGS)
2024-07-17 10:47:36 -07:00
# for linking with debug library, run like:
# make DEBUG=1 PKG_CONFIG_PATH=/opt/libtraceevent/(lib|lib64)/pkgconfig
2024-06-28 13:34:27 -07:00
i f n e q ( $( NO_LIBTRACEEVENT ) , 1 )
ifeq ( $( call get-executable,$( PKG_CONFIG) ) ,)
$( error Error: $( PKG_CONFIG) needed by libtraceevent is missing on this system, please install it)
endif
e n d i f
2017-04-09 20:02:37 -07:00
FEATURE_CHECK_CFLAGS-bpf = -I. -I$( srctree) /tools/include -I$( srctree) /tools/arch/$( SRCARCH) /include/uapi -I$( srctree) /tools/include/uapi
2013-05-24 05:35:23 -07:00
# include ARCH specific config
2017-04-09 20:02:37 -07:00
- i n c l u d e $( src -perf ) / a r c h / $( SRCARCH ) / M a k e f i l e
2013-05-24 05:35:23 -07:00
2015-09-14 19:02:49 -07:00
i f d e f P E R F _ H A V E _ A R C H _ R E G S _ Q U E R Y _ R E G I S T E R _ O F F S E T
CFLAGS += -DHAVE_ARCH_REGS_QUERY_REGISTER_OFFSET
e n d i f
2016-03-18 09:57:20 -07:00
i n c l u d e $( srctree ) / t o o l s / s c r i p t s / u t i l i t i e s . m a k
2013-03-24 16:32:01 -07:00
i f e q ( $( call get -executable ,$ ( FLEX ) ) , )
2024-02-21 06:42:01 -07:00
$( error Error: $( FLEX) is missing on this system, please install it)
2013-03-24 16:32:01 -07:00
e n d i f
i f e q ( $( call get -executable ,$ ( BISON ) ) , )
2024-02-21 06:42:01 -07:00
$( error Error: $( BISON) is missing on this system, please install it)
2013-03-24 16:32:01 -07:00
e n d i f
2013-03-24 16:40:48 -07:00
2021-05-24 04:15:14 -07:00
i f n e q ( $( OUTPUT ) , )
ifeq ( $( shell expr $( shell $( BISON) --version | grep bison | sed -e 's/.\+ \([0-9]\+\).\([0-9]\+\).\([0-9]\+\)/\1\2\3/g' ) \> \= 371) , 1)
BISON_FILE_PREFIX_MAP := --file-prefix-map= $( OUTPUT) =
endif
e n d i f
2013-03-24 16:40:48 -07:00
# Treat warnings as errors unless directed not to
i f n e q ( $( WERROR ) , 0 )
2019-10-11 05:21:55 -07:00
CORE_CFLAGS += -Werror
2016-11-26 00:03:33 -07:00
CXXFLAGS += -Werror
2021-10-29 09:30:41 -07:00
HOSTCFLAGS += -Werror
2013-03-24 16:40:48 -07:00
e n d i f
2013-10-22 00:34:05 -07:00
i f n d e f D E B U G
DEBUG := 0
e n d i f
2013-10-09 23:05:25 -07:00
i f e q ( $( DEBUG ) , 0 )
2023-03-30 11:38:27 -07:00
CORE_CFLAGS += -DNDEBUG= 1
2024-09-08 11:46:41 -07:00
CORE_CFLAGS += -O3
2023-07-27 23:49:13 -07:00
e l s e
CORE_CFLAGS += -g
CXXFLAGS += -g
2017-02-14 06:55:27 -07:00
e n d i f
2013-03-24 16:40:48 -07:00
i f d e f P A R S E R _ D E B U G
2013-04-14 19:06:58 -07:00
PARSER_DEBUG_BISON := -t
PARSER_DEBUG_FLEX := -d
CFLAGS += -DPARSER_DEBUG
2014-12-29 09:42:46 -07:00
$( call detected_var,PARSER_DEBUG_BISON)
$( call detected_var,PARSER_DEBUG_FLEX)
2013-03-24 16:40:48 -07:00
e n d i f
2023-07-24 13:12:47 -07:00
i f d e f L T O
CORE_CFLAGS += -flto
CXXFLAGS += -flto
e n d i f
2016-01-28 22:57:30 -07:00
# Try different combinations to accommodate systems that only have
2022-03-09 12:43:13 -07:00
# python[2][3]-config in weird combinations in the following order of
# priority from lowest to highest:
# * python2-config as per pep-0394.
2022-06-29 11:25:02 -07:00
# * python-config
# * python3-config
2022-03-09 12:43:13 -07:00
# * $(PYTHON)-config (If PYTHON is user supplied but PYTHON_CONFIG isn't)
#
PYTHON_AUTO := python-config
PYTHON_AUTO := $( if $( call get-executable,python2-config) ,python2-config,$( PYTHON_AUTO) )
2022-06-29 11:25:02 -07:00
PYTHON_AUTO := $( if $( call get-executable,python-config) ,python-config,$( PYTHON_AUTO) )
PYTHON_AUTO := $( if $( call get-executable,python3-config) ,python3-config,$( PYTHON_AUTO) )
2022-03-09 12:43:13 -07:00
# If PYTHON is defined but PYTHON_CONFIG isn't, then take $(PYTHON)-config as if it was the user
# supplied value for PYTHON_CONFIG. Because it's "user supplied", error out if it doesn't exist.
i f d e f P Y T H O N
ifndef PYTHON_CONFIG
PYTHON_CONFIG_AUTO := $( call get-executable,$( PYTHON) -config)
PYTHON_CONFIG := $( if $( PYTHON_CONFIG_AUTO) ,$( PYTHON_CONFIG_AUTO) ,\
$( call $( error $( PYTHON) -config not found) ) )
endif
e n d i f
# Select either auto detected python and python-config or use user supplied values if they are
# defined. get-executable-or-default fails with an error if the first argument is supplied but
# doesn't exist.
override PYTHON_CONFIG : = $( call get -executable -or -default ,PYTHON_CONFIG ,$ ( PYTHON_AUTO ) )
2022-07-28 02:39:46 -07:00
override PYTHON : = $( call get -executable -or -default ,PYTHON ,$ ( subst -config ,,$ ( PYTHON_CONFIG ) ) )
2014-07-28 23:57:19 -07:00
2017-04-11 23:49:13 -07:00
grep-libs = $( filter -l%,$( 1) )
strip-libs = $( filter-out -l%,$( 1) )
2014-07-28 23:57:19 -07:00
2017-04-11 23:49:13 -07:00
PYTHON_CONFIG_SQ := $( call shell-sq,$( PYTHON_CONFIG) )
2014-07-28 23:57:19 -07:00
2020-01-31 11:11:23 -07:00
# Python 3.8 changed the output of `python-config --ldflags` to not include the
# '-lpythonX.Y' flag unless '--embed' is also passed. The feature check for
# libpython fails if that flag is not included in LDFLAGS
i f e q ( $( shell $ ( PYTHON_CONFIG_SQ ) --ldflags --embed 2>&1 1>/dev /null ; echo $ $ ?) , 0 )
PYTHON_CONFIG_LDFLAGS := --ldflags --embed
e l s e
PYTHON_CONFIG_LDFLAGS := --ldflags
e n d i f
2017-04-11 23:49:13 -07:00
i f d e f P Y T H O N _ C O N F I G
2020-01-31 11:11:23 -07:00
PYTHON_EMBED_LDOPTS := $( shell $( PYTHON_CONFIG_SQ) $( PYTHON_CONFIG_LDFLAGS) 2>/dev/null)
2024-07-17 01:22:07 -07:00
# Update the python flags for cross compilation
ifdef CROSS_COMPILE
PYTHON_NATIVE := $( shell echo $( PYTHON_EMBED_LDOPTS) | sed 's/\(-L.*\/\)\(.*-linux-gnu\).*/\2/' )
PYTHON_EMBED_LDOPTS := $( subst $( PYTHON_NATIVE) ,$( shell $( CC) -dumpmachine) ,$( PYTHON_EMBED_LDOPTS) )
endif
2017-04-11 23:49:13 -07:00
PYTHON_EMBED_LDFLAGS := $( call strip-libs,$( PYTHON_EMBED_LDOPTS) )
PYTHON_EMBED_LIBADD := $( call grep-libs,$( PYTHON_EMBED_LDOPTS) ) -lutil
2018-07-10 08:46:12 -07:00
PYTHON_EMBED_CCOPTS := $( shell $( PYTHON_CONFIG_SQ) --includes 2>/dev/null)
2017-04-11 23:49:13 -07:00
FLAGS_PYTHON_EMBED := $( PYTHON_EMBED_CCOPTS) $( PYTHON_EMBED_LDOPTS)
2022-04-07 07:04:20 -07:00
ifeq ( $( CC_NO_CLANG) , 0)
PYTHON_EMBED_CCOPTS := $( filter-out -ffat-lto-objects, $( PYTHON_EMBED_CCOPTS) )
endif
2017-02-15 17:31:40 -07:00
e n d i f
2016-01-28 22:57:30 -07:00
FEATURE_CHECK_CFLAGS-libpython := $( PYTHON_EMBED_CCOPTS)
FEATURE_CHECK_LDFLAGS-libpython := $( PYTHON_EMBED_LDOPTS)
2014-07-28 23:57:19 -07:00
2019-02-12 07:20:56 -07:00
FEATURE_CHECK_LDFLAGS-libaio = -lrt
2023-06-26 23:32:57 -07:00
FEATURE_CHECK_LDFLAGS-disassembler-four-args = -lbfd -lopcodes -ldl
FEATURE_CHECK_LDFLAGS-disassembler-init-styled = -lbfd -lopcodes -ldl
2019-10-11 05:21:55 -07:00
CORE_CFLAGS += -fno-omit-frame-pointer
CORE_CFLAGS += -Wall
CORE_CFLAGS += -Wextra
2022-10-24 11:19:06 -07:00
CORE_CFLAGS += -std= gnu11
2013-03-21 03:30:54 -07:00
2023-07-25 08:03:47 -07:00
CXXFLAGS += -std= gnu++17 -fno-exceptions -fno-rtti
2016-11-26 00:03:33 -07:00
CXXFLAGS += -Wall
2023-07-27 23:49:14 -07:00
CXXFLAGS += -Wextra
2016-11-26 00:03:33 -07:00
CXXFLAGS += -fno-omit-frame-pointer
2021-10-29 09:30:41 -07:00
HOSTCFLAGS += -Wall
HOSTCFLAGS += -Wextra
2014-04-27 09:51:05 -07:00
# Enforce a non-executable stack, as we may regress (again) in the future by
# adding assembler files missing the .GNU-stack linker note.
LDFLAGS += -Wl,-z,noexecstack
2014-11-06 22:20:06 -07:00
EXTLIBS = -lpthread -lrt -lm -ldl
2013-03-24 16:40:48 -07:00
2019-10-13 08:14:25 -07:00
i f n e q ( $( TCMALLOC ) , )
CFLAGS += -fno-builtin-malloc -fno-builtin-calloc -fno-builtin-realloc -fno-builtin-free
EXTLIBS += -ltcmalloc
e n d i f
2016-01-14 21:00:18 -07:00
i f e q ( $( FEATURES_DUMP ) , )
2023-06-26 23:32:57 -07:00
# We will display at the end of this Makefile.config, using $(call feature_display_entries)
# As we may retry some feature detection here, see the disassembler-four-args case, for instance
2021-04-26 11:47:39 -07:00
FEATURE_DISPLAY_DEFERRED := 1
2015-03-01 13:19:44 -07:00
i n c l u d e $( srctree ) / t o o l s / b u i l d / M a k e f i l e . f e a t u r e
2016-01-14 21:00:18 -07:00
e l s e
i n c l u d e $( FEATURES_DUMP )
e n d i f
2013-10-01 05:14:31 -07:00
2013-09-30 04:48:44 -07:00
i f e q ( $( feature -stackprotector -all ) , 1 )
2019-10-11 05:21:55 -07:00
CORE_CFLAGS += -fstack-protector-all
2013-03-24 16:40:48 -07:00
e n d i f
2013-10-09 23:05:25 -07:00
i f e q ( $( DEBUG ) , 0 )
2013-10-07 00:38:28 -07:00
ifeq ( $( feature-fortify-source) , 1)
2022-07-20 09:21:45 -07:00
CORE_CFLAGS += -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE= 2
2013-04-14 19:06:58 -07:00
endif
2013-03-24 16:40:48 -07:00
e n d i f
2016-11-26 00:03:37 -07:00
INC_FLAGS += -I$( src-perf) /util/include
2017-04-09 20:02:37 -07:00
INC_FLAGS += -I$( src-perf) /arch/$( SRCARCH) /include
2016-11-26 00:03:37 -07:00
INC_FLAGS += -I$( srctree) /tools/include/
2017-04-09 20:02:37 -07:00
INC_FLAGS += -I$( srctree) /tools/arch/$( SRCARCH) /include/uapi
2019-08-19 07:11:30 -07:00
INC_FLAGS += -I$( srctree) /tools/include/uapi
2017-04-09 20:02:37 -07:00
INC_FLAGS += -I$( srctree) /tools/arch/$( SRCARCH) /include/
INC_FLAGS += -I$( srctree) /tools/arch/$( SRCARCH) /
2013-05-24 05:35:23 -07:00
# $(obj-perf) for generated common-cmds.h
# $(obj-perf)/util for generated bison/flex headers
i f n e q ( $( OUTPUT ) , )
2016-11-26 00:03:37 -07:00
INC_FLAGS += -I$( obj-perf) /util
INC_FLAGS += -I$( obj-perf)
2013-05-24 05:35:23 -07:00
e n d i f
2016-11-26 00:03:37 -07:00
INC_FLAGS += -I$( src-perf) /util
INC_FLAGS += -I$( src-perf)
2019-10-11 05:21:55 -07:00
CORE_CFLAGS += -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS= 64 -D_GNU_SOURCE
CFLAGS += $( CORE_CFLAGS) $( INC_FLAGS)
2016-11-26 00:03:37 -07:00
CXXFLAGS += $( INC_FLAGS)
2013-05-24 05:35:23 -07:00
2019-10-11 05:21:55 -07:00
LIBPERF_CFLAGS := $( CORE_CFLAGS) $( EXTRA_CFLAGS)
2013-03-24 16:40:48 -07:00
2015-01-13 06:43:24 -07:00
i f e q ( $( feature -pthread -attr -setaffinity -np ) , 1 )
CFLAGS += -DHAVE_PTHREAD_ATTR_SETAFFINITY_NP
e n d i f
2017-12-05 06:14:42 -07:00
i f e q ( $( feature -pthread -barrier ) , 1 )
CFLAGS += -DHAVE_PTHREAD_BARRIER
e n d i f
2013-05-24 05:35:24 -07:00
i f n d e f N O _ B I O N I C
2013-10-29 09:43:15 -07:00
$( call feature_check,bionic)
2013-09-30 05:11:46 -07:00
ifeq ( $( feature-bionic) , 1)
BIONIC := 1
2018-12-11 11:48:47 -07:00
CFLAGS += -DLACKS_SIGQUEUE_PROTOTYPE
2018-12-11 12:31:19 -07:00
CFLAGS += -DLACKS_OPEN_MEMSTREAM_PROTOTYPE
2013-09-30 05:11:46 -07:00
EXTLIBS := $( filter-out -lrt,$( EXTLIBS) )
EXTLIBS := $( filter-out -lpthread,$( EXTLIBS) )
endif
2013-03-24 16:40:48 -07:00
e n d i f
2013-03-24 16:45:08 -07:00
2018-11-21 13:42:00 -07:00
i f e q ( $( feature -eventfd ) , 1 )
2020-05-20 08:21:07 -07:00
CFLAGS += -DHAVE_EVENTFD_SUPPORT
2018-11-21 13:42:00 -07:00
e n d i f
2018-11-19 12:56:22 -07:00
i f e q ( $( feature -get_current_dir_name ) , 1 )
CFLAGS += -DHAVE_GET_CURRENT_DIR_NAME
e n d i f
2019-06-13 08:04:19 -07:00
i f e q ( $( feature -gettid ) , 1 )
CFLAGS += -DHAVE_GETTID
e n d i f
2020-04-01 18:52:49 -07:00
i f e q ( $( feature -file -handle ) , 1 )
CFLAGS += -DHAVE_FILE_HANDLE
e n d i f
2013-03-24 16:45:08 -07:00
i f d e f N O _ L I B E L F
2013-04-14 19:06:58 -07:00
NO_DWARF := 1
NO_LIBUNWIND := 1
2014-02-19 08:52:57 -07:00
NO_LIBDW_DWARF_UNWIND := 1
2015-10-14 05:41:12 -07:00
NO_LIBBPF := 1
2017-04-12 10:07:45 -07:00
NO_JVMTI := 1
2013-03-24 16:45:08 -07:00
e l s e
2013-09-30 05:20:25 -07:00
ifeq ( $( feature-libelf) , 0)
2013-10-07 01:34:20 -07:00
ifeq ( $( feature-glibc) , 1)
2013-09-30 05:11:16 -07:00
LIBC_SUPPORT := 1
endif
ifeq ( $( BIONIC) ,1)
LIBC_SUPPORT := 1
endif
ifeq ( $( LIBC_SUPPORT) ,1)
2024-02-21 06:42:01 -07:00
$( error ERROR: No libelf found. Disables 'probe' tool, jvmti and BPF support. Please install libelf-dev, libelf-devel, elfutils-libelf-devel or build with NO_LIBELF = 1.)
2013-09-30 05:11:16 -07:00
else
2020-06-17 19:06:01 -07:00
ifneq ( $( filter s% -fsanitize= address%,$( EXTRA_CFLAGS) ,) ,)
ifneq ( $( shell ldconfig -p | grep libasan >/dev/null 2>& 1; echo $$ ?) , 0)
2024-02-21 06:42:01 -07:00
$( error No libasan found, please install libasan)
2020-06-17 19:06:01 -07:00
endif
endif
ifneq ( $( filter s% -fsanitize= undefined%,$( EXTRA_CFLAGS) ,) ,)
ifneq ( $( shell ldconfig -p | grep libubsan >/dev/null 2>& 1; echo $$ ?) , 0)
2024-02-21 06:42:01 -07:00
$( error No libubsan found, please install libubsan)
2020-06-17 19:06:01 -07:00
endif
endif
2014-06-05 08:46:04 -07:00
ifneq ( $( filter s% -static%,$( LDFLAGS) ,) ,)
2024-02-21 06:42:01 -07:00
$( error No static glibc found, please install glibc-static)
2014-06-05 08:46:04 -07:00
else
2024-02-21 06:42:01 -07:00
$( error No gnu/libc-version.h found, please install glibc-dev[ el] )
2014-06-05 08:46:04 -07:00
endif
2013-09-30 05:11:16 -07:00
endif
2013-04-14 19:06:58 -07:00
else
2014-02-19 08:52:58 -07:00
ifndef NO_LIBDW_DWARF_UNWIND
ifneq ( $( feature-libdw-dwarf-unwind) ,1)
NO_LIBDW_DWARF_UNWIND := 1
2024-02-21 06:42:01 -07:00
$( warning No libdw DWARF unwind found, Please install elfutils-devel/libdw-dev >= 0.158 and/or set LIBDW_DIR)
2014-02-19 08:52:58 -07:00
endif
endif
2013-10-07 01:35:39 -07:00
ifneq ( $( feature-dwarf) , 1)
2017-01-12 14:01:59 -07:00
ifndef NO_DWARF
2024-02-21 06:42:01 -07:00
$( warning No libdw.h found or old libdw.h found or elfutils is older than 0.138, disables dwarf support. Please install new elfutils-devel/libdw-dev)
2017-01-12 14:01:59 -07:00
NO_DWARF := 1
endif
2016-04-05 07:33:41 -07:00
else
ifneq ( $( feature-dwarf_getlocations) , 1)
2024-02-21 06:42:01 -07:00
$( warning Old libdw.h, finding variables at given 'perf probe' point will not work, install elfutils-devel/libdw-dev >= 0.157)
2016-04-05 07:33:41 -07:00
else
2018-03-30 02:27:13 -07:00
CFLAGS += -DHAVE_DWARF_GETLOCATIONS_SUPPORT
2016-04-05 07:33:41 -07:00
endif # dwarf_getlocations
2023-11-09 16:59:28 -07:00
ifneq ( $( feature-dwarf_getcfi) , 1)
2024-02-21 06:42:01 -07:00
$( warning Old libdw.h, finding variables at given 'perf probe' point will not work, install elfutils-devel/libdw-dev >= 0.142)
2023-11-09 16:59:28 -07:00
else
CFLAGS += -DHAVE_DWARF_CFI_SUPPORT
endif # dwarf_getcfi
2013-09-30 05:11:16 -07:00
endif # Dwarf support
2013-10-02 06:30:35 -07:00
endif # libelf support
2013-03-24 16:45:08 -07:00
e n d i f # NO_LIBELF
2018-11-06 02:03:35 -07:00
i f e q ( $( feature -libaio ) , 1 )
ifndef NO_AIO
CFLAGS += -DHAVE_AIO_SUPPORT
endif
e n d i f
2015-04-29 04:15:31 -07:00
i f d e f N O _ D W A R F
NO_LIBDW_DWARF_UNWIND := 1
e n d i f
2023-04-04 07:05:57 -07:00
i f e q ( $( feature -scandirat ) , 1 )
2024-03-20 09:32:44 -07:00
# Ignore having scandirat with memory sanitizer that lacks an interceptor.
ifeq ( $( filter s% -fsanitize= memory%,$( EXTRA_CFLAGS) ,) ,)
CFLAGS += -DHAVE_SCANDIRAT_SUPPORT
endif
2023-04-04 07:05:57 -07:00
e n d i f
2017-03-02 08:55:49 -07:00
i f e q ( $( feature -sched_getcpu ) , 1 )
CFLAGS += -DHAVE_SCHED_GETCPU_SUPPORT
e n d i f
2017-07-18 13:15:29 -07:00
i f e q ( $( feature -setns ) , 1 )
CFLAGS += -DHAVE_SETNS_SUPPORT
$( call detected,CONFIG_SETNS)
e n d i f
2019-02-12 10:37:15 -07:00
i f d e f C O R E S I G H T
$( call feature_check,libopencsd)
2018-01-17 10:52:10 -07:00
ifeq ( $( feature-libopencsd) , 1)
CFLAGS += -DHAVE_CSTRACE_SUPPORT $( LIBOPENCSD_CFLAGS)
2019-05-24 10:35:05 -07:00
ifeq ( $( feature-reallocarray) , 0)
CFLAGS += -DCOMPAT_NEED_REALLOCARRAY
endif
2018-01-17 10:52:10 -07:00
LDFLAGS += $( LIBOPENCSD_LDFLAGS)
EXTLIBS += $( OPENCSDLIBS)
$( call detected,CONFIG_LIBOPENCSD)
ifdef CSTRACE_RAW
CFLAGS += -DCS_DEBUG_RAW
ifeq ( ${ CSTRACE_RAW } , packed)
CFLAGS += -DCS_RAW_PACKED
endif
endif
2021-09-02 01:18:00 -07:00
else
2024-02-21 06:42:01 -07:00
$( error Error: No libopencsd library found or the version is not up-to-date. Please install recent libopencsd to build with CORESIGHT = 1)
2018-01-17 10:52:10 -07:00
endif
e n d i f
2023-09-14 14:19:45 -07:00
i f n d e f N O _ Z L I B
ifeq ( $( feature-zlib) , 1)
CFLAGS += -DHAVE_ZLIB_SUPPORT
EXTLIBS += -lz
$( call detected,CONFIG_ZLIB)
else
NO_ZLIB := 1
endif
e n d i f
2013-03-24 16:45:08 -07:00
i f n d e f N O _ L I B E L F
2013-10-07 01:05:51 -07:00
CFLAGS += -DHAVE_LIBELF_SUPPORT
2014-11-06 22:20:06 -07:00
EXTLIBS += -lelf
2014-12-29 15:52:25 -07:00
$( call detected,CONFIG_LIBELF)
2013-03-24 16:48:14 -07:00
2013-09-30 05:35:27 -07:00
ifeq ( $( feature-libelf-getphdrnum) , 1)
2013-10-07 01:05:51 -07:00
CFLAGS += -DHAVE_ELF_GETPHDRNUM_SUPPORT
endif
2016-07-12 08:19:09 -07:00
ifeq ( $( feature-libelf-gelf_getnote) , 1)
CFLAGS += -DHAVE_GELF_GETNOTE_SUPPORT
else
2024-02-21 06:42:01 -07:00
$( warning gelf_getnote( ) not found on libelf, SDT support disabled)
2016-07-12 08:19:09 -07:00
endif
2016-07-04 15:35:47 -07:00
ifeq ( $( feature-libelf-getshdrstrndx) , 1)
CFLAGS += -DHAVE_ELF_GETSHDRSTRNDX_SUPPORT
endif
2020-08-13 01:22:04 -07:00
ifndef NO_LIBDEBUGINFOD
$( call feature_check,libdebuginfod)
ifeq ( $( feature-libdebuginfod) , 1)
CFLAGS += -DHAVE_DEBUGINFOD_SUPPORT
EXTLIBS += -ldebuginfod
endif
endif
2013-10-07 01:05:51 -07:00
ifndef NO_DWARF
ifeq ( $( origin PERF_HAVE_DWARF_REGS) , undefined)
2024-02-21 06:42:01 -07:00
$( warning DWARF register mappings have not been defined for architecture $( SRCARCH) , DWARF support disabled)
2013-10-07 01:05:51 -07:00
NO_DWARF := 1
else
CFLAGS += -DHAVE_DWARF_SUPPORT $( LIBDW_CFLAGS)
LDFLAGS += $( LIBDW_LDFLAGS)
2015-08-12 15:48:37 -07:00
EXTLIBS += ${ DWARFLIBS }
2014-12-29 16:06:25 -07:00
$( call detected,CONFIG_DWARF)
2013-10-07 01:05:51 -07:00
endif # PERF_HAVE_DWARF_REGS
endif # NO_DWARF
2015-10-14 05:41:12 -07:00
ifndef NO_LIBBPF
ifeq ( $( feature-bpf) , 1)
2019-11-26 05:12:53 -07:00
# detecting libbpf without LIBBPF_DYNAMIC, so make VF=1 shows libbpf detection status
$( call feature_check,libbpf)
2023-01-15 18:01:14 -07:00
2019-11-26 05:12:53 -07:00
ifdef LIBBPF_DYNAMIC
ifeq ( $( feature-libbpf) , 1)
EXTLIBS += -lbpf
2023-09-14 14:19:45 -07:00
CFLAGS += -DHAVE_LIBBPF_SUPPORT
$( call detected,CONFIG_LIBBPF)
2021-05-08 13:50:20 -07:00
$( call detected,CONFIG_LIBBPF_DYNAMIC)
2019-11-26 05:12:53 -07:00
else
2024-02-21 06:42:01 -07:00
$( error Error: No libbpf devel library found or older than v1.0, please install/update libbpf-devel)
2019-11-26 05:12:53 -07:00
endif
perf build: Fix check for btf__load_from_kernel_by_id() in libbpf
Avi Kivity reported a problem where the __weak
btf__load_from_kernel_by_id() in tools/perf/util/bpf-event.c was being
used and it called btf__get_from_id() in tools/lib/bpf/btf.c that in
turn called back to btf__load_from_kernel_by_id(), resulting in an
endless loop.
Fix this by adding a feature test to check if
btf__load_from_kernel_by_id() is available when building perf with
LIBBPF_DYNAMIC=1, and if not then provide the fallback to the old
btf__get_from_id(), that doesn't call back to btf__load_from_kernel_by_id()
since at that time it didn't exist at all.
Tested on Fedora 35 where we have libbpf-devel 0.4.0 with LIBBPF_DYNAMIC
where we don't have btf__load_from_kernel_by_id() and thus its feature
test fail, not defining HAVE_LIBBPF_BTF__LOAD_FROM_KERNEL_BY_ID:
$ cat /tmp/build/perf-urgent/feature/test-libbpf-btf__load_from_kernel_by_id.make.output
test-libbpf-btf__load_from_kernel_by_id.c: In function ‘main’:
test-libbpf-btf__load_from_kernel_by_id.c:6:16: error: implicit declaration of function ‘btf__load_from_kernel_by_id’ [-Werror=implicit-function-declaration]
6 | return btf__load_from_kernel_by_id(20151128, NULL);
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~
cc1: all warnings being treated as errors
$
$ nm /tmp/build/perf-urgent/perf | grep btf__load_from_kernel_by_id
00000000005ba180 T btf__load_from_kernel_by_id
$
$ objdump --disassemble=btf__load_from_kernel_by_id -S /tmp/build/perf-urgent/perf
/tmp/build/perf-urgent/perf: file format elf64-x86-64
<SNIP>
00000000005ba180 <btf__load_from_kernel_by_id>:
#include "record.h"
#include "util/synthetic-events.h"
#ifndef HAVE_LIBBPF_BTF__LOAD_FROM_KERNEL_BY_ID
struct btf *btf__load_from_kernel_by_id(__u32 id)
{
5ba180: 55 push %rbp
5ba181: 48 89 e5 mov %rsp,%rbp
5ba184: 48 83 ec 10 sub $0x10,%rsp
5ba188: 64 48 8b 04 25 28 00 mov %fs:0x28,%rax
5ba18f: 00 00
5ba191: 48 89 45 f8 mov %rax,-0x8(%rbp)
5ba195: 31 c0 xor %eax,%eax
struct btf *btf;
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
int err = btf__get_from_id(id, &btf);
5ba197: 48 8d 75 f0 lea -0x10(%rbp),%rsi
5ba19b: e8 a0 57 e5 ff call 40f940 <btf__get_from_id@plt>
5ba1a0: 89 c2 mov %eax,%edx
#pragma GCC diagnostic pop
return err ? ERR_PTR(err) : btf;
5ba1a2: 48 98 cltq
5ba1a4: 85 d2 test %edx,%edx
5ba1a6: 48 0f 44 45 f0 cmove -0x10(%rbp),%rax
}
<SNIP>
Fixes: 218e7b775d368f38 ("perf bpf: Provide a weak btf__load_from_kernel_by_id() for older libbpf versions")
Reported-by: Avi Kivity <avi@scylladb.com>
Link: https://lore.kernel.org/linux-perf-users/f0add43b-3de5-20c5-22c4-70aff4af959f@scylladb.com
Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: Ian Rogers <irogers@google.com>
Cc: Jiri Olsa <jolsa@kernel.org>
Cc: Namhyung Kim <namhyung@kernel.org>
Link: https://lore.kernel.org/linux-perf-users/YobjjFOblY4Xvwo7@kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2022-05-19 17:25:12 -07:00
else
2023-09-14 14:19:45 -07:00
ifeq ( $( NO_ZLIB) , 1)
2024-02-21 06:42:01 -07:00
$( warning Warning: Statically building libbpf not possible as zlib is missing)
2023-09-14 14:19:45 -07:00
NO_LIBBPF := 1
else
# Libbpf will be built as a static library from tools/lib/bpf.
LIBBPF_STATIC := 1
$( call detected,CONFIG_LIBBPF)
CFLAGS += -DHAVE_LIBBPF_SUPPORT
endif
2019-11-26 05:12:53 -07:00
endif
2015-10-14 05:41:12 -07:00
endif
endif # NO_LIBBPF
2013-03-24 16:45:08 -07:00
e n d i f # NO_LIBELF
2013-03-24 16:53:03 -07:00
2016-07-12 03:05:56 -07:00
i f n d e f N O _ S D T
ifneq ( $( feature-sdt) , 1)
2024-02-21 06:42:01 -07:00
$( warning No sys/sdt.h found, no SDT events are defined, please install systemtap-sdt-devel or systemtap-sdt-dev)
2016-07-12 03:05:56 -07:00
NO_SDT := 1;
else
CFLAGS += -DHAVE_SDT_EVENT
$( call detected,CONFIG_SDT_EVENT)
endif
e n d i f
2016-03-10 09:41:13 -07:00
i f d e f P E R F _ H A V E _ J I T D U M P
2016-10-13 03:59:36 -07:00
ifndef NO_LIBELF
2016-03-10 09:41:13 -07:00
$( call detected,CONFIG_JITDUMP)
CFLAGS += -DHAVE_JITDUMP
endif
e n d i f
2017-04-09 20:02:37 -07:00
i f e q ( $( SRCARCH ) , p o w e r p c )
2014-08-25 01:25:06 -07:00
ifndef NO_DWARF
CFLAGS += -DHAVE_SKIP_CALLCHAIN_IDX
endif
e n d i f
2013-03-24 16:53:03 -07:00
i f n d e f N O _ L I B U N W I N D
2016-06-02 20:33:15 -07:00
have_libunwind :=
2016-06-02 20:33:22 -07:00
2019-02-12 12:34:32 -07:00
$( call feature_check,libunwind-x86)
2016-06-02 20:33:22 -07:00
ifeq ( $( feature-libunwind-x86) , 1)
$( call detected,CONFIG_LIBUNWIND_X86)
CFLAGS += -DHAVE_LIBUNWIND_X86_SUPPORT
LDFLAGS += -lunwind-x86
2016-06-15 04:03:56 -07:00
EXTLIBS_LIBUNWIND += -lunwind-x86
2016-06-02 20:33:22 -07:00
have_libunwind = 1
endif
2019-02-12 12:34:32 -07:00
$( call feature_check,libunwind-aarch64)
2016-06-02 20:33:23 -07:00
ifeq ( $( feature-libunwind-aarch64) , 1)
$( call detected,CONFIG_LIBUNWIND_AARCH64)
CFLAGS += -DHAVE_LIBUNWIND_AARCH64_SUPPORT
LDFLAGS += -lunwind-aarch64
2016-06-15 04:03:56 -07:00
EXTLIBS_LIBUNWIND += -lunwind-aarch64
2016-06-02 20:33:23 -07:00
have_libunwind = 1
$( call feature_check,libunwind-debug-frame-aarch64)
ifneq ( $( feature-libunwind-debug-frame-aarch64) , 1)
2024-02-21 06:42:01 -07:00
$( warning No debug_frame support found in libunwind-aarch64)
2016-06-02 20:33:23 -07:00
CFLAGS += -DNO_LIBUNWIND_DEBUG_FRAME_AARCH64
endif
endif
2013-09-30 05:45:44 -07:00
ifneq ( $( feature-libunwind) , 1)
2024-02-21 06:42:01 -07:00
$( warning No libunwind found. Please install libunwind-dev[ el] >= 1.1 and/or set LIBUNWIND_DIR)
2016-06-02 20:33:15 -07:00
NO_LOCAL_LIBUNWIND := 1
else
have_libunwind := 1
$( call detected,CONFIG_LOCAL_LIBUNWIND)
endif
ifneq ( $( have_libunwind) , 1)
2013-10-07 01:30:47 -07:00
NO_LIBUNWIND := 1
2014-02-19 08:52:58 -07:00
endif
2016-06-02 20:33:15 -07:00
e l s e
NO_LOCAL_LIBUNWIND := 1
2014-02-19 08:52:58 -07:00
e n d i f
2015-10-14 05:41:12 -07:00
i f n d e f N O _ L I B B P F
ifneq ( $( feature-bpf) , 1)
2024-02-21 06:42:01 -07:00
$( warning BPF API too old. Please install recent kernel headers. BPF support in 'perf record' is disabled.)
2015-10-14 05:41:12 -07:00
NO_LIBBPF := 1
endif
e n d i f
2023-09-14 14:19:45 -07:00
i f n d e f B U I L D _ B P F _ S K E L
# BPF skeletons control a large number of perf features, by default
# they are enabled.
BUILD_BPF_SKEL := 1
e n d i f
i f e q ( $( BUILD_BPF_SKEL ) , 1 )
2023-10-11 14:14:52 -07:00
ifeq ( $( filter -DHAVE_LIBELF_SUPPORT, $( CFLAGS) ) ,)
2024-02-21 06:42:01 -07:00
$( warning Warning: Disabled BPF skeletons as libelf is required by bpftool)
2023-09-14 14:19:45 -07:00
BUILD_BPF_SKEL := 0
else ifeq ( $( filter -DHAVE_ZLIB_SUPPORT, $( CFLAGS) ) ,)
2024-02-21 06:42:01 -07:00
$( warning Warning: Disabled BPF skeletons as zlib is required by bpftool)
2023-09-14 14:19:45 -07:00
BUILD_BPF_SKEL := 0
2023-10-11 14:14:52 -07:00
else ifeq ( $( filter -DHAVE_LIBBPF_SUPPORT, $( CFLAGS) ) ,)
2024-02-21 06:42:01 -07:00
$( warning Warning: Disabled BPF skeletons as libbpf is required)
2023-10-11 14:14:52 -07:00
BUILD_BPF_SKEL := 0
2023-09-14 14:19:45 -07:00
else ifeq ( $( call get-executable,$( CLANG) ) ,)
2024-02-21 06:42:01 -07:00
$( warning Warning: Disabled BPF skeletons as clang ( $( CLANG) ) is missing)
2023-09-14 14:19:45 -07:00
BUILD_BPF_SKEL := 0
else
2023-10-27 07:18:47 -07:00
CLANG_VERSION := $( shell $( CLANG) --version | head -1 | sed 's/.*clang version \([[:digit:]]\+.[[:digit:]]\+.[[:digit:]]\+\).*/\1/g' )
2024-10-10 19:14:01 -07:00
ifeq ( $( call version-lt3,$( CLANG_VERSION) ,12.0.1) ,1)
$( warning Warning: Disabled BPF skeletons as reliable BTF generation needs at least $( CLANG) version 12.0.1)
2023-10-27 07:18:47 -07:00
BUILD_BPF_SKEL := 0
endif
endif
ifeq ( $( BUILD_BPF_SKEL) ,1)
2023-09-14 14:19:45 -07:00
$( call feature_check,clang-bpf-co-re)
ifeq ( $( feature-clang-bpf-co-re) , 0)
2024-02-21 06:42:01 -07:00
$( warning Warning: Disabled BPF skeletons as clang is too old)
2023-09-14 14:19:45 -07:00
BUILD_BPF_SKEL := 0
endif
endif
ifeq ( $( BUILD_BPF_SKEL) ,1)
$( call detected,CONFIG_PERF_BPF_SKEL)
CFLAGS += -DHAVE_BPF_SKEL
2022-05-20 14:18:26 -07:00
endif
2020-12-29 14:42:13 -07:00
e n d i f
2023-06-22 21:14:02 -07:00
i f n d e f G E N _ V M L I N U X _ H
VMLINUX_H = $( src-perf) /util/bpf_skel/vmlinux/vmlinux.h
e n d i f
2014-02-19 08:52:58 -07:00
dwarf-post-unwind := 1
dwarf-post-unwind-text := BUG
# setup DWARF post unwinder
i f d e f N O _ L I B U N W I N D
ifdef NO_LIBDW_DWARF_UNWIND
2024-02-21 06:42:01 -07:00
$( warning Disabling post unwind, no support found.)
2014-02-19 08:52:58 -07:00
dwarf-post-unwind := 0
Merge branch 'for-linus' of git://git.linaro.org/people/rmk/linux-arm
Pull ARM updates from Russell King:
"Included in this series are:
1. BE8 (modern big endian) changes for ARM from Ben Dooks
2. big.Little support from Nicolas Pitre and Dave Martin
3. support for LPAE systems with all system memory above 4GB
4. Perf updates from Will Deacon
5. Additional prefetching and other performance improvements from Will.
6. Neon-optimised AES implementation fro Ard.
7. A number of smaller fixes scattered around the place.
There is a rather horrid merge conflict in tools/perf - I was never
notified of the conflict because it originally occurred between Will's
tree and other stuff. Consequently I have a resolution which Will
forwarded me, which I'll forward on immediately after sending this
mail.
The other notable thing is I'm expecting some build breakage in the
crypto stuff on ARM only with Ard's AES patches. These were merged
into a stable git branch which others had already pulled, so there's
little I can do about this. The problem is caused because these
patches have a dependency on some code in the crypto git tree - I
tried requesting a branch I can pull to resolve these, and all I got
each time from the crypto people was "we'll revert our patches then"
which would only make things worse since I still don't have the
dependent patches. I've no idea what's going on there or how to
resolve that, and since I can't split these patches from the rest of
this pull request, I'm rather stuck with pushing this as-is or
reverting Ard's patches.
Since it should "come out in the wash" I've left them in - the only
build problems they seem to cause at the moment are with randconfigs,
and since it's a new feature anyway. However, if by -rc1 the
dependencies aren't in, I think it'd be best to revert Ard's patches"
I resolved the perf conflict roughly as per the patch sent by Russell,
but there may be some differences. Any errors are likely mine. Let's
see how the crypto issues work out..
* 'for-linus' of git://git.linaro.org/people/rmk/linux-arm: (110 commits)
ARM: 7868/1: arm/arm64: remove atomic_clear_mask() in "include/asm/atomic.h"
ARM: 7867/1: include: asm: use 'int' instead of 'unsigned long' for 'oldval' in atomic_cmpxchg().
ARM: 7866/1: include: asm: use 'long long' instead of 'u64' within atomic.h
ARM: 7871/1: amba: Extend number of IRQS
ARM: 7887/1: Don't smp_cross_call() on UP devices in arch_irq_work_raise()
ARM: 7872/1: Support arch_irq_work_raise() via self IPIs
ARM: 7880/1: Clear the IT state independent of the Thumb-2 mode
ARM: 7878/1: nommu: Implement dummy early_paging_init()
ARM: 7876/1: clear Thumb-2 IT state on exception handling
ARM: 7874/2: bL_switcher: Remove cpu_hotplug_driver_{lock,unlock}()
ARM: footbridge: fix build warnings for netwinder
ARM: 7873/1: vfp: clear vfp_current_hw_state for dying cpu
ARM: fix misplaced arch_virt_to_idmap()
ARM: 7848/1: mcpm: Implement cpu_kill() to synchronise on powerdown
ARM: 7847/1: mcpm: Factor out logical-to-physical CPU translation
ARM: 7869/1: remove unused XSCALE_PMU Kconfig param
ARM: 7864/1: Handle 64-bit memory in case of 32-bit phys_addr_t
ARM: 7863/1: Let arm_add_memory() always use 64-bit arguments
ARM: 7862/1: pcpu: replace __get_cpu_var_uses
ARM: 7861/1: cacheflush: consolidate single-CPU ARMv7 cache disabling code
...
2013-11-13 16:51:29 -07:00
else
2014-02-19 08:52:58 -07:00
dwarf-post-unwind-text := libdw
2014-12-29 16:11:11 -07:00
$( call detected,CONFIG_LIBDW_DWARF_UNWIND)
2014-02-19 08:52:58 -07:00
endif
e l s e
dwarf-post-unwind-text := libunwind
2014-12-29 16:11:11 -07:00
$( call detected,CONFIG_LIBUNWIND)
2014-02-19 08:52:58 -07:00
# Enable libunwind support by default.
ifndef NO_LIBDW_DWARF_UNWIND
NO_LIBDW_DWARF_UNWIND := 1
endif
e n d i f
i f e q ( $( dwarf -post -unwind ) , 1 )
CFLAGS += -DHAVE_DWARF_UNWIND_SUPPORT
2014-12-29 07:03:09 -07:00
$( call detected,CONFIG_DWARF_UNWIND)
2014-02-19 08:52:58 -07:00
e l s e
NO_DWARF_UNWIND := 1
e n d i f
2016-06-02 20:33:15 -07:00
i f n d e f N O _ L O C A L _ L I B U N W I N D
2017-04-09 20:02:37 -07:00
ifeq ( $( SRCARCH) ,$( filter $( SRCARCH) ,arm arm64) )
2014-02-19 08:52:58 -07:00
$( call feature_check,libunwind-debug-frame)
ifneq ( $( feature-libunwind-debug-frame) , 1)
2024-02-21 06:42:01 -07:00
$( warning No debug_frame support found in libunwind)
Merge branch 'for-linus' of git://git.linaro.org/people/rmk/linux-arm
Pull ARM updates from Russell King:
"Included in this series are:
1. BE8 (modern big endian) changes for ARM from Ben Dooks
2. big.Little support from Nicolas Pitre and Dave Martin
3. support for LPAE systems with all system memory above 4GB
4. Perf updates from Will Deacon
5. Additional prefetching and other performance improvements from Will.
6. Neon-optimised AES implementation fro Ard.
7. A number of smaller fixes scattered around the place.
There is a rather horrid merge conflict in tools/perf - I was never
notified of the conflict because it originally occurred between Will's
tree and other stuff. Consequently I have a resolution which Will
forwarded me, which I'll forward on immediately after sending this
mail.
The other notable thing is I'm expecting some build breakage in the
crypto stuff on ARM only with Ard's AES patches. These were merged
into a stable git branch which others had already pulled, so there's
little I can do about this. The problem is caused because these
patches have a dependency on some code in the crypto git tree - I
tried requesting a branch I can pull to resolve these, and all I got
each time from the crypto people was "we'll revert our patches then"
which would only make things worse since I still don't have the
dependent patches. I've no idea what's going on there or how to
resolve that, and since I can't split these patches from the rest of
this pull request, I'm rather stuck with pushing this as-is or
reverting Ard's patches.
Since it should "come out in the wash" I've left them in - the only
build problems they seem to cause at the moment are with randconfigs,
and since it's a new feature anyway. However, if by -rc1 the
dependencies aren't in, I think it'd be best to revert Ard's patches"
I resolved the perf conflict roughly as per the patch sent by Russell,
but there may be some differences. Any errors are likely mine. Let's
see how the crypto issues work out..
* 'for-linus' of git://git.linaro.org/people/rmk/linux-arm: (110 commits)
ARM: 7868/1: arm/arm64: remove atomic_clear_mask() in "include/asm/atomic.h"
ARM: 7867/1: include: asm: use 'int' instead of 'unsigned long' for 'oldval' in atomic_cmpxchg().
ARM: 7866/1: include: asm: use 'long long' instead of 'u64' within atomic.h
ARM: 7871/1: amba: Extend number of IRQS
ARM: 7887/1: Don't smp_cross_call() on UP devices in arch_irq_work_raise()
ARM: 7872/1: Support arch_irq_work_raise() via self IPIs
ARM: 7880/1: Clear the IT state independent of the Thumb-2 mode
ARM: 7878/1: nommu: Implement dummy early_paging_init()
ARM: 7876/1: clear Thumb-2 IT state on exception handling
ARM: 7874/2: bL_switcher: Remove cpu_hotplug_driver_{lock,unlock}()
ARM: footbridge: fix build warnings for netwinder
ARM: 7873/1: vfp: clear vfp_current_hw_state for dying cpu
ARM: fix misplaced arch_virt_to_idmap()
ARM: 7848/1: mcpm: Implement cpu_kill() to synchronise on powerdown
ARM: 7847/1: mcpm: Factor out logical-to-physical CPU translation
ARM: 7869/1: remove unused XSCALE_PMU Kconfig param
ARM: 7864/1: Handle 64-bit memory in case of 32-bit phys_addr_t
ARM: 7863/1: Let arm_add_memory() always use 64-bit arguments
ARM: 7862/1: pcpu: replace __get_cpu_var_uses
ARM: 7861/1: cacheflush: consolidate single-CPU ARMv7 cache disabling code
...
2013-11-13 16:51:29 -07:00
CFLAGS += -DNO_LIBUNWIND_DEBUG_FRAME
endif
2014-02-19 08:52:58 -07:00
else
# non-ARM has no dwarf_find_debug_frame() function:
CFLAGS += -DNO_LIBUNWIND_DEBUG_FRAME
endif
EXTLIBS += $( LIBUNWIND_LIBS)
2016-06-02 20:33:15 -07:00
LDFLAGS += $( LIBUNWIND_LIBS)
e n d i f
2017-08-20 04:39:32 -07:00
i f e q ( $( findstring -static ,$ {LDFLAGS }) , - s t a t i c )
# gcc -static links libgcc_eh which contans piece of libunwind
LIBUNWIND_LDFLAGS += -Wl,--allow-multiple-definition
e n d i f
2016-06-02 20:33:15 -07:00
i f n d e f N O _ L I B U N W I N D
CFLAGS += -DHAVE_LIBUNWIND_SUPPORT
2014-02-19 08:52:58 -07:00
CFLAGS += $( LIBUNWIND_CFLAGS)
LDFLAGS += $( LIBUNWIND_LDFLAGS)
2016-06-15 04:03:56 -07:00
EXTLIBS += $( EXTLIBS_LIBUNWIND)
2013-09-30 05:45:44 -07:00
e n d i f
2013-03-24 16:54:36 -07: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>
2022-12-05 15:59:39 -07:00
i f n e q ( $( NO_LIBTRACEEVENT ) , 1 )
ifeq ( $( NO_SYSCALL_TABLE) ,0)
$( call detected,CONFIG_TRACE)
else
ifndef NO_LIBAUDIT
$( call feature_check,libaudit)
ifneq ( $( feature-libaudit) , 1)
2024-02-21 06:42:01 -07:00
$( warning No libaudit.h found, disables 'trace' tool, please install audit-libs-devel or libaudit-dev)
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>
2022-12-05 15:59:39 -07:00
NO_LIBAUDIT := 1
else
CFLAGS += -DHAVE_LIBAUDIT_SUPPORT
EXTLIBS += -laudit
$( call detected,CONFIG_TRACE)
endif
2018-01-19 01:56:17 -07:00
endif
2013-04-14 19:06:58 -07:00
endif
2013-03-24 16:54:36 -07:00
e n d i f
2013-03-24 16:56:08 -07:00
2015-11-30 02:02:21 -07:00
i f n d e f N O _ L I B C R Y P T O
ifneq ( $( feature-libcrypto) , 1)
2024-02-21 06:42:01 -07:00
$( warning No libcrypto.h found, disables jitted code injection, please install openssl-devel or libssl-dev)
2015-11-30 02:02:21 -07:00
NO_LIBCRYPTO := 1
else
CFLAGS += -DHAVE_LIBCRYPTO_SUPPORT
EXTLIBS += -lcrypto
$( call detected,CONFIG_CRYPTO)
endif
e n d i f
2013-03-24 16:56:08 -07:00
i f n d e f N O _ S L A N G
2013-09-30 05:57:54 -07:00
ifneq ( $( feature-libslang) , 1)
2019-06-18 13:48:12 -07:00
ifneq ( $( feature-libslang-include-subdir) , 1)
2024-02-21 06:42:01 -07:00
$( warning slang not found, disables TUI support. Please install slang-devel, libslang-dev or libslang2-dev)
2019-06-18 13:48:12 -07:00
NO_SLANG := 1
else
CFLAGS += -DHAVE_SLANG_INCLUDE_SUBDIR
endif
endif
ifndef NO_SLANG
2013-04-14 19:06:58 -07:00
# Fedora has /usr/include/slang/slang.h, but ubuntu /usr/include/slang.h
2013-09-30 03:07:11 -07:00
CFLAGS += -DHAVE_SLANG_SUPPORT
2013-04-14 19:06:58 -07:00
EXTLIBS += -lslang
2014-12-29 16:27:52 -07:00
$( call detected,CONFIG_SLANG)
2013-04-14 19:06:58 -07:00
endif
2013-03-24 16:56:08 -07:00
e n d i f
2013-03-17 16:09:24 -07:00
2020-09-04 13:11:59 -07:00
i f d e f G T K 2
2014-01-15 03:44:08 -07:00
FLAGS_GTK2 = $( CFLAGS) $( LDFLAGS) $( EXTLIBS) $( shell $( PKG_CONFIG) --libs --cflags gtk+-2.0 2>/dev/null)
2020-09-04 13:11:59 -07:00
$( call feature_check,gtk2)
2013-09-30 06:01:56 -07:00
ifneq ( $( feature-gtk2) , 1)
2024-02-21 06:42:01 -07:00
$( warning GTK2 not found, disables GTK2 support. Please install gtk2-devel or libgtk2.0-dev)
2013-04-14 19:06:58 -07:00
NO_GTK2 := 1
else
2020-09-04 13:11:59 -07:00
$( call feature_check,gtk2-infobar)
2013-09-30 06:08:30 -07:00
ifeq ( $( feature-gtk2-infobar) , 1)
2013-09-12 23:27:43 -07:00
GTK_CFLAGS := -DHAVE_GTK_INFO_BAR_SUPPORT
2013-04-14 19:06:58 -07:00
endif
2013-09-30 03:07:11 -07:00
CFLAGS += -DHAVE_GTK2_SUPPORT
2014-01-15 03:44:08 -07:00
GTK_CFLAGS += $( shell $( PKG_CONFIG) --cflags gtk+-2.0 2>/dev/null)
GTK_LIBS := $( shell $( PKG_CONFIG) --libs gtk+-2.0 2>/dev/null)
2013-09-26 11:55:54 -07:00
EXTLIBS += -ldl
2013-04-14 19:06:58 -07:00
endif
2013-03-17 16:09:24 -07:00
e n d i f
2013-03-17 16:19:44 -07:00
i f d e f N O _ L I B P E R L
2013-04-14 19:06:58 -07:00
CFLAGS += -DNO_LIBPERL
2013-03-17 16:19:44 -07:00
e l s e
2013-04-14 19:06:58 -07:00
PERL_EMBED_LDOPTS = $( shell perl -MExtUtils::Embed -e ldopts 2>/dev/null)
PERL_EMBED_LDFLAGS = $( call strip-libs,$( PERL_EMBED_LDOPTS) )
PERL_EMBED_LIBADD = $( call grep-libs,$( PERL_EMBED_LDOPTS) )
2017-11-08 03:27:37 -07:00
PERL_EMBED_CCOPTS = $( shell perl -MExtUtils::Embed -e ccopts 2>/dev/null)
2017-12-04 08:23:08 -07:00
PERL_EMBED_CCOPTS := $( filter-out -specs= %,$( PERL_EMBED_CCOPTS) )
2020-10-28 09:59:00 -07:00
PERL_EMBED_CCOPTS := $( filter-out -flto= auto -ffat-lto-objects, $( PERL_EMBED_CCOPTS) )
2017-12-04 08:23:08 -07:00
PERL_EMBED_LDOPTS := $( filter-out -specs= %,$( PERL_EMBED_LDOPTS) )
2013-04-14 19:06:58 -07:00
FLAGS_PERL_EMBED = $( PERL_EMBED_CCOPTS) $( PERL_EMBED_LDOPTS)
2013-09-30 06:15:36 -07:00
ifneq ( $( feature-libperl) , 1)
2013-04-14 19:06:58 -07:00
CFLAGS += -DNO_LIBPERL
NO_LIBPERL := 1
2024-02-21 06:42:01 -07:00
$( warning Missing perl devel files. Disabling perl scripting support, please install perl-ExtUtils-Embed/libperl-dev)
2013-04-14 19:06:58 -07:00
else
LDFLAGS += $( PERL_EMBED_LDFLAGS)
EXTLIBS += $( PERL_EMBED_LIBADD)
2018-03-30 02:27:12 -07:00
CFLAGS += -DHAVE_LIBPERL_SUPPORT
tools build: Filter out options and warnings not supported by clang
These make the feature check fail when using clang, so remove them just
like is done in tools/perf/Makefile.config to build perf itself.
Adding -Wno-compound-token-split-by-macro to tools/perf/Makefile.config
when building with clang is also necessary to avoid these warnings
turned into errors (-Werror):
CC /tmp/build/perf/util/scripting-engines/trace-event-perl.o
In file included from util/scripting-engines/trace-event-perl.c:35:
In file included from /usr/lib64/perl5/CORE/perl.h:4085:
In file included from /usr/lib64/perl5/CORE/hv.h:659:
In file included from /usr/lib64/perl5/CORE/hv_func.h:34:
In file included from /usr/lib64/perl5/CORE/sbox32_hash.h:4:
/usr/lib64/perl5/CORE/zaphod32_hash.h:150:5: error: '(' and '{' tokens introducing statement expression appear in different macro expansion contexts [-Werror,-Wcompound-token-split-by-macro]
ZAPHOD32_SCRAMBLE32(state[0],0x9fade23b);
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/usr/lib64/perl5/CORE/zaphod32_hash.h:80:38: note: expanded from macro 'ZAPHOD32_SCRAMBLE32'
#define ZAPHOD32_SCRAMBLE32(v,prime) STMT_START { \
^~~~~~~~~~
/usr/lib64/perl5/CORE/perl.h:737:29: note: expanded from macro 'STMT_START'
# define STMT_START (void)( /* gcc supports "({ STATEMENTS; })" */
^
/usr/lib64/perl5/CORE/zaphod32_hash.h:150:5: note: '{' token is here
ZAPHOD32_SCRAMBLE32(state[0],0x9fade23b);
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/usr/lib64/perl5/CORE/zaphod32_hash.h:80:49: note: expanded from macro 'ZAPHOD32_SCRAMBLE32'
#define ZAPHOD32_SCRAMBLE32(v,prime) STMT_START { \
^
/usr/lib64/perl5/CORE/zaphod32_hash.h:150:5: error: '}' and ')' tokens terminating statement expression appear in different macro expansion contexts [-Werror,-Wcompound-token-split-by-macro]
ZAPHOD32_SCRAMBLE32(state[0],0x9fade23b);
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/usr/lib64/perl5/CORE/zaphod32_hash.h:87:41: note: expanded from macro 'ZAPHOD32_SCRAMBLE32'
v ^= (v>>23); \
^
/usr/lib64/perl5/CORE/zaphod32_hash.h:150:5: note: ')' token is here
ZAPHOD32_SCRAMBLE32(state[0],0x9fade23b);
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/usr/lib64/perl5/CORE/zaphod32_hash.h:88:3: note: expanded from macro 'ZAPHOD32_SCRAMBLE32'
} STMT_END
^~~~~~~~
/usr/lib64/perl5/CORE/perl.h:738:21: note: expanded from macro 'STMT_END'
# define STMT_END )
^
Please refer to the discussion on the Link: tag below, where Nathan
clarifies the situation:
<quote>
acme> And then get to the problems at the end of this message, which seem
acme> similar to the problem described here:
acme>
acme> From Nathan Chancellor <>
acme> Subject [PATCH] mwifiex: Remove unnecessary braces from HostCmd_SET_SEQ_NO_BSS_INFO
acme>
acme> https://lkml.org/lkml/2020/9/1/135
acme>
acme> So perhaps in this case its better to disable that
acme> -Werror,-Wcompound-token-split-by-macro when building with clang?
Yes, I think that is probably the best solution. As far as I can tell,
at least in this file and context, the warning appears harmless, as the
"create a GNU C statement expression from two different macros" is very
much intentional, based on the presence of PERL_USE_GCC_BRACE_GROUPS.
The warning is fixed in upstream Perl by just avoiding creating GNU C
statement expressions using STMT_START and STMT_END:
https://github.com/Perl/perl5/issues/18780
https://github.com/Perl/perl5/pull/18984
If I am reading the source code correctly, an alternative to disabling
the warning would be specifying -DPERL_GCC_BRACE_GROUPS_FORBIDDEN but it
seems like that might end up impacting more than just this site,
according to the issue discussion above.
</quote>
Based-on-a-patch-by: Sedat Dilek <sedat.dilek@gmail.com>
Tested-by: Sedat Dilek <sedat.dilek@gmail.com> # Debian/Selfmade LLVM-14 (x86-64)
Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: Fangrui Song <maskray@google.com>
Cc: Florian Fainelli <f.fainelli@gmail.com>
Cc: Ian Rogers <irogers@google.com>
Cc: Jiri Olsa <jolsa@kernel.org>
Cc: John Keeping <john@metanate.com>
Cc: Leo Yan <leo.yan@linaro.org>
Cc: Michael Petlan <mpetlan@redhat.com>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Nathan Chancellor <nathan@kernel.org>
Cc: Nick Desaulniers <ndesaulniers@google.com>
Link: http://lore.kernel.org/lkml/YkxWcYzph5pC1EK8@kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2022-04-05 06:33:21 -07:00
ifeq ( $( CC_NO_CLANG) , 0)
CFLAGS += -Wno-compound-token-split-by-macro
endif
2014-12-30 05:11:32 -07:00
$( call detected,CONFIG_LIBPERL)
2013-04-14 19:06:58 -07:00
endif
2013-03-17 16:19:44 -07:00
e n d i f
2013-03-17 16:35:32 -07:00
2013-10-29 09:43:16 -07:00
i f e q ( $( feature -timerfd ) , 1 )
CFLAGS += -DHAVE_TIMERFD_SUPPORT
e l s e
2024-02-21 06:42:01 -07:00
$( warning No timerfd support. Disables 'perf kvm stat live' )
2013-10-29 09:43:16 -07:00
e n d i f
2013-03-17 16:35:32 -07:00
disable-python = $( eval $( disable-python_code) )
d e f i n e d i s a b l e - p y t h o n _ c o d e
2013-03-21 03:30:54 -07:00
CFLAGS += -DNO_LIBPYTHON
2015-02-28 01:33:45 -07:00
$( warning $1 )
2013-03-17 16:35:32 -07:00
NO_LIBPYTHON := 1
e n d e f
2022-12-13 16:26:47 -07:00
PYTHON_EXTENSION_SUFFIX := '.so'
2014-07-28 23:57:19 -07:00
i f d e f N O _ L I B P Y T H O N
2015-02-28 01:33:45 -07:00
$( call disable-python,Python support disabled by user)
2013-03-17 16:35:32 -07:00
e l s e
2014-07-28 23:57:19 -07:00
ifndef PYTHON
2015-02-28 01:33:45 -07:00
$( call disable-python,No python interpreter was found: disables Python support - please install python-devel/python-dev)
2013-03-17 16:35:32 -07:00
else
2014-07-28 23:57:19 -07:00
PYTHON_WORD := $( call shell-wordify,$( PYTHON) )
2013-03-17 16:35:32 -07:00
ifndef PYTHON_CONFIG
2015-02-28 01:33:45 -07:00
$( call disable-python,No 'python-config' tool was found: disables Python support - please install python-devel/python-dev)
2013-03-17 16:35:32 -07:00
else
2013-09-30 06:18:37 -07:00
ifneq ( $( feature-libpython) , 1)
2022-12-21 10:08:20 -07:00
$( call disable-python,No 'Python.h' was found: disables Python support - please install python-devel/python-dev)
2013-03-17 16:35:32 -07:00
else
perf tools: Add Python 3 support
Added Python 3 support while keeping Python 2.7 compatibility.
Committer notes:
This doesn't make it to auto detect python 3, one has to explicitely ask
it to build with python 3 devel files, here are the instructions
provided by Jaroslav:
---
$ cp -a tools/perf tools/python3-perf
$ make V=1 prefix=/usr -C tools/perf PYTHON=/usr/bin/python2 all
$ make V=1 prefix=/usr -C tools/python3-perf PYTHON=/usr/bin/python3 all
$ make V=1 prefix=/usr -C tools/python3-perf PYTHON=/usr/bin/python3 DESTDIR=%{buildroot} install-python_ext
$ make V=1 prefix=/usr -C tools/perf PYTHON=/usr/bin/python2 DESTDIR=%{buildroot} install-python_ext
---
We need to make this automatic, just like the existing tests for checking if
the python2 devel files are in place, allowing the build with python3 if
available, fallbacking to python2 and then just disabling it if none are
available.
So, using the PYTHON variable to build it using O= we get:
Before this patch:
$ rpm -q python3 python3-devel
python3-3.6.4-7.fc27.x86_64
python3-devel-3.6.4-7.fc27.x86_64
$ rm -rf /tmp/build/perf/ ; mkdir -p /tmp/build/perf ; make O=/tmp/build/perf PYTHON=/usr/bin/python3 -C tools/perf install-bin
make: Entering directory '/home/acme/git/linux/tools/perf'
<SNIP>
Makefile.config:670: Python 3 is not yet supported; please set
Makefile.config:671: PYTHON and/or PYTHON_CONFIG appropriately.
Makefile.config:672: If you also have Python 2 installed, then
Makefile.config:673: try something like:
Makefile.config:674:
Makefile.config:675: make PYTHON=python2
Makefile.config:676:
Makefile.config:677: Otherwise, disable Python support entirely:
Makefile.config:678:
Makefile.config:679: make NO_LIBPYTHON=1
Makefile.config:680:
Makefile.config:681: *** . Stop.
make[1]: *** [Makefile.perf:212: sub-make] Error 2
make: *** [Makefile:110: install-bin] Error 2
make: Leaving directory '/home/acme/git/linux/tools/perf'
$
After:
$ make O=/tmp/build/perf PYTHON=python3 -C tools/perf install-bin
$ ldd ~/bin/perf | grep python
libpython3.6m.so.1.0 => /lib64/libpython3.6m.so.1.0 (0x00007f58a31e8000)
$ rpm -qf /lib64/libpython3.6m.so.1.0
python3-libs-3.6.4-7.fc27.x86_64
$
Now verify that when using the binding the right ELF file is loaded,
using perf trace:
$ perf trace -e open* perf test python
0.051 ( 0.016 ms): perf/3927 openat(dfd: CWD, filename: /etc/ld.so.cache, flags: CLOEXEC ) = 3
<SNIP>
18: 'import perf' in python :
8.849 ( 0.013 ms): sh/3929 openat(dfd: CWD, filename: /etc/ld.so.cache, flags: CLOEXEC ) = 3
<SNIP>
25.572 ( 0.008 ms): python3/3931 openat(dfd: CWD, filename: /tmp/build/perf/python/perf.cpython-36m-x86_64-linux-gnu.so, flags: CLOEXEC) = 3
<SNIP>
Ok
<SNIP>
$
And using tools/perf/python/twatch.py, to show PERF_RECORD_ metaevents:
$ python3 tools/perf/python/twatch.py
cpu: 3, pid: 16060, tid: 16060 { type: fork, pid: 5207, ppid: 16060, tid: 5207, ptid: 16060, time: 10798513015459}
cpu: 3, pid: 16060, tid: 16060 { type: fork, pid: 5208, ppid: 16060, tid: 5208, ptid: 16060, time: 10798513562503}
cpu: 0, pid: 5208, tid: 5208 { type: comm, pid: 5208, tid: 5208, comm: grep }
cpu: 2, pid: 5207, tid: 5207 { type: comm, pid: 5207, tid: 5207, comm: ps }
cpu: 2, pid: 5207, tid: 5207 { type: exit, pid: 5207, ppid: 5207, tid: 5207, ptid: 5207, time: 10798551337484}
cpu: 3, pid: 5208, tid: 5208 { type: exit, pid: 5208, ppid: 5208, tid: 5208, ptid: 5208, time: 10798551292153}
cpu: 3, pid: 601, tid: 601 { type: fork, pid: 5209, ppid: 601, tid: 5209, ptid: 601, time: 10801779977324}
^CTraceback (most recent call last):
File "tools/perf/python/twatch.py", line 68, in <module>
main()
File "tools/perf/python/twatch.py", line 40, in main
evlist.poll(timeout = -1)
KeyboardInterrupt
$
# ps ax|grep twatch
5197 pts/8 S+ 0:00 python3 tools/perf/python/twatch.py
# ls -la /proc/5197/smaps
-r--r--r--. 1 acme acme 0 Feb 19 13:14 /proc/5197/smaps
# grep python /proc/5197/smaps
558111307000-558111309000 r-xp 00000000 fd:00 3151710 /usr/bin/python3.6
558111508000-558111509000 r--p 00001000 fd:00 3151710 /usr/bin/python3.6
558111509000-55811150a000 rw-p 00002000 fd:00 3151710 /usr/bin/python3.6
7ffad6fc1000-7ffad7008000 r-xp 00000000 00:2d 220196 /tmp/build/perf/python/perf.cpython-36m-x86_64-linux-gnu.so
7ffad7008000-7ffad7207000 ---p 00047000 00:2d 220196 /tmp/build/perf/python/perf.cpython-36m-x86_64-linux-gnu.so
7ffad7207000-7ffad7208000 r--p 00046000 00:2d 220196 /tmp/build/perf/python/perf.cpython-36m-x86_64-linux-gnu.so
7ffad7208000-7ffad7215000 rw-p 00047000 00:2d 220196 /tmp/build/perf/python/perf.cpython-36m-x86_64-linux-gnu.so
7ffadea77000-7ffaded3d000 r-xp 00000000 fd:00 3151795 /usr/lib64/libpython3.6m.so.1.0
7ffaded3d000-7ffadef3c000 ---p 002c6000 fd:00 3151795 /usr/lib64/libpython3.6m.so.1.0
7ffadef3c000-7ffadef42000 r--p 002c5000 fd:00 3151795 /usr/lib64/libpython3.6m.so.1.0
7ffadef42000-7ffadefa5000 rw-p 002cb000 fd:00 3151795 /usr/lib64/libpython3.6m.so.1.0
#
And with this patch, but building normally, without specifying the
PYTHON=python3 part, which will make it use python2 if its devel files are
available, like in this test:
$ make O=/tmp/build/perf -C tools/perf install-bin
$ ldd ~/bin/perf | grep python
libpython2.7.so.1.0 => /lib64/libpython2.7.so.1.0 (0x00007f6a44410000)
$ ldd /tmp/build/perf/python_ext_build/lib/perf.so | grep python
libpython2.7.so.1.0 => /lib64/libpython2.7.so.1.0 (0x00007fed28a2c000)
$
[acme@jouet perf]$ tools/perf/python/twatch.py
cpu: 0, pid: 2817, tid: 2817 { type: fork, pid: 2817, ppid: 2817, tid: 8910, ptid: 2817, time: 11126454335306}
cpu: 0, pid: 2817, tid: 2817 { type: comm, pid: 2817, tid: 8910, comm: worker }
$ ps ax | grep twatch.py
8909 pts/8 S+ 0:00 /usr/bin/python tools/perf/python/twatch.py
$ grep python /proc/8909/smaps
5579de658000-5579de659000 r-xp 00000000 fd:00 3156044 /usr/bin/python2.7
5579de858000-5579de859000 r--p 00000000 fd:00 3156044 /usr/bin/python2.7
5579de859000-5579de85a000 rw-p 00001000 fd:00 3156044 /usr/bin/python2.7
7f0de01f7000-7f0de023e000 r-xp 00000000 00:2d 230695 /tmp/build/perf/python/perf.so
7f0de023e000-7f0de043d000 ---p 00047000 00:2d 230695 /tmp/build/perf/python/perf.so
7f0de043d000-7f0de043e000 r--p 00046000 00:2d 230695 /tmp/build/perf/python/perf.so
7f0de043e000-7f0de044b000 rw-p 00047000 00:2d 230695 /tmp/build/perf/python/perf.so
7f0de6f0f000-7f0de6f13000 r-xp 00000000 fd:00 134975 /usr/lib64/python2.7/lib-dynload/_localemodule.so
7f0de6f13000-7f0de7113000 ---p 00004000 fd:00 134975 /usr/lib64/python2.7/lib-dynload/_localemodule.so
7f0de7113000-7f0de7114000 r--p 00004000 fd:00 134975 /usr/lib64/python2.7/lib-dynload/_localemodule.so
7f0de7114000-7f0de7115000 rw-p 00005000 fd:00 134975 /usr/lib64/python2.7/lib-dynload/_localemodule.so
7f0de7e73000-7f0de8052000 r-xp 00000000 fd:00 3173292 /usr/lib64/libpython2.7.so.1.0
7f0de8052000-7f0de8251000 ---p 001df000 fd:00 3173292 /usr/lib64/libpython2.7.so.1.0
7f0de8251000-7f0de8255000 r--p 001de000 fd:00 3173292 /usr/lib64/libpython2.7.so.1.0
7f0de8255000-7f0de8291000 rw-p 001e2000 fd:00 3173292 /usr/lib64/libpython2.7.so.1.0
$
Signed-off-by: Jaroslav Škarvada <jskarvad@redhat.com>
Tested-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: David Ahern <dsahern@gmail.com>
Cc: Jiri Olsa <jolsa@kernel.org>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Wang Nan <wangnan0@huawei.com>
LPU-Reference: 20180119205641.24242-1-jskarvad@redhat.com
Link: https://lkml.kernel.org/n/tip-8d7dt9kqp83vsz25hagug8fu@git.kernel.org
[ Removed explicit check for python version, allowing it to really build with python3 ]
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2018-01-19 13:56:41 -07:00
LDFLAGS += $( PYTHON_EMBED_LDFLAGS)
EXTLIBS += $( PYTHON_EMBED_LIBADD)
perf python: Don't stop building if python setuptools isn't installed
The python3-setuptools package is needed to build the python binding, so
that one can use things like:
# ~acme/git/perf/tools/perf/python/twatch.py
cpu: 6, pid: 4573, tid: 2184618 { type: exit, pid: 4573, ppid: 4172, tid: 2184618, ptid: 4172, time: 12563190090107}
cpu: 24, pid: 4573, tid: 4573 { type: fork, pid: 4573, ppid: 4573, tid: 2190991, ptid: 4573, time: 12563415289331}
cpu: 29, pid: 4573, tid: 2190991 { type: comm, pid: 4573, tid: 2190991, comm: StreamT~ns #401 }
cpu: 29, pid: 4573, tid: 2190991 { type: comm, pid: 4573, tid: 2190991, comm: StreamT~ns #401 }
^CTraceback (most recent call last):
File "/var/home/acme/git/perf/tools/perf/python/twatch.py", line 61, in <module>
main()
File "/var/home/acme/git/perf/tools/perf/python/twatch.py", line 33, in main
evlist.poll(timeout = -1)
KeyboardInterrupt
#
That have 'import perf;'.
But distros don't always have that python3-setuptools (or equivalent)
installed, which was breaking the build. Just check if it is installed
and emit a warning that such binding isn't being built and continue the
build without it:
With it:
$ rpm -q python3-setuptools
python3-setuptools-59.6.0-3.fc36.noarch
$ rm -rf /tmp/build/perf; mkdir -p /tmp/build/perf
$ make O=/tmp/build/perf -C tools/perf install-bin
make: Entering directory '/var/home/acme/git/perf/tools/perf'
<SNIP>
... libpython: [ on ]
<SNIP>
GEN /tmp/build/perf/python/perf.cpython-310-x86_64-linux-gnu.so
<SNIP>
$ ls -la /tmp/build/perf/python/perf.cpython-310-x86_64-linux-gnu.so
-rwxr-xr-x. 1 acme acme 1609112 Dec 17 11:39 /tmp/build/perf/python/perf.cpython-310-x86_64-linux-gnu.so
$
Without it:
$ sudo rpm -e python3-setuptools
$ rm -rf /tmp/build/perf ; mkdir -p /tmp/build/perf
$ make O=/tmp/build/perf -C tools/perf install-bin
make: Entering directory '/var/home/acme/git/perf/tools/perf'
<SNIP>
... libpython: [ on ]
<SNIP>
$ ls -la /tmp/build/perf/python/perf.cpython-310-x86_64-linux-gnu.so
ls: cannot access '/tmp/build/perf/python/perf.cpython-310-x86_64-linux-gnu.so': No such file or directory
$
Reported-by: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: Ian Rogers <irogers@google.com>
Cc: Jiri Olsa <jolsa@kernel.org>
Cc: Namhyung Kim <namhyung@kernel.org>
Link: http://lore.kernel.org/lkml/Y53XHw3rlsaaUgOs@kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2022-12-17 07:37:15 -07:00
PYTHON_SETUPTOOLS_INSTALLED := $( shell $( PYTHON) -c 'import setuptools;' 2> /dev/null && echo "yes" || echo "no" )
ifeq ( $( PYTHON_SETUPTOOLS_INSTALLED) , yes)
PYTHON_EXTENSION_SUFFIX := $( shell $( PYTHON) -c 'from importlib import machinery; print(machinery.EXTENSION_SUFFIXES[0])' )
2024-07-17 01:22:07 -07:00
ifdef CROSS_COMPILE
PYTHON_EXTENSION_SUFFIX := $( subst $( PYTHON_NATIVE) ,$( shell $( CC) -dumpmachine) ,$( PYTHON_EXTENSION_SUFFIX) )
endif
perf python: Don't stop building if python setuptools isn't installed
The python3-setuptools package is needed to build the python binding, so
that one can use things like:
# ~acme/git/perf/tools/perf/python/twatch.py
cpu: 6, pid: 4573, tid: 2184618 { type: exit, pid: 4573, ppid: 4172, tid: 2184618, ptid: 4172, time: 12563190090107}
cpu: 24, pid: 4573, tid: 4573 { type: fork, pid: 4573, ppid: 4573, tid: 2190991, ptid: 4573, time: 12563415289331}
cpu: 29, pid: 4573, tid: 2190991 { type: comm, pid: 4573, tid: 2190991, comm: StreamT~ns #401 }
cpu: 29, pid: 4573, tid: 2190991 { type: comm, pid: 4573, tid: 2190991, comm: StreamT~ns #401 }
^CTraceback (most recent call last):
File "/var/home/acme/git/perf/tools/perf/python/twatch.py", line 61, in <module>
main()
File "/var/home/acme/git/perf/tools/perf/python/twatch.py", line 33, in main
evlist.poll(timeout = -1)
KeyboardInterrupt
#
That have 'import perf;'.
But distros don't always have that python3-setuptools (or equivalent)
installed, which was breaking the build. Just check if it is installed
and emit a warning that such binding isn't being built and continue the
build without it:
With it:
$ rpm -q python3-setuptools
python3-setuptools-59.6.0-3.fc36.noarch
$ rm -rf /tmp/build/perf; mkdir -p /tmp/build/perf
$ make O=/tmp/build/perf -C tools/perf install-bin
make: Entering directory '/var/home/acme/git/perf/tools/perf'
<SNIP>
... libpython: [ on ]
<SNIP>
GEN /tmp/build/perf/python/perf.cpython-310-x86_64-linux-gnu.so
<SNIP>
$ ls -la /tmp/build/perf/python/perf.cpython-310-x86_64-linux-gnu.so
-rwxr-xr-x. 1 acme acme 1609112 Dec 17 11:39 /tmp/build/perf/python/perf.cpython-310-x86_64-linux-gnu.so
$
Without it:
$ sudo rpm -e python3-setuptools
$ rm -rf /tmp/build/perf ; mkdir -p /tmp/build/perf
$ make O=/tmp/build/perf -C tools/perf install-bin
make: Entering directory '/var/home/acme/git/perf/tools/perf'
<SNIP>
... libpython: [ on ]
<SNIP>
$ ls -la /tmp/build/perf/python/perf.cpython-310-x86_64-linux-gnu.so
ls: cannot access '/tmp/build/perf/python/perf.cpython-310-x86_64-linux-gnu.so': No such file or directory
$
Reported-by: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: Ian Rogers <irogers@google.com>
Cc: Jiri Olsa <jolsa@kernel.org>
Cc: Namhyung Kim <namhyung@kernel.org>
Link: http://lore.kernel.org/lkml/Y53XHw3rlsaaUgOs@kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2022-12-17 07:37:15 -07:00
LANG_BINDINGS += $( obj-perf) python/perf$( PYTHON_EXTENSION_SUFFIX)
else
2024-02-21 06:42:01 -07:00
$( warning Missing python setuptools, the python binding won' t be built, please install python3-setuptools or equivalent)
perf python: Don't stop building if python setuptools isn't installed
The python3-setuptools package is needed to build the python binding, so
that one can use things like:
# ~acme/git/perf/tools/perf/python/twatch.py
cpu: 6, pid: 4573, tid: 2184618 { type: exit, pid: 4573, ppid: 4172, tid: 2184618, ptid: 4172, time: 12563190090107}
cpu: 24, pid: 4573, tid: 4573 { type: fork, pid: 4573, ppid: 4573, tid: 2190991, ptid: 4573, time: 12563415289331}
cpu: 29, pid: 4573, tid: 2190991 { type: comm, pid: 4573, tid: 2190991, comm: StreamT~ns #401 }
cpu: 29, pid: 4573, tid: 2190991 { type: comm, pid: 4573, tid: 2190991, comm: StreamT~ns #401 }
^CTraceback (most recent call last):
File "/var/home/acme/git/perf/tools/perf/python/twatch.py", line 61, in <module>
main()
File "/var/home/acme/git/perf/tools/perf/python/twatch.py", line 33, in main
evlist.poll(timeout = -1)
KeyboardInterrupt
#
That have 'import perf;'.
But distros don't always have that python3-setuptools (or equivalent)
installed, which was breaking the build. Just check if it is installed
and emit a warning that such binding isn't being built and continue the
build without it:
With it:
$ rpm -q python3-setuptools
python3-setuptools-59.6.0-3.fc36.noarch
$ rm -rf /tmp/build/perf; mkdir -p /tmp/build/perf
$ make O=/tmp/build/perf -C tools/perf install-bin
make: Entering directory '/var/home/acme/git/perf/tools/perf'
<SNIP>
... libpython: [ on ]
<SNIP>
GEN /tmp/build/perf/python/perf.cpython-310-x86_64-linux-gnu.so
<SNIP>
$ ls -la /tmp/build/perf/python/perf.cpython-310-x86_64-linux-gnu.so
-rwxr-xr-x. 1 acme acme 1609112 Dec 17 11:39 /tmp/build/perf/python/perf.cpython-310-x86_64-linux-gnu.so
$
Without it:
$ sudo rpm -e python3-setuptools
$ rm -rf /tmp/build/perf ; mkdir -p /tmp/build/perf
$ make O=/tmp/build/perf -C tools/perf install-bin
make: Entering directory '/var/home/acme/git/perf/tools/perf'
<SNIP>
... libpython: [ on ]
<SNIP>
$ ls -la /tmp/build/perf/python/perf.cpython-310-x86_64-linux-gnu.so
ls: cannot access '/tmp/build/perf/python/perf.cpython-310-x86_64-linux-gnu.so': No such file or directory
$
Reported-by: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: Ian Rogers <irogers@google.com>
Cc: Jiri Olsa <jolsa@kernel.org>
Cc: Namhyung Kim <namhyung@kernel.org>
Link: http://lore.kernel.org/lkml/Y53XHw3rlsaaUgOs@kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2022-12-17 07:37:15 -07:00
endif
2018-03-30 02:27:12 -07:00
CFLAGS += -DHAVE_LIBPYTHON_SUPPORT
perf tools: Add Python 3 support
Added Python 3 support while keeping Python 2.7 compatibility.
Committer notes:
This doesn't make it to auto detect python 3, one has to explicitely ask
it to build with python 3 devel files, here are the instructions
provided by Jaroslav:
---
$ cp -a tools/perf tools/python3-perf
$ make V=1 prefix=/usr -C tools/perf PYTHON=/usr/bin/python2 all
$ make V=1 prefix=/usr -C tools/python3-perf PYTHON=/usr/bin/python3 all
$ make V=1 prefix=/usr -C tools/python3-perf PYTHON=/usr/bin/python3 DESTDIR=%{buildroot} install-python_ext
$ make V=1 prefix=/usr -C tools/perf PYTHON=/usr/bin/python2 DESTDIR=%{buildroot} install-python_ext
---
We need to make this automatic, just like the existing tests for checking if
the python2 devel files are in place, allowing the build with python3 if
available, fallbacking to python2 and then just disabling it if none are
available.
So, using the PYTHON variable to build it using O= we get:
Before this patch:
$ rpm -q python3 python3-devel
python3-3.6.4-7.fc27.x86_64
python3-devel-3.6.4-7.fc27.x86_64
$ rm -rf /tmp/build/perf/ ; mkdir -p /tmp/build/perf ; make O=/tmp/build/perf PYTHON=/usr/bin/python3 -C tools/perf install-bin
make: Entering directory '/home/acme/git/linux/tools/perf'
<SNIP>
Makefile.config:670: Python 3 is not yet supported; please set
Makefile.config:671: PYTHON and/or PYTHON_CONFIG appropriately.
Makefile.config:672: If you also have Python 2 installed, then
Makefile.config:673: try something like:
Makefile.config:674:
Makefile.config:675: make PYTHON=python2
Makefile.config:676:
Makefile.config:677: Otherwise, disable Python support entirely:
Makefile.config:678:
Makefile.config:679: make NO_LIBPYTHON=1
Makefile.config:680:
Makefile.config:681: *** . Stop.
make[1]: *** [Makefile.perf:212: sub-make] Error 2
make: *** [Makefile:110: install-bin] Error 2
make: Leaving directory '/home/acme/git/linux/tools/perf'
$
After:
$ make O=/tmp/build/perf PYTHON=python3 -C tools/perf install-bin
$ ldd ~/bin/perf | grep python
libpython3.6m.so.1.0 => /lib64/libpython3.6m.so.1.0 (0x00007f58a31e8000)
$ rpm -qf /lib64/libpython3.6m.so.1.0
python3-libs-3.6.4-7.fc27.x86_64
$
Now verify that when using the binding the right ELF file is loaded,
using perf trace:
$ perf trace -e open* perf test python
0.051 ( 0.016 ms): perf/3927 openat(dfd: CWD, filename: /etc/ld.so.cache, flags: CLOEXEC ) = 3
<SNIP>
18: 'import perf' in python :
8.849 ( 0.013 ms): sh/3929 openat(dfd: CWD, filename: /etc/ld.so.cache, flags: CLOEXEC ) = 3
<SNIP>
25.572 ( 0.008 ms): python3/3931 openat(dfd: CWD, filename: /tmp/build/perf/python/perf.cpython-36m-x86_64-linux-gnu.so, flags: CLOEXEC) = 3
<SNIP>
Ok
<SNIP>
$
And using tools/perf/python/twatch.py, to show PERF_RECORD_ metaevents:
$ python3 tools/perf/python/twatch.py
cpu: 3, pid: 16060, tid: 16060 { type: fork, pid: 5207, ppid: 16060, tid: 5207, ptid: 16060, time: 10798513015459}
cpu: 3, pid: 16060, tid: 16060 { type: fork, pid: 5208, ppid: 16060, tid: 5208, ptid: 16060, time: 10798513562503}
cpu: 0, pid: 5208, tid: 5208 { type: comm, pid: 5208, tid: 5208, comm: grep }
cpu: 2, pid: 5207, tid: 5207 { type: comm, pid: 5207, tid: 5207, comm: ps }
cpu: 2, pid: 5207, tid: 5207 { type: exit, pid: 5207, ppid: 5207, tid: 5207, ptid: 5207, time: 10798551337484}
cpu: 3, pid: 5208, tid: 5208 { type: exit, pid: 5208, ppid: 5208, tid: 5208, ptid: 5208, time: 10798551292153}
cpu: 3, pid: 601, tid: 601 { type: fork, pid: 5209, ppid: 601, tid: 5209, ptid: 601, time: 10801779977324}
^CTraceback (most recent call last):
File "tools/perf/python/twatch.py", line 68, in <module>
main()
File "tools/perf/python/twatch.py", line 40, in main
evlist.poll(timeout = -1)
KeyboardInterrupt
$
# ps ax|grep twatch
5197 pts/8 S+ 0:00 python3 tools/perf/python/twatch.py
# ls -la /proc/5197/smaps
-r--r--r--. 1 acme acme 0 Feb 19 13:14 /proc/5197/smaps
# grep python /proc/5197/smaps
558111307000-558111309000 r-xp 00000000 fd:00 3151710 /usr/bin/python3.6
558111508000-558111509000 r--p 00001000 fd:00 3151710 /usr/bin/python3.6
558111509000-55811150a000 rw-p 00002000 fd:00 3151710 /usr/bin/python3.6
7ffad6fc1000-7ffad7008000 r-xp 00000000 00:2d 220196 /tmp/build/perf/python/perf.cpython-36m-x86_64-linux-gnu.so
7ffad7008000-7ffad7207000 ---p 00047000 00:2d 220196 /tmp/build/perf/python/perf.cpython-36m-x86_64-linux-gnu.so
7ffad7207000-7ffad7208000 r--p 00046000 00:2d 220196 /tmp/build/perf/python/perf.cpython-36m-x86_64-linux-gnu.so
7ffad7208000-7ffad7215000 rw-p 00047000 00:2d 220196 /tmp/build/perf/python/perf.cpython-36m-x86_64-linux-gnu.so
7ffadea77000-7ffaded3d000 r-xp 00000000 fd:00 3151795 /usr/lib64/libpython3.6m.so.1.0
7ffaded3d000-7ffadef3c000 ---p 002c6000 fd:00 3151795 /usr/lib64/libpython3.6m.so.1.0
7ffadef3c000-7ffadef42000 r--p 002c5000 fd:00 3151795 /usr/lib64/libpython3.6m.so.1.0
7ffadef42000-7ffadefa5000 rw-p 002cb000 fd:00 3151795 /usr/lib64/libpython3.6m.so.1.0
#
And with this patch, but building normally, without specifying the
PYTHON=python3 part, which will make it use python2 if its devel files are
available, like in this test:
$ make O=/tmp/build/perf -C tools/perf install-bin
$ ldd ~/bin/perf | grep python
libpython2.7.so.1.0 => /lib64/libpython2.7.so.1.0 (0x00007f6a44410000)
$ ldd /tmp/build/perf/python_ext_build/lib/perf.so | grep python
libpython2.7.so.1.0 => /lib64/libpython2.7.so.1.0 (0x00007fed28a2c000)
$
[acme@jouet perf]$ tools/perf/python/twatch.py
cpu: 0, pid: 2817, tid: 2817 { type: fork, pid: 2817, ppid: 2817, tid: 8910, ptid: 2817, time: 11126454335306}
cpu: 0, pid: 2817, tid: 2817 { type: comm, pid: 2817, tid: 8910, comm: worker }
$ ps ax | grep twatch.py
8909 pts/8 S+ 0:00 /usr/bin/python tools/perf/python/twatch.py
$ grep python /proc/8909/smaps
5579de658000-5579de659000 r-xp 00000000 fd:00 3156044 /usr/bin/python2.7
5579de858000-5579de859000 r--p 00000000 fd:00 3156044 /usr/bin/python2.7
5579de859000-5579de85a000 rw-p 00001000 fd:00 3156044 /usr/bin/python2.7
7f0de01f7000-7f0de023e000 r-xp 00000000 00:2d 230695 /tmp/build/perf/python/perf.so
7f0de023e000-7f0de043d000 ---p 00047000 00:2d 230695 /tmp/build/perf/python/perf.so
7f0de043d000-7f0de043e000 r--p 00046000 00:2d 230695 /tmp/build/perf/python/perf.so
7f0de043e000-7f0de044b000 rw-p 00047000 00:2d 230695 /tmp/build/perf/python/perf.so
7f0de6f0f000-7f0de6f13000 r-xp 00000000 fd:00 134975 /usr/lib64/python2.7/lib-dynload/_localemodule.so
7f0de6f13000-7f0de7113000 ---p 00004000 fd:00 134975 /usr/lib64/python2.7/lib-dynload/_localemodule.so
7f0de7113000-7f0de7114000 r--p 00004000 fd:00 134975 /usr/lib64/python2.7/lib-dynload/_localemodule.so
7f0de7114000-7f0de7115000 rw-p 00005000 fd:00 134975 /usr/lib64/python2.7/lib-dynload/_localemodule.so
7f0de7e73000-7f0de8052000 r-xp 00000000 fd:00 3173292 /usr/lib64/libpython2.7.so.1.0
7f0de8052000-7f0de8251000 ---p 001df000 fd:00 3173292 /usr/lib64/libpython2.7.so.1.0
7f0de8251000-7f0de8255000 r--p 001de000 fd:00 3173292 /usr/lib64/libpython2.7.so.1.0
7f0de8255000-7f0de8291000 rw-p 001e2000 fd:00 3173292 /usr/lib64/libpython2.7.so.1.0
$
Signed-off-by: Jaroslav Škarvada <jskarvad@redhat.com>
Tested-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: David Ahern <dsahern@gmail.com>
Cc: Jiri Olsa <jolsa@kernel.org>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Wang Nan <wangnan0@huawei.com>
LPU-Reference: 20180119205641.24242-1-jskarvad@redhat.com
Link: https://lkml.kernel.org/n/tip-8d7dt9kqp83vsz25hagug8fu@git.kernel.org
[ Removed explicit check for python version, allowing it to really build with python3 ]
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2018-01-19 13:56:41 -07:00
$( call detected,CONFIG_LIBPYTHON)
2024-06-25 14:41:16 -07:00
ifeq ( $( filter -fPIC,$( CFLAGS) ) ,)
# Building a shared library requires position independent code.
CFLAGS += -fPIC
CXXFLAGS += -fPIC
endif
2013-03-17 16:35:32 -07:00
endif
endif
endif
e n d i f
2013-03-17 16:38:16 -07:00
2022-06-29 11:25:04 -07:00
i f n e q ( $( NO_JEVENTS ) , 1 )
ifeq ( $( wildcard pmu-events/arch/$( SRCARCH) /mapfile.csv) ,)
NO_JEVENTS := 1
endif
e n d i f
i f n e q ( $( NO_JEVENTS ) , 1 )
NO_JEVENTS := 0
ifndef PYTHON
2023-03-10 23:57:46 -07:00
$( error ERROR: No python interpreter needed for jevents generation. Install python or build with NO_JEVENTS = 1.)
2022-06-29 11:25:04 -07:00
else
# jevents.py uses f-strings present in Python 3.6 released in Dec. 2016.
JEVENTS_PYTHON_GOOD := $( shell $( PYTHON) -c 'import sys;print("1" if(sys.version_info.major >= 3 and sys.version_info.minor >= 6) else "0")' 2> /dev/null)
ifneq ( $( JEVENTS_PYTHON_GOOD) , 1)
2023-03-10 23:57:46 -07:00
$( error ERROR: Python interpreter needed for jevents generation too old ( older than 3.6) . Install a newer python or build with NO_JEVENTS = 1.)
2022-06-29 11:25:04 -07:00
endif
endif
e n d i f
2014-04-23 07:53:25 -07:00
2023-03-10 23:57:47 -07:00
i f d e f B U I L D _ N O N D I S T R O
2021-09-10 15:57:56 -07:00
ifeq ( $( feature-libbfd) , 1)
EXTLIBS += -lbfd -lopcodes
2014-04-23 07:53:25 -07:00
else
2021-09-10 15:57:56 -07:00
# we are on a system that requires -liberty and (maybe) -lz
# to link against -lbfd; test each case individually here
# call all detections now so we get correct
# status in VF output
$( call feature_check,libbfd-liberty)
$( call feature_check,libbfd-liberty-z)
ifeq ( $( feature-libbfd-liberty) , 1)
EXTLIBS += -lbfd -lopcodes -liberty
2023-06-26 23:32:57 -07:00
FEATURE_CHECK_LDFLAGS-disassembler-four-args += -liberty -ldl
FEATURE_CHECK_LDFLAGS-disassembler-init-styled += -liberty -ldl
2021-09-10 15:57:56 -07:00
else
ifeq ( $( feature-libbfd-liberty-z) , 1)
EXTLIBS += -lbfd -lopcodes -liberty -lz
2023-06-26 23:32:57 -07:00
FEATURE_CHECK_LDFLAGS-disassembler-four-args += -liberty -lz -ldl
FEATURE_CHECK_LDFLAGS-disassembler-init-styled += -liberty -lz -ldl
2021-09-10 15:57:56 -07:00
endif
2014-04-23 07:53:25 -07:00
endif
2021-09-10 15:57:56 -07:00
$( call feature_check,disassembler-four-args)
tools perf: Fix compilation error with new binutils
binutils changed the signature of init_disassemble_info(), which now causes
compilation failures for tools/perf/util/annotate.c, e.g. on debian
unstable.
Relevant binutils commit:
https://sourceware.org/git/?p=binutils-gdb.git;a=commit;h=60a3da00bd5407f07
Wire up the feature test and switch to init_disassemble_info_compat(),
which were introduced in prior commits, fixing the compilation failure.
I verified that perf can still disassemble bpf programs by using bpftrace
under load, recording a perf trace, and then annotating the bpf "function"
with and without the changes. With old binutils there's no change in output
before/after this patch. When comparing the output from old binutils (2.35)
to new bintuils with the patch (upstream snapshot) there are a few output
differences, but they are unrelated to this patch. An example hunk is:
1.15 : 55:mov %rbp,%rdx
0.00 : 58:add $0xfffffffffffffff8,%rdx
0.00 : 5c:xor %ecx,%ecx
- 1.03 : 5e:callq 0xffffffffe12aca3c
+ 1.03 : 5e:call 0xffffffffe12aca3c
0.00 : 63:xor %eax,%eax
- 2.18 : 65:leaveq
- 2.82 : 66:retq
+ 2.18 : 65:leave
+ 2.82 : 66:ret
Signed-off-by: Andres Freund <andres@anarazel.de>
Acked-by: Quentin Monnet <quentin@isovalent.com>
Cc: Alexei Starovoitov <ast@kernel.org>
Cc: Ben Hutchings <benh@debian.org>
Cc: Jiri Olsa <jolsa@kernel.org>
Cc: Sedat Dilek <sedat.dilek@gmail.com>
Cc: bpf@vger.kernel.org
Link: http://lore.kernel.org/lkml/20220622181918.ykrs5rsnmx3og4sv@alap3.anarazel.de
Link: https://lore.kernel.org/r/20220801013834.156015-5-andres@anarazel.de
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2022-07-31 18:38:30 -07:00
$( call feature_check,disassembler-init-styled)
2014-04-23 07:53:25 -07:00
endif
2013-10-10 13:24:00 -07:00
2023-03-10 23:57:47 -07:00
CFLAGS += -DHAVE_LIBBFD_SUPPORT
2023-03-10 23:57:49 -07:00
CXXFLAGS += -DHAVE_LIBBFD_SUPPORT
2021-09-10 15:57:56 -07:00
ifeq ( $( feature-libbfd-buildid) , 1)
CFLAGS += -DHAVE_LIBBFD_BUILDID_SUPPORT
else
2024-02-21 06:42:01 -07:00
$( warning Old version of libbfd/binutils things like PE executable profiling will not be available)
2021-09-10 15:57:56 -07:00
endif
2020-09-03 09:44:39 -07:00
e n d i f
perf report: Support LLVM for addr2line()
In addition to the existing support for libbfd and calling out to
an external addr2line command, add support for using libllvm directly.
This is both faster than libbfd, and can be enabled in distro builds
(the LLVM license has an explicit provision for GPLv2 compatibility).
Thus, it is set as the primary choice if available.
As an example, running 'perf report' on a medium-size profile with
DWARF-based backtraces took 58 seconds with LLVM, 78 seconds with
libbfd, 153 seconds with external llvm-addr2line, and I got tired and
aborted the test after waiting for 55 minutes with external bfd
addr2line (which is the default for perf as compiled by distributions
today).
Evidently, for this case, the bfd addr2line process needs 18 seconds (on
a 5.2 GHz Zen 3) to load the .debug ELF in question, hits the 1-second
timeout and gets killed during initialization, getting restarted anew
every time. Having an in-process addr2line makes this much more robust.
As future extensions, libllvm can be used in many other places where
we currently use libbfd or other libraries:
- Symbol enumeration (in particular, for PE binaries).
- Demangling (including non-Itanium demangling, e.g. Microsoft
or Rust).
- Disassembling (perf annotate).
However, these are much less pressing; most people don't profile PE
binaries, and perf has non-bfd paths for ELF. The same with demangling;
the default _cxa_demangle path works fine for most users, and while bfd
objdump can be slow on large binaries, it is possible to use
--objdump=llvm-objdump to get the speed benefits. (It appears
LLVM-based demangling is very simple, should we want that.)
Tested with LLVM 14, 15, 16, 18 and 19. For some reason, LLVM 12 was not
correctly detected using feature_check, and thus was not tested.
Committer notes:
Added the name and a __maybe_unused to address:
1 13.50 almalinux:8 : FAIL gcc version 8.5.0 20210514 (Red Hat 8.5.0-22) (GCC)
util/srcline.c: In function 'dso__free_a2l':
util/srcline.c:184:20: error: parameter name omitted
void dso__free_a2l(struct dso *)
^~~~~~~~~~~~
make[3]: *** [/git/perf-6.11.0-rc3/tools/build/Makefile.build:158: util] Error 2
Signed-off-by: Steinar H. Gunderson <sesse@google.com>
Tested-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Cc: Ian Rogers <irogers@google.com>
Link: https://lore.kernel.org/r/20240803152008.2818485-1-sesse@google.com
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2024-08-03 08:20:06 -07:00
i f n d e f N O _ L I B L L V M
2024-09-10 07:04:00 -07:00
$( call feature_check,llvm-perf)
ifeq ( $( feature-llvm-perf) , 1)
perf report: Support LLVM for addr2line()
In addition to the existing support for libbfd and calling out to
an external addr2line command, add support for using libllvm directly.
This is both faster than libbfd, and can be enabled in distro builds
(the LLVM license has an explicit provision for GPLv2 compatibility).
Thus, it is set as the primary choice if available.
As an example, running 'perf report' on a medium-size profile with
DWARF-based backtraces took 58 seconds with LLVM, 78 seconds with
libbfd, 153 seconds with external llvm-addr2line, and I got tired and
aborted the test after waiting for 55 minutes with external bfd
addr2line (which is the default for perf as compiled by distributions
today).
Evidently, for this case, the bfd addr2line process needs 18 seconds (on
a 5.2 GHz Zen 3) to load the .debug ELF in question, hits the 1-second
timeout and gets killed during initialization, getting restarted anew
every time. Having an in-process addr2line makes this much more robust.
As future extensions, libllvm can be used in many other places where
we currently use libbfd or other libraries:
- Symbol enumeration (in particular, for PE binaries).
- Demangling (including non-Itanium demangling, e.g. Microsoft
or Rust).
- Disassembling (perf annotate).
However, these are much less pressing; most people don't profile PE
binaries, and perf has non-bfd paths for ELF. The same with demangling;
the default _cxa_demangle path works fine for most users, and while bfd
objdump can be slow on large binaries, it is possible to use
--objdump=llvm-objdump to get the speed benefits. (It appears
LLVM-based demangling is very simple, should we want that.)
Tested with LLVM 14, 15, 16, 18 and 19. For some reason, LLVM 12 was not
correctly detected using feature_check, and thus was not tested.
Committer notes:
Added the name and a __maybe_unused to address:
1 13.50 almalinux:8 : FAIL gcc version 8.5.0 20210514 (Red Hat 8.5.0-22) (GCC)
util/srcline.c: In function 'dso__free_a2l':
util/srcline.c:184:20: error: parameter name omitted
void dso__free_a2l(struct dso *)
^~~~~~~~~~~~
make[3]: *** [/git/perf-6.11.0-rc3/tools/build/Makefile.build:158: util] Error 2
Signed-off-by: Steinar H. Gunderson <sesse@google.com>
Tested-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Cc: Ian Rogers <irogers@google.com>
Link: https://lore.kernel.org/r/20240803152008.2818485-1-sesse@google.com
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2024-08-03 08:20:06 -07:00
CFLAGS += -DHAVE_LIBLLVM_SUPPORT
CFLAGS += $( shell $( LLVM_CONFIG) --cflags)
CXXFLAGS += -DHAVE_LIBLLVM_SUPPORT
CXXFLAGS += $( shell $( LLVM_CONFIG) --cxxflags)
LIBLLVM = $( shell $( LLVM_CONFIG) --libs all) $( shell $( LLVM_CONFIG) --system-libs)
EXTLIBS += -L$( shell $( LLVM_CONFIG) --libdir) $( LIBLLVM)
EXTLIBS += -lstdc++
$( call detected,CONFIG_LIBLLVM)
else
2024-09-10 07:04:00 -07:00
$( warning No libllvm 13+ found, slower source file resolution, please install llvm-devel/llvm-dev)
perf report: Support LLVM for addr2line()
In addition to the existing support for libbfd and calling out to
an external addr2line command, add support for using libllvm directly.
This is both faster than libbfd, and can be enabled in distro builds
(the LLVM license has an explicit provision for GPLv2 compatibility).
Thus, it is set as the primary choice if available.
As an example, running 'perf report' on a medium-size profile with
DWARF-based backtraces took 58 seconds with LLVM, 78 seconds with
libbfd, 153 seconds with external llvm-addr2line, and I got tired and
aborted the test after waiting for 55 minutes with external bfd
addr2line (which is the default for perf as compiled by distributions
today).
Evidently, for this case, the bfd addr2line process needs 18 seconds (on
a 5.2 GHz Zen 3) to load the .debug ELF in question, hits the 1-second
timeout and gets killed during initialization, getting restarted anew
every time. Having an in-process addr2line makes this much more robust.
As future extensions, libllvm can be used in many other places where
we currently use libbfd or other libraries:
- Symbol enumeration (in particular, for PE binaries).
- Demangling (including non-Itanium demangling, e.g. Microsoft
or Rust).
- Disassembling (perf annotate).
However, these are much less pressing; most people don't profile PE
binaries, and perf has non-bfd paths for ELF. The same with demangling;
the default _cxa_demangle path works fine for most users, and while bfd
objdump can be slow on large binaries, it is possible to use
--objdump=llvm-objdump to get the speed benefits. (It appears
LLVM-based demangling is very simple, should we want that.)
Tested with LLVM 14, 15, 16, 18 and 19. For some reason, LLVM 12 was not
correctly detected using feature_check, and thus was not tested.
Committer notes:
Added the name and a __maybe_unused to address:
1 13.50 almalinux:8 : FAIL gcc version 8.5.0 20210514 (Red Hat 8.5.0-22) (GCC)
util/srcline.c: In function 'dso__free_a2l':
util/srcline.c:184:20: error: parameter name omitted
void dso__free_a2l(struct dso *)
^~~~~~~~~~~~
make[3]: *** [/git/perf-6.11.0-rc3/tools/build/Makefile.build:158: util] Error 2
Signed-off-by: Steinar H. Gunderson <sesse@google.com>
Tested-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Cc: Ian Rogers <irogers@google.com>
Link: https://lore.kernel.org/r/20240803152008.2818485-1-sesse@google.com
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2024-08-03 08:20:06 -07:00
NO_LIBLLVM := 1
endif
e n d i f
2023-03-10 23:57:49 -07:00
i f n d e f N O _ D E M A N G L E
$( call feature_check,cxa-demangle)
ifeq ( $( feature-cxa-demangle) , 1)
EXTLIBS += -lstdc++
CFLAGS += -DHAVE_CXA_DEMANGLE_SUPPORT
CXXFLAGS += -DHAVE_CXA_DEMANGLE_SUPPORT
2023-04-17 12:25:46 -07:00
$( call detected,CONFIG_CXX_DEMANGLE)
2023-03-10 23:57:49 -07:00
endif
2023-03-10 23:57:47 -07:00
ifdef BUILD_NONDISTRO
2018-11-15 17:32:01 -07:00
ifeq ( $( filter -liberty,$( EXTLIBS) ) ,)
$( call feature_check,cplus-demangle)
ifeq ( $( feature-cplus-demangle) , 1)
EXTLIBS += -liberty
2013-04-14 19:06:58 -07:00
endif
endif
2023-03-10 23:57:49 -07:00
ifneq ( $( filter -liberty,$( EXTLIBS) ) ,)
CFLAGS += -DHAVE_CPLUS_DEMANGLE_SUPPORT
CXXFLAGS += -DHAVE_CPLUS_DEMANGLE_SUPPORT
endif
2013-04-14 19:06:58 -07:00
endif
2013-10-10 13:24:00 -07:00
e n d i f
2015-01-29 05:29:39 -07:00
i f n d e f N O _ L Z M A
ifeq ( $( feature-lzma) , 1)
CFLAGS += -DHAVE_LZMA_SUPPORT
EXTLIBS += -llzma
$( call detected,CONFIG_LZMA)
else
2024-02-21 06:42:01 -07:00
$( warning No liblzma found, disables xz kernel module decompression, please install xz-devel/liblzma-dev)
2015-01-29 05:29:39 -07:00
NO_LZMA := 1
endif
e n d i f
2019-03-18 10:39:49 -07:00
i f n d e f N O _ L I B Z S T D
ifeq ( $( feature-libzstd) , 1)
CFLAGS += -DHAVE_ZSTD_SUPPORT
CFLAGS += $( LIBZSTD_CFLAGS)
LDFLAGS += $( LIBZSTD_LDFLAGS)
EXTLIBS += -lzstd
$( call detected,CONFIG_ZSTD)
else
2024-02-21 06:42:01 -07:00
$( warning No libzstd found, disables trace compression, please install libzstd-dev[ el] and/or set LIBZSTD_DIR)
2019-03-18 10:39:49 -07:00
NO_LIBZSTD := 1
endif
e n d i f
2013-03-17 16:41:04 -07:00
i f n d e f N O _ B A C K T R A C E
2013-09-30 07:49:38 -07:00
ifeq ( $( feature-backtrace) , 1)
2013-09-30 03:07:11 -07:00
CFLAGS += -DHAVE_BACKTRACE_SUPPORT
2013-04-14 19:06:58 -07:00
endif
2013-03-17 16:41:04 -07:00
e n d i f
2013-03-17 16:45:27 -07:00
i f n d e f N O _ L I B N U M A
2013-09-30 04:37:10 -07:00
ifeq ( $( feature-libnuma) , 0)
2024-02-21 06:42:01 -07:00
$( warning No numa.h found, disables 'perf bench numa mem' benchmark, please install numactl-devel/libnuma-devel/libnuma-dev)
2013-04-14 19:06:58 -07:00
NO_LIBNUMA := 1
else
2015-09-17 08:20:28 -07:00
ifeq ( $( feature-numa_num_possible_cpus) , 0)
2024-02-21 06:42:01 -07:00
$( warning Old numa library found, disables 'perf bench numa mem' benchmark, please install numactl-devel/libnuma-devel/libnuma-dev >= 2.0.8)
2015-09-17 08:20:28 -07:00
NO_LIBNUMA := 1
else
CFLAGS += -DHAVE_LIBNUMA_SUPPORT
EXTLIBS += -lnuma
$( call detected,CONFIG_NUMA)
endif
2013-04-14 19:06:58 -07:00
endif
2013-03-17 16:45:27 -07:00
e n d i f
2013-03-17 16:56:01 -07:00
2014-07-03 06:59:49 -07:00
i f d e f H A V E _ K V M _ S T A T _ S U P P O R T
CFLAGS += -DHAVE_KVM_STAT_SUPPORT
e n d i f
2019-03-11 22:30:48 -07:00
i f e q ( $( feature -disassembler -four -args ) , 1 )
CFLAGS += -DDISASM_FOUR_ARGS_SIGNATURE
e n d i f
tools perf: Fix compilation error with new binutils
binutils changed the signature of init_disassemble_info(), which now causes
compilation failures for tools/perf/util/annotate.c, e.g. on debian
unstable.
Relevant binutils commit:
https://sourceware.org/git/?p=binutils-gdb.git;a=commit;h=60a3da00bd5407f07
Wire up the feature test and switch to init_disassemble_info_compat(),
which were introduced in prior commits, fixing the compilation failure.
I verified that perf can still disassemble bpf programs by using bpftrace
under load, recording a perf trace, and then annotating the bpf "function"
with and without the changes. With old binutils there's no change in output
before/after this patch. When comparing the output from old binutils (2.35)
to new bintuils with the patch (upstream snapshot) there are a few output
differences, but they are unrelated to this patch. An example hunk is:
1.15 : 55:mov %rbp,%rdx
0.00 : 58:add $0xfffffffffffffff8,%rdx
0.00 : 5c:xor %ecx,%ecx
- 1.03 : 5e:callq 0xffffffffe12aca3c
+ 1.03 : 5e:call 0xffffffffe12aca3c
0.00 : 63:xor %eax,%eax
- 2.18 : 65:leaveq
- 2.82 : 66:retq
+ 2.18 : 65:leave
+ 2.82 : 66:ret
Signed-off-by: Andres Freund <andres@anarazel.de>
Acked-by: Quentin Monnet <quentin@isovalent.com>
Cc: Alexei Starovoitov <ast@kernel.org>
Cc: Ben Hutchings <benh@debian.org>
Cc: Jiri Olsa <jolsa@kernel.org>
Cc: Sedat Dilek <sedat.dilek@gmail.com>
Cc: bpf@vger.kernel.org
Link: http://lore.kernel.org/lkml/20220622181918.ykrs5rsnmx3og4sv@alap3.anarazel.de
Link: https://lore.kernel.org/r/20220801013834.156015-5-andres@anarazel.de
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2022-07-31 18:38:30 -07:00
i f e q ( $( feature -disassembler -init -styled ) , 1 )
CFLAGS += -DDISASM_INIT_STYLED
e n d i f
2014-10-23 14:16:03 -07:00
i f e q ( $ { I S _ 6 4 _ B I T } , 1 )
ifndef NO_PERF_READ_VDSO32
$( call feature_check,compile-32)
2014-10-23 03:45:24 -07:00
ifeq ( $( feature-compile-32) , 1)
CFLAGS += -DHAVE_PERF_READ_VDSO32
else
2014-10-23 14:16:03 -07:00
NO_PERF_READ_VDSO32 := 1
endif
endif
2017-04-09 20:02:37 -07:00
ifneq ( $( SRCARCH) , x86)
2014-10-23 14:16:03 -07:00
NO_PERF_READ_VDSOX32 := 1
endif
ifndef NO_PERF_READ_VDSOX32
$( call feature_check,compile-x32)
2014-10-23 03:45:24 -07:00
ifeq ( $( feature-compile-x32) , 1)
CFLAGS += -DHAVE_PERF_READ_VDSOX32
else
2014-10-23 14:16:03 -07:00
NO_PERF_READ_VDSOX32 := 1
endif
endif
e l s e
NO_PERF_READ_VDSO32 := 1
NO_PERF_READ_VDSOX32 := 1
e n d i f
2018-01-07 09:03:45 -07:00
i f n d e f N O _ L I B B A B E L T R A C E
2015-03-11 01:00:41 -07:00
$( call feature_check,libbabeltrace)
ifeq ( $( feature-libbabeltrace) , 1)
2015-02-20 15:16:58 -07:00
CFLAGS += -DHAVE_LIBBABELTRACE_SUPPORT $( LIBBABELTRACE_CFLAGS)
LDFLAGS += $( LIBBABELTRACE_LDFLAGS)
EXTLIBS += -lbabeltrace-ctf
perf data: Add perf data to CTF conversion support
Adding 'perf data convert' to convert perf data file into different
format. This patch adds support for CTF format conversion.
To convert perf.data into CTF run:
$ perf data convert --to-ctf=./ctf-data/
[ perf data convert: Converted 'perf.data' into CTF data './ctf-data/' ]
[ perf data convert: Converted and wrote 11.268 MB (100230 samples) ]
The command will create CTF metadata out of perf.data file (or one
specified via -i option) and then convert all sample events into single
CTF stream.
Each sample_type bit is translated into separated CTF event field apart
from following exceptions:
PERF_SAMPLE_RAW - added in next patch
PERF_SAMPLE_READ - TODO
PERF_SAMPLE_CALLCHAIN - TODO
PERF_SAMPLE_BRANCH_STACK - TODO
PERF_SAMPLE_REGS_USER - TODO
PERF_SAMPLE_STACK_USER - TODO
$ perf --debug=data-convert=2 data convert ...
The converted CTF data could be analyzed by CTF tools, like babletrace
or tracecompass [1].
$ babeltrace ./ctf-data/
[03:19:13.962125533] (+?.?????????) cycles: { }, { ip = 0xFFFFFFFF8105443A, tid = 20714, pid = 20714, period = 1 }
[03:19:13.962130001] (+0.000004468) cycles: { }, { ip = 0xFFFFFFFF8105443A, tid = 20714, pid = 20714, period = 1 }
[03:19:13.962131936] (+0.000001935) cycles: { }, { ip = 0xFFFFFFFF8105443A, tid = 20714, pid = 20714, period = 8 }
[03:19:13.962133732] (+0.000001796) cycles: { }, { ip = 0xFFFFFFFF8105443A, tid = 20714, pid = 20714, period = 114 }
[03:19:13.962135557] (+0.000001825) cycles: { }, { ip = 0xFFFFFFFF8105443A, tid = 20714, pid = 20714, period = 2087 }
[03:19:13.962137627] (+0.000002070) cycles: { }, { ip = 0xFFFFFFFF81361938, tid = 20714, pid = 20714, period = 37582 }
[03:19:13.962161091] (+0.000023464) cycles: { }, { ip = 0xFFFFFFFF8124218F, tid = 20714, pid = 20714, period = 600246 }
[03:19:13.962517569] (+0.000356478) cycles: { }, { ip = 0xFFFFFFFF811A75DB, tid = 20714, pid = 20714, period = 1325731 }
[03:19:13.969518008] (+0.007000439) cycles: { }, { ip = 0x34080917B2, tid = 20714, pid = 20714, period = 1144298 }
The following members to the ctf-environment were decided to be added to
distinguish and specify perf CTF data:
- domain
It says "kernel" because it contains a kernel trace (not to be
confused with a user space like lttng-ust does)
- tracer_name
It says perf. This can be used to distinguish between lttng and perf
CTF based trace.
- version
The kernel version from stream. In addition to release, this is what
it looks like on a Debian kernel:
release = "3.14-1-amd64";
version = "3.14.0";
[1] http://projects.eclipse.org/projects/tools.tracecompass
Signed-off-by: Jiri Olsa <jolsa@kernel.org>
Acked-by: Namhyung Kim <namhyung@kernel.org>
Reviewed-by: David Ahern <dsahern@gmail.com>
Tested-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Jeremie Galarneau <jgalar@efficios.com>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
Cc: Tom Zanussi <tzanussi@gmail.com>
Cc: Wang Nan <wangnan0@huawei.com>
Link: http://lkml.kernel.org/r/1424470628-5969-4-git-send-email-jolsa@kernel.org
Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2015-02-20 15:17:00 -07:00
$( call detected,CONFIG_LIBBABELTRACE)
2015-03-11 01:00:41 -07:00
else
2024-02-21 06:42:01 -07:00
$( warning No libbabeltrace found, disables 'perf data' CTF format support, please install libbabeltrace-dev[ el] /libbabeltrace-ctf-dev)
2015-02-20 15:16:58 -07:00
endif
e n d i f
2024-02-17 00:40:42 -07:00
i f n d e f N O _ C A P S T O N E
$( call feature_check,libcapstone)
ifeq ( $( feature-libcapstone) , 1)
CFLAGS += -DHAVE_LIBCAPSTONE_SUPPORT $( LIBCAPSTONE_CFLAGS)
LDFLAGS += $( LICAPSTONE_LDFLAGS)
EXTLIBS += -lcapstone
$( call detected,CONFIG_LIBCAPSTONE)
else
msg := $( warning No libcapstone found, disables disasm engine support for 'perf script' , please install libcapstone-dev/capstone-devel) ;
endif
e n d i f
2015-04-30 07:37:27 -07:00
i f n d e f N O _ A U X T R A C E
2017-04-09 20:02:37 -07:00
ifeq ( $( SRCARCH) ,x86)
2016-09-16 08:49:58 -07:00
ifeq ( $( feature-get_cpuid) , 0)
2024-02-21 06:42:01 -07:00
$( warning Your gcc lacks the __get_cpuid( ) builtin, disables support for auxtrace/Intel PT, please install a newer gcc)
2016-09-16 08:49:58 -07:00
NO_AUXTRACE := 1
endif
endif
ifndef NO_AUXTRACE
2015-09-17 08:54:30 -07:00
$( call detected,CONFIG_AUXTRACE)
CFLAGS += -DHAVE_AUXTRACE_SUPPORT
2021-11-16 10:44:17 -07:00
ifeq ( $( feature-reallocarray) , 0)
CFLAGS += -DCOMPAT_NEED_REALLOCARRAY
endif
2015-09-17 08:54:30 -07:00
endif
2015-04-30 07:37:27 -07:00
e n d i f
2023-06-13 06:22:26 -07:00
i f d e f E X T R A _ T E S T S
$( call detected,CONFIG_EXTRA_TESTS)
CFLAGS += -DHAVE_EXTRA_TESTS
e n d i f
2016-11-02 06:35:49 -07:00
i f n d e f N O _ J V M T I
ifneq ( ,$( wildcard /usr/sbin/update-java-alternatives) )
JDIR = $( shell /usr/sbin/update-java-alternatives -l | head -1 | awk '{print $$3}' )
else
ifneq ( ,$( wildcard /usr/sbin/alternatives) )
2019-09-09 04:41:16 -07:00
JDIR = $( shell /usr/sbin/alternatives --display java | tail -1 | cut -d' ' -f 5 | sed -e 's%/jre/bin/java.%%g' -e 's%/bin/java.%%g' )
2016-11-02 06:35:49 -07:00
endif
endif
ifndef JDIR
$( warning No alternatives command found, you need to set JDIR = to point to the root of your Java directory)
NO_JVMTI := 1
endif
e n d i f
i f n d e f N O _ J V M T I
FEATURE_CHECK_CFLAGS-jvmti := -I$( JDIR) /include -I$( JDIR) /include/linux
$( call feature_check,jvmti)
ifeq ( $( feature-jvmti) , 1)
$( call detected_var,JDIR)
2018-11-21 08:43:41 -07:00
ifndef NO_JVMTI_CMLR
FEATURE_CHECK_CFLAGS-jvmti-cmlr := $( FEATURE_CHECK_CFLAGS-jvmti)
$( call feature_check,jvmti-cmlr)
ifeq ( $( feature-jvmti-cmlr) , 1)
CFLAGS += -DHAVE_JVMTI_CMLR
endif
endif # NO_JVMTI_CMLR
2016-11-02 06:35:49 -07:00
else
2018-04-11 08:08:53 -07:00
$( warning No openjdk development package found, please install JDK package, e.g. openjdk-8-jdk, java-1.8.0-openjdk-devel)
2016-11-02 06:35:49 -07:00
NO_JVMTI := 1
endif
e n d i f
2023-03-10 23:57:50 -07:00
i f n d e f N O _ L I B P F M 4
2020-05-05 11:29:43 -07:00
$( call feature_check,libpfm4)
ifeq ( $( feature-libpfm4) , 1)
CFLAGS += -DHAVE_LIBPFM
EXTLIBS += -lpfm
ASCIIDOC_EXTRA = -aHAVE_LIBPFM= 1
$( call detected,CONFIG_LIBPFM4)
else
2024-02-21 06:42:01 -07:00
$( warning libpfm4 not found, disables libpfm4 support. Please install libpfm4-dev)
2020-05-05 11:29:43 -07:00
endif
e n d i f
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>
2022-12-05 15:59:39 -07:00
# libtraceevent is a recommended dependency picked up from the system.
i f n e q ( $( NO_LIBTRACEEVENT ) , 1 )
2021-04-28 02:20:23 -07:00
$( call feature_check,libtraceevent)
ifeq ( $( feature-libtraceevent) , 1)
2024-06-06 08:33:01 -07:00
CFLAGS += -DHAVE_LIBTRACEEVENT
LDFLAGS += $( shell $( PKG_CONFIG) --libs-only-L libtraceevent)
EXTLIBS += $( shell $( PKG_CONFIG) --libs-only-l libtraceevent)
2024-06-06 08:33:02 -07:00
LIBTRACEEVENT_VERSION := $( shell $( PKG_CONFIG) --modversion libtraceevent) .0.0
2021-09-22 17:10:22 -07:00
LIBTRACEEVENT_VERSION_1 := $( word 1, $( subst ., ,$( LIBTRACEEVENT_VERSION) ) )
LIBTRACEEVENT_VERSION_2 := $( word 2, $( subst ., ,$( LIBTRACEEVENT_VERSION) ) )
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)
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>
2022-12-05 15:59:39 -07:00
$( call detected,CONFIG_LIBTRACEEVENT)
2021-04-28 02:20:23 -07:00
else
2024-03-13 23:30:00 -07:00
$( error ERROR: libtraceevent is missing. Please install libtraceevent-dev/libtraceevent-devel and/or set LIBTRACEEVENT_DIR or build with NO_LIBTRACEEVENT = 1)
2021-04-28 02:20:23 -07:00
endif
2021-09-22 17:10:21 -07:00
$( call feature_check,libtracefs)
ifeq ( $( feature-libtracefs) , 1)
2024-06-06 08:33:01 -07:00
CFLAGS += $( shell $( PKG_CONFIG) --cflags libtracefs)
LDFLAGS += $( shell $( PKG_CONFIG) --libs-only-L libtracefs)
EXTLIBS += $( shell $( PKG_CONFIG) --libs-only-l libtracefs)
2024-06-06 08:33:02 -07:00
LIBTRACEFS_VERSION := $( shell $( PKG_CONFIG) --modversion libtracefs) .0.0
2021-09-22 17:10:23 -07:00
LIBTRACEFS_VERSION_1 := $( word 1, $( subst ., ,$( LIBTRACEFS_VERSION) ) )
LIBTRACEFS_VERSION_2 := $( word 2, $( subst ., ,$( LIBTRACEFS_VERSION) ) )
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)
2024-07-17 10:47:35 -07:00
else
$( warning libtracefs is missing. Please install libtracefs-dev/libtracefs-devel)
2021-09-22 17:10:21 -07:00
endif
e n d i f
2013-03-17 16:56:01 -07:00
# Among the variables below, these:
# perfexecdir
2022-11-04 07:45:36 -07:00
# libbpf_include_dir
perf bpf: Add 'examples' directories
The first one is the bare minimum that bpf infrastructure accepts before
it expects actual events to be set up:
$ cat tools/perf/examples/bpf/empty.c
char _license[] __attribute__((section("license"), used)) = "GPL";
int _version __attribute__((section("version"), used)) = LINUX_VERSION_CODE;
$
If you remove that "version" line, then it will be refused with:
# perf trace -e tools/perf/examples/bpf/empty.c
event syntax error: 'tools/perf/examples/bpf/empty.c'
\___ Failed to load tools/perf/examples/bpf/empty.c from source: 'version' section incorrect or lost
(add -v to see detail)
Run 'perf list' for a list of valid events
Usage: perf trace [<options>] [<command>]
or: perf trace [<options>] -- <command> [<options>]
or: perf trace record [<options>] [<command>]
or: perf trace record [<options>] -- <command> [<options>]
-e, --event <event> event/syscall selector. use 'perf list' to list available events
#
The next ones will, step by step, show simple filters, then the needs
for headers will be made clear, it will be put in place and tested with
new examples, rinse, repeat.
Back to using this first one to test the perf+bpf infrastructure:
If we run it will fail, as no functions are present connecting with,
say, a tracepoint or a function using the kprobes or uprobes
infrastructure:
# perf trace -e tools/perf/examples/bpf/empty.c
WARNING: event parser found nothing
invalid or unsupported event: 'tools/perf/examples/bpf/empty.c'
Run 'perf list' for a list of valid events
Usage: perf trace [<options>] [<command>]
or: perf trace [<options>] -- <command> [<options>]
or: perf trace record [<options>] [<command>]
or: perf trace record [<options>] -- <command> [<options>]
-e, --event <event> event/syscall selector. use 'perf list' to list available events
#
But, if we set things up to dump the generated object file to a file,
and do this after having run 'make install', still on the developer's
$HOME directory:
# cat ~/.perfconfig
[llvm]
dump-obj = true
#
# perf trace -e ~acme/lib/examples/perf/bpf/empty.c
LLVM: dumping /home/acme/lib/examples/perf/bpf/empty.o
WARNING: event parser found nothing
invalid or unsupported event: '/home/acme/lib/examples/perf/bpf/empty.c'
<SNIP>
#
We can look at the dumped object file:
# ls -la ~acme/lib/examples/perf/bpf/empty.o
-rw-r--r--. 1 root root 576 May 4 12:10 /home/acme/lib/examples/perf/bpf/empty.o
# file ~acme/lib/examples/perf/bpf/empty.o
/home/acme/lib/examples/perf/bpf/empty.o: ELF 64-bit LSB relocatable, *unknown arch 0xf7* version 1 (SYSV), not stripped
# readelf -sw ~acme/lib/examples/perf/bpf/empty.o
Symbol table '.symtab' contains 3 entries:
Num: Value Size Type Bind Vis Ndx Name
0: 0000000000000000 0 NOTYPE LOCAL DEFAULT UND
1: 0000000000000000 0 NOTYPE GLOBAL DEFAULT 3 _license
2: 0000000000000000 0 NOTYPE GLOBAL DEFAULT 4 _version
#
# tools/bpf/bpftool/bpftool --pretty ~acme/lib/examples/perf/bpf/empty.o
null
#
Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: David Ahern <dsahern@gmail.com>
Cc: Jiri Olsa <jolsa@kernel.org>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Wang Nan <wangnan0@huawei.com>
Link: https://lkml.kernel.org/n/tip-y7dkhakejz3013o0w21n98xd@git.kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2018-05-04 07:56:15 -07:00
# perf_examples_dir
2013-03-17 16:56:01 -07:00
# template_dir
# mandir
# infodir
# htmldir
# ETC_PERFCONFIG (but not sysconfdir)
# can be specified as a relative path some/where/else;
# this is interpreted as relative to $(prefix) and "perf" at
# runtime figures out where they are based on the path to the executable.
# This can help installing the suite in a relocatable way.
# Make the path relative to DESTDIR, not to prefix
i f n d e f D E S T D I R
2014-06-02 09:44:34 -07:00
prefix ?= $( HOME)
2013-03-17 16:56:01 -07:00
e n d i f
bindir_relative = bin
2015-07-28 07:10:13 -07:00
bindir = $( abspath $( prefix) /$( bindir_relative) )
2021-06-27 06:18:13 -07:00
includedir_relative = include
includedir = $( abspath $( prefix) /$( includedir_relative) )
2013-03-17 16:56:01 -07:00
mandir = share/man
infodir = share/info
perfexecdir = libexec/perf-core
perf trace: Raw augmented syscalls fix libbpf 1.0+ compatibility
Don't use deprecated and now broken map style. Avoid use of
tools/perf/include/bpf/bpf.h and use the more regular BPF headers.
Committer notes:
Add /usr/include to the include path so that bpf/bpf_helpers.h can be
found, remove sys/socket.h, adding the sockaddr_storage definition, also
remove stdbool.h, both were preventing building the
augmented_raw_syscalls.c file with clang, revisit later.
Testing it:
Asking for syscalls that have string arguments:
# perf trace -e ~acme/git/perf/tools/perf/examples/bpf/augmented_raw_syscalls.c,string --max-events 10
0.000 thermald/1144 openat(dfd: CWD, filename: "/sys/class/powercap/intel-rapl/intel-rapl:0/intel-rapl:0:2/energy_uj", flags: RDONLY) = 13
0.158 thermald/1144 openat(dfd: CWD, filename: "/sys/class/powercap/intel-rapl/intel-rapl:0/energy_uj", flags: RDONLY) = 13
0.215 thermald/1144 openat(dfd: CWD, filename: "/sys/class/thermal/thermal_zone3/temp", flags: RDONLY) = 13
16.448 cgroupify/36478 openat(dfd: 4, filename: ".", flags: RDONLY|CLOEXEC|DIRECTORY|NONBLOCK) = 5
16.468 cgroupify/36478 newfstatat(dfd: 5, filename: "", statbuf: 0x7fffca5b4130, flag: 4096) = 0
16.473 systemd-oomd/972 openat(dfd: CWD, filename: "/proc/meminfo", flags: RDONLY|CLOEXEC) = 12
16.499 systemd-oomd/972 newfstatat(dfd: 12, filename: "", statbuf: 0x7ffd2bc73cc0, flag: 4096) = 0
16.516 abrt-dump-jour/1370 openat(dfd: CWD, filename: "/var/log/journal/d6a97235307247e09f13f326fb607e3c/system.journal", flags: RDONLY|CLOEXEC|NONBLOCK) = 21
16.538 abrt-dump-jour/1370 newfstatat(dfd: 21, filename: "", statbuf: 0x7ffc651b8980, flag: 4096) = 0
16.540 abrt-dump-jour/1371 openat(dfd: CWD, filename: "/var/log/journal/d6a97235307247e09f13f326fb607e3c/system.journal", flags: RDONLY|CLOEXEC|NONBLOCK) = 21
#
Networking syscalls:
# perf trace -e ~acme/git/perf/tools/perf/examples/bpf/augmented_raw_syscalls.c,sendto*,connect* --max-events 10
0.000 isc-net-0005/1206 connect(fd: 512, uservaddr: { .family: INET, port: 53, addr: 23.211.132.65 }, addrlen: 16) = 0
0.070 isc-net-0002/1203 connect(fd: 515, uservaddr: { .family: INET6, port: 53, addr: 2600:1401:2::43 }, addrlen: 28) = -1 ENETUNREACH (Network is unreachable)
0.031 isc-net-0006/1207 connect(fd: 513, uservaddr: { .family: INET6, port: 53, addr: 2600:1401:2::43 }, addrlen: 28) = -1 ENETUNREACH (Network is unreachable)
0.079 isc-net-0006/1207 sendto(fd: 3, buff: 0x7f73a40611b0, len: 106, flags: NOSIGNAL, addr: { .family: UNSPEC }, addr_len: NULL) = 106
0.180 isc-net-0006/1207 connect(fd: 519, uservaddr: { .family: INET6, port: 53, addr: 2600:1401:1::43 }, addrlen: 28) = -1 ENETUNREACH (Network is unreachable)
0.211 isc-net-0006/1207 sendto(fd: 3, buff: 0x7f73a4061230, len: 106, flags: NOSIGNAL, addr: { .family: UNSPEC }, addr_len: NULL) = 106
0.298 isc-net-0006/1207 connect(fd: 515, uservaddr: { .family: INET, port: 53, addr: 96.7.49.67 }, addrlen: 16) = 0
0.109 isc-net-0004/1205 connect(fd: 518, uservaddr: { .family: INET6, port: 53, addr: 2600:1401:2::43 }, addrlen: 28) = -1 ENETUNREACH (Network is unreachable)
0.164 isc-net-0002/1203 sendto(fd: 3, buff: 0x7f73ac064300, len: 107, flags: NOSIGNAL, addr: { .family: UNSPEC }, addr_len: NULL) = 107
0.247 isc-net-0002/1203 connect(fd: 522, uservaddr: { .family: INET6, port: 53, addr: 2600:1401:1::43 }, addrlen: 28) = -1 ENETUNREACH (Network is unreachable)
#
Signed-off-by: Ian Rogers <irogers@google.com>
Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
Cc: Ingo Molnar <mingo@redhat.com>
Cc: Jiri Olsa <jolsa@kernel.org>
Cc: Leo Yan <leo.yan@linaro.org>
Cc: Mark Rutland <mark.rutland@arm.com>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Stephane Eranian <eranian@google.com>
Link: https://lore.kernel.org/r/20221103045437.163510-2-irogers@google.com
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2022-11-02 21:54:31 -07:00
# FIXME: system's libbpf header directory, where we expect to find bpf/bpf_helpers.h, for instance
2022-11-04 07:45:36 -07:00
libbpf_include_dir = /usr/include
2018-07-31 00:32:54 -07:00
perf_examples_dir = lib/perf/examples
2013-03-17 16:56:01 -07:00
sharedir = $( prefix) /share
template_dir = share/perf-core/templates
perf trace: Support 'strace' syscall event groups
I.e.:
$ cat ~/share/perf-core/strace/groups/file
access
chmod
creat
execve
faccessat
getcwd
lstat
mkdir
open
openat
quotactl
readlink
rename
rmdir
stat
statfs
symlink
unlink
$
Then, on a quiet desktop, try running this and then moving your mouse to
see the deluge of mouse related activity:
# perf probe 'vfs_getname=getname_flags:72 pathname=filename:string'
Added new event:
probe:vfs_getname (on getname_flags:72 with pathname=filename:string)
You can now use it in all perf tools, such as:
perf record -e probe:vfs_getname -aR sleep 1
#
# trace --ev probe:vfs_getname --filter-pids 2232 -e file
0.042 (0.042 ms): mousetweaks/2235 open(filename: 0x14e3910, mode: 438 ) ...
0.042 ( ): probe:vfs_getname:(ffffffff812230bc) pathname="/home/acme/.icons/Adwaita/cursors/xterm")
0.100 (0.100 ms): mousetweaks/2235 ... [continued]: open()) = -1 ENOENT No such file or directory
0.142 (0.018 ms): mousetweaks/2235 open(filename: 0x14c3c10, mode: 438 ) ...
0.142 ( ): probe:vfs_getname:(ffffffff812230bc) pathname="/home/acme/.icons/Adwaita/index.theme")
0.192 (0.069 ms): mousetweaks/2235 ... [continued]: open()) = -1 ENOENT No such file or directory
0.230 (0.017 ms): mousetweaks/2235 open(filename: 0x14c3c10, mode: 438 ) ...
0.230 ( ): probe:vfs_getname:(ffffffff812230bc) pathname="/usr/share/icons/Adwaita/cursors/xterm")
0.253 (0.041 ms): mousetweaks/2235 ... [continued]: open()) = 14
0.459 (0.008 ms): mousetweaks/2235 open(filename: 0x14e3910, mode: 438 ) ...
0.459 ( ): probe:vfs_getname:(ffffffff812230bc) pathname="/home/acme/.icons/Adwaita/cursors/left_side")
0.468 (0.017 ms): mousetweaks/2235 ... [continued]: open()) = -1 ENOENT No such file or directory
Need to combine that raw_syscalls:sys_enter(open) + probe:vfs_getname +
raw_syscalls:sys_exit(open) sequence...
Now, if you're bored, please write some more syscall groups, like the ones
in 'strace' and send it our way :-)
Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: Borislav Petkov <bp@suse.de>
Cc: David Ahern <dsahern@gmail.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Milian Wolff <mail@milianw.de>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Stephane Eranian <eranian@google.com>
Link: http://lkml.kernel.org/n/tip-a42xklu59lcbxp7bbnic74a8@git.kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2015-07-20 08:02:09 -07:00
STRACE_GROUPS_DIR = share/perf-core/strace/groups
2013-03-17 16:56:01 -07:00
htmldir = share/doc/perf-doc
2016-01-07 04:41:53 -07:00
tipdir = share/doc/perf-tip
2016-01-09 03:16:28 -07:00
srcdir = $( srctree) /tools/perf
2013-03-17 16:56:01 -07:00
i f e q ( $( prefix ) , / u s r )
sysconfdir = /etc
ETC_PERFCONFIG = $( sysconfdir) /perfconfig
e l s e
sysconfdir = $( prefix) /etc
ETC_PERFCONFIG = etc/perfconfig
e n d i f
2014-08-25 07:55:52 -07:00
i f n d e f l i b
2017-04-09 20:02:37 -07:00
i f e q ( $( SRCARCH ) $( IS_ 64_BIT ) , x 8 6 1 )
2013-09-12 23:27:43 -07:00
lib = lib64
e l s e
2013-03-17 16:56:01 -07:00
lib = lib
2013-09-12 23:27:43 -07:00
e n d i f
2014-08-25 07:55:52 -07:00
e n d i f # lib
2013-09-12 23:27:43 -07:00
libdir = $( prefix) /$( lib)
2013-03-17 16:56:01 -07:00
# Shell quote (do not use $(call) to accommodate ancient setups);
ETC_PERFCONFIG_SQ = $( subst ',' \' ' ,$( ETC_PERFCONFIG) )
perf trace: Support 'strace' syscall event groups
I.e.:
$ cat ~/share/perf-core/strace/groups/file
access
chmod
creat
execve
faccessat
getcwd
lstat
mkdir
open
openat
quotactl
readlink
rename
rmdir
stat
statfs
symlink
unlink
$
Then, on a quiet desktop, try running this and then moving your mouse to
see the deluge of mouse related activity:
# perf probe 'vfs_getname=getname_flags:72 pathname=filename:string'
Added new event:
probe:vfs_getname (on getname_flags:72 with pathname=filename:string)
You can now use it in all perf tools, such as:
perf record -e probe:vfs_getname -aR sleep 1
#
# trace --ev probe:vfs_getname --filter-pids 2232 -e file
0.042 (0.042 ms): mousetweaks/2235 open(filename: 0x14e3910, mode: 438 ) ...
0.042 ( ): probe:vfs_getname:(ffffffff812230bc) pathname="/home/acme/.icons/Adwaita/cursors/xterm")
0.100 (0.100 ms): mousetweaks/2235 ... [continued]: open()) = -1 ENOENT No such file or directory
0.142 (0.018 ms): mousetweaks/2235 open(filename: 0x14c3c10, mode: 438 ) ...
0.142 ( ): probe:vfs_getname:(ffffffff812230bc) pathname="/home/acme/.icons/Adwaita/index.theme")
0.192 (0.069 ms): mousetweaks/2235 ... [continued]: open()) = -1 ENOENT No such file or directory
0.230 (0.017 ms): mousetweaks/2235 open(filename: 0x14c3c10, mode: 438 ) ...
0.230 ( ): probe:vfs_getname:(ffffffff812230bc) pathname="/usr/share/icons/Adwaita/cursors/xterm")
0.253 (0.041 ms): mousetweaks/2235 ... [continued]: open()) = 14
0.459 (0.008 ms): mousetweaks/2235 open(filename: 0x14e3910, mode: 438 ) ...
0.459 ( ): probe:vfs_getname:(ffffffff812230bc) pathname="/home/acme/.icons/Adwaita/cursors/left_side")
0.468 (0.017 ms): mousetweaks/2235 ... [continued]: open()) = -1 ENOENT No such file or directory
Need to combine that raw_syscalls:sys_enter(open) + probe:vfs_getname +
raw_syscalls:sys_exit(open) sequence...
Now, if you're bored, please write some more syscall groups, like the ones
in 'strace' and send it our way :-)
Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: Borislav Petkov <bp@suse.de>
Cc: David Ahern <dsahern@gmail.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Milian Wolff <mail@milianw.de>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Stephane Eranian <eranian@google.com>
Link: http://lkml.kernel.org/n/tip-a42xklu59lcbxp7bbnic74a8@git.kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2015-07-20 08:02:09 -07:00
STRACE_GROUPS_DIR_SQ = $( subst ',' \' ' ,$( STRACE_GROUPS_DIR) )
2013-03-17 16:56:01 -07:00
DESTDIR_SQ = $( subst ',' \' ' ,$( DESTDIR) )
bindir_SQ = $( subst ',' \' ' ,$( bindir) )
2021-06-27 06:18:13 -07:00
includedir_SQ = $( subst ',' \' ' ,$( includedir) )
2013-03-17 16:56:01 -07:00
mandir_SQ = $( subst ',' \' ' ,$( mandir) )
infodir_SQ = $( subst ',' \' ' ,$( infodir) )
perfexecdir_SQ = $( subst ',' \' ' ,$( perfexecdir) )
2022-11-04 07:45:36 -07:00
libbpf_include_dir_SQ = $( subst ',' \' ' ,$( libbpf_include_dir) )
perf bpf: Add 'examples' directories
The first one is the bare minimum that bpf infrastructure accepts before
it expects actual events to be set up:
$ cat tools/perf/examples/bpf/empty.c
char _license[] __attribute__((section("license"), used)) = "GPL";
int _version __attribute__((section("version"), used)) = LINUX_VERSION_CODE;
$
If you remove that "version" line, then it will be refused with:
# perf trace -e tools/perf/examples/bpf/empty.c
event syntax error: 'tools/perf/examples/bpf/empty.c'
\___ Failed to load tools/perf/examples/bpf/empty.c from source: 'version' section incorrect or lost
(add -v to see detail)
Run 'perf list' for a list of valid events
Usage: perf trace [<options>] [<command>]
or: perf trace [<options>] -- <command> [<options>]
or: perf trace record [<options>] [<command>]
or: perf trace record [<options>] -- <command> [<options>]
-e, --event <event> event/syscall selector. use 'perf list' to list available events
#
The next ones will, step by step, show simple filters, then the needs
for headers will be made clear, it will be put in place and tested with
new examples, rinse, repeat.
Back to using this first one to test the perf+bpf infrastructure:
If we run it will fail, as no functions are present connecting with,
say, a tracepoint or a function using the kprobes or uprobes
infrastructure:
# perf trace -e tools/perf/examples/bpf/empty.c
WARNING: event parser found nothing
invalid or unsupported event: 'tools/perf/examples/bpf/empty.c'
Run 'perf list' for a list of valid events
Usage: perf trace [<options>] [<command>]
or: perf trace [<options>] -- <command> [<options>]
or: perf trace record [<options>] [<command>]
or: perf trace record [<options>] -- <command> [<options>]
-e, --event <event> event/syscall selector. use 'perf list' to list available events
#
But, if we set things up to dump the generated object file to a file,
and do this after having run 'make install', still on the developer's
$HOME directory:
# cat ~/.perfconfig
[llvm]
dump-obj = true
#
# perf trace -e ~acme/lib/examples/perf/bpf/empty.c
LLVM: dumping /home/acme/lib/examples/perf/bpf/empty.o
WARNING: event parser found nothing
invalid or unsupported event: '/home/acme/lib/examples/perf/bpf/empty.c'
<SNIP>
#
We can look at the dumped object file:
# ls -la ~acme/lib/examples/perf/bpf/empty.o
-rw-r--r--. 1 root root 576 May 4 12:10 /home/acme/lib/examples/perf/bpf/empty.o
# file ~acme/lib/examples/perf/bpf/empty.o
/home/acme/lib/examples/perf/bpf/empty.o: ELF 64-bit LSB relocatable, *unknown arch 0xf7* version 1 (SYSV), not stripped
# readelf -sw ~acme/lib/examples/perf/bpf/empty.o
Symbol table '.symtab' contains 3 entries:
Num: Value Size Type Bind Vis Ndx Name
0: 0000000000000000 0 NOTYPE LOCAL DEFAULT UND
1: 0000000000000000 0 NOTYPE GLOBAL DEFAULT 3 _license
2: 0000000000000000 0 NOTYPE GLOBAL DEFAULT 4 _version
#
# tools/bpf/bpftool/bpftool --pretty ~acme/lib/examples/perf/bpf/empty.o
null
#
Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: David Ahern <dsahern@gmail.com>
Cc: Jiri Olsa <jolsa@kernel.org>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Wang Nan <wangnan0@huawei.com>
Link: https://lkml.kernel.org/n/tip-y7dkhakejz3013o0w21n98xd@git.kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2018-05-04 07:56:15 -07:00
perf_examples_dir_SQ = $( subst ',' \' ' ,$( perf_examples_dir) )
2013-03-17 16:56:01 -07:00
template_dir_SQ = $( subst ',' \' ' ,$( template_dir) )
htmldir_SQ = $( subst ',' \' ' ,$( htmldir) )
2016-01-07 04:41:53 -07:00
tipdir_SQ = $( subst ',' \' ' ,$( tipdir) )
2013-03-17 16:56:01 -07:00
prefix_SQ = $( subst ',' \' ' ,$( prefix) )
sysconfdir_SQ = $( subst ',' \' ' ,$( sysconfdir) )
2013-09-12 23:27:43 -07:00
libdir_SQ = $( subst ',' \' ' ,$( libdir) )
2016-01-09 03:16:28 -07:00
srcdir_SQ = $( subst ',' \' ' ,$( srcdir) )
2013-03-17 16:56:01 -07:00
i f n e q ( $( filter /%,$ ( firstword $ ( perfexecdir ) ) ) , )
perfexec_instdir = $( perfexecdir)
2022-11-04 07:45:36 -07:00
perf_include_instdir = $( libbpf_include_dir)
perf bpf: Add 'examples' directories
The first one is the bare minimum that bpf infrastructure accepts before
it expects actual events to be set up:
$ cat tools/perf/examples/bpf/empty.c
char _license[] __attribute__((section("license"), used)) = "GPL";
int _version __attribute__((section("version"), used)) = LINUX_VERSION_CODE;
$
If you remove that "version" line, then it will be refused with:
# perf trace -e tools/perf/examples/bpf/empty.c
event syntax error: 'tools/perf/examples/bpf/empty.c'
\___ Failed to load tools/perf/examples/bpf/empty.c from source: 'version' section incorrect or lost
(add -v to see detail)
Run 'perf list' for a list of valid events
Usage: perf trace [<options>] [<command>]
or: perf trace [<options>] -- <command> [<options>]
or: perf trace record [<options>] [<command>]
or: perf trace record [<options>] -- <command> [<options>]
-e, --event <event> event/syscall selector. use 'perf list' to list available events
#
The next ones will, step by step, show simple filters, then the needs
for headers will be made clear, it will be put in place and tested with
new examples, rinse, repeat.
Back to using this first one to test the perf+bpf infrastructure:
If we run it will fail, as no functions are present connecting with,
say, a tracepoint or a function using the kprobes or uprobes
infrastructure:
# perf trace -e tools/perf/examples/bpf/empty.c
WARNING: event parser found nothing
invalid or unsupported event: 'tools/perf/examples/bpf/empty.c'
Run 'perf list' for a list of valid events
Usage: perf trace [<options>] [<command>]
or: perf trace [<options>] -- <command> [<options>]
or: perf trace record [<options>] [<command>]
or: perf trace record [<options>] -- <command> [<options>]
-e, --event <event> event/syscall selector. use 'perf list' to list available events
#
But, if we set things up to dump the generated object file to a file,
and do this after having run 'make install', still on the developer's
$HOME directory:
# cat ~/.perfconfig
[llvm]
dump-obj = true
#
# perf trace -e ~acme/lib/examples/perf/bpf/empty.c
LLVM: dumping /home/acme/lib/examples/perf/bpf/empty.o
WARNING: event parser found nothing
invalid or unsupported event: '/home/acme/lib/examples/perf/bpf/empty.c'
<SNIP>
#
We can look at the dumped object file:
# ls -la ~acme/lib/examples/perf/bpf/empty.o
-rw-r--r--. 1 root root 576 May 4 12:10 /home/acme/lib/examples/perf/bpf/empty.o
# file ~acme/lib/examples/perf/bpf/empty.o
/home/acme/lib/examples/perf/bpf/empty.o: ELF 64-bit LSB relocatable, *unknown arch 0xf7* version 1 (SYSV), not stripped
# readelf -sw ~acme/lib/examples/perf/bpf/empty.o
Symbol table '.symtab' contains 3 entries:
Num: Value Size Type Bind Vis Ndx Name
0: 0000000000000000 0 NOTYPE LOCAL DEFAULT UND
1: 0000000000000000 0 NOTYPE GLOBAL DEFAULT 3 _license
2: 0000000000000000 0 NOTYPE GLOBAL DEFAULT 4 _version
#
# tools/bpf/bpftool/bpftool --pretty ~acme/lib/examples/perf/bpf/empty.o
null
#
Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: David Ahern <dsahern@gmail.com>
Cc: Jiri Olsa <jolsa@kernel.org>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Wang Nan <wangnan0@huawei.com>
Link: https://lkml.kernel.org/n/tip-y7dkhakejz3013o0w21n98xd@git.kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2018-05-04 07:56:15 -07:00
perf_examples_instdir = $( perf_examples_dir)
perf trace: Support 'strace' syscall event groups
I.e.:
$ cat ~/share/perf-core/strace/groups/file
access
chmod
creat
execve
faccessat
getcwd
lstat
mkdir
open
openat
quotactl
readlink
rename
rmdir
stat
statfs
symlink
unlink
$
Then, on a quiet desktop, try running this and then moving your mouse to
see the deluge of mouse related activity:
# perf probe 'vfs_getname=getname_flags:72 pathname=filename:string'
Added new event:
probe:vfs_getname (on getname_flags:72 with pathname=filename:string)
You can now use it in all perf tools, such as:
perf record -e probe:vfs_getname -aR sleep 1
#
# trace --ev probe:vfs_getname --filter-pids 2232 -e file
0.042 (0.042 ms): mousetweaks/2235 open(filename: 0x14e3910, mode: 438 ) ...
0.042 ( ): probe:vfs_getname:(ffffffff812230bc) pathname="/home/acme/.icons/Adwaita/cursors/xterm")
0.100 (0.100 ms): mousetweaks/2235 ... [continued]: open()) = -1 ENOENT No such file or directory
0.142 (0.018 ms): mousetweaks/2235 open(filename: 0x14c3c10, mode: 438 ) ...
0.142 ( ): probe:vfs_getname:(ffffffff812230bc) pathname="/home/acme/.icons/Adwaita/index.theme")
0.192 (0.069 ms): mousetweaks/2235 ... [continued]: open()) = -1 ENOENT No such file or directory
0.230 (0.017 ms): mousetweaks/2235 open(filename: 0x14c3c10, mode: 438 ) ...
0.230 ( ): probe:vfs_getname:(ffffffff812230bc) pathname="/usr/share/icons/Adwaita/cursors/xterm")
0.253 (0.041 ms): mousetweaks/2235 ... [continued]: open()) = 14
0.459 (0.008 ms): mousetweaks/2235 open(filename: 0x14e3910, mode: 438 ) ...
0.459 ( ): probe:vfs_getname:(ffffffff812230bc) pathname="/home/acme/.icons/Adwaita/cursors/left_side")
0.468 (0.017 ms): mousetweaks/2235 ... [continued]: open()) = -1 ENOENT No such file or directory
Need to combine that raw_syscalls:sys_enter(open) + probe:vfs_getname +
raw_syscalls:sys_exit(open) sequence...
Now, if you're bored, please write some more syscall groups, like the ones
in 'strace' and send it our way :-)
Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: Borislav Petkov <bp@suse.de>
Cc: David Ahern <dsahern@gmail.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Milian Wolff <mail@milianw.de>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Stephane Eranian <eranian@google.com>
Link: http://lkml.kernel.org/n/tip-a42xklu59lcbxp7bbnic74a8@git.kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2015-07-20 08:02:09 -07:00
STRACE_GROUPS_INSTDIR = $( STRACE_GROUPS_DIR)
2016-01-07 04:41:53 -07:00
tip_instdir = $( tipdir)
2013-03-17 16:56:01 -07:00
e l s e
perfexec_instdir = $( prefix) /$( perfexecdir)
2022-11-04 07:45:36 -07:00
perf_include_instdir = $( prefix) /$( libbpf_include_dir)
perf bpf: Add 'examples' directories
The first one is the bare minimum that bpf infrastructure accepts before
it expects actual events to be set up:
$ cat tools/perf/examples/bpf/empty.c
char _license[] __attribute__((section("license"), used)) = "GPL";
int _version __attribute__((section("version"), used)) = LINUX_VERSION_CODE;
$
If you remove that "version" line, then it will be refused with:
# perf trace -e tools/perf/examples/bpf/empty.c
event syntax error: 'tools/perf/examples/bpf/empty.c'
\___ Failed to load tools/perf/examples/bpf/empty.c from source: 'version' section incorrect or lost
(add -v to see detail)
Run 'perf list' for a list of valid events
Usage: perf trace [<options>] [<command>]
or: perf trace [<options>] -- <command> [<options>]
or: perf trace record [<options>] [<command>]
or: perf trace record [<options>] -- <command> [<options>]
-e, --event <event> event/syscall selector. use 'perf list' to list available events
#
The next ones will, step by step, show simple filters, then the needs
for headers will be made clear, it will be put in place and tested with
new examples, rinse, repeat.
Back to using this first one to test the perf+bpf infrastructure:
If we run it will fail, as no functions are present connecting with,
say, a tracepoint or a function using the kprobes or uprobes
infrastructure:
# perf trace -e tools/perf/examples/bpf/empty.c
WARNING: event parser found nothing
invalid or unsupported event: 'tools/perf/examples/bpf/empty.c'
Run 'perf list' for a list of valid events
Usage: perf trace [<options>] [<command>]
or: perf trace [<options>] -- <command> [<options>]
or: perf trace record [<options>] [<command>]
or: perf trace record [<options>] -- <command> [<options>]
-e, --event <event> event/syscall selector. use 'perf list' to list available events
#
But, if we set things up to dump the generated object file to a file,
and do this after having run 'make install', still on the developer's
$HOME directory:
# cat ~/.perfconfig
[llvm]
dump-obj = true
#
# perf trace -e ~acme/lib/examples/perf/bpf/empty.c
LLVM: dumping /home/acme/lib/examples/perf/bpf/empty.o
WARNING: event parser found nothing
invalid or unsupported event: '/home/acme/lib/examples/perf/bpf/empty.c'
<SNIP>
#
We can look at the dumped object file:
# ls -la ~acme/lib/examples/perf/bpf/empty.o
-rw-r--r--. 1 root root 576 May 4 12:10 /home/acme/lib/examples/perf/bpf/empty.o
# file ~acme/lib/examples/perf/bpf/empty.o
/home/acme/lib/examples/perf/bpf/empty.o: ELF 64-bit LSB relocatable, *unknown arch 0xf7* version 1 (SYSV), not stripped
# readelf -sw ~acme/lib/examples/perf/bpf/empty.o
Symbol table '.symtab' contains 3 entries:
Num: Value Size Type Bind Vis Ndx Name
0: 0000000000000000 0 NOTYPE LOCAL DEFAULT UND
1: 0000000000000000 0 NOTYPE GLOBAL DEFAULT 3 _license
2: 0000000000000000 0 NOTYPE GLOBAL DEFAULT 4 _version
#
# tools/bpf/bpftool/bpftool --pretty ~acme/lib/examples/perf/bpf/empty.o
null
#
Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: David Ahern <dsahern@gmail.com>
Cc: Jiri Olsa <jolsa@kernel.org>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Wang Nan <wangnan0@huawei.com>
Link: https://lkml.kernel.org/n/tip-y7dkhakejz3013o0w21n98xd@git.kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2018-05-04 07:56:15 -07:00
perf_examples_instdir = $( prefix) /$( perf_examples_dir)
perf trace: Support 'strace' syscall event groups
I.e.:
$ cat ~/share/perf-core/strace/groups/file
access
chmod
creat
execve
faccessat
getcwd
lstat
mkdir
open
openat
quotactl
readlink
rename
rmdir
stat
statfs
symlink
unlink
$
Then, on a quiet desktop, try running this and then moving your mouse to
see the deluge of mouse related activity:
# perf probe 'vfs_getname=getname_flags:72 pathname=filename:string'
Added new event:
probe:vfs_getname (on getname_flags:72 with pathname=filename:string)
You can now use it in all perf tools, such as:
perf record -e probe:vfs_getname -aR sleep 1
#
# trace --ev probe:vfs_getname --filter-pids 2232 -e file
0.042 (0.042 ms): mousetweaks/2235 open(filename: 0x14e3910, mode: 438 ) ...
0.042 ( ): probe:vfs_getname:(ffffffff812230bc) pathname="/home/acme/.icons/Adwaita/cursors/xterm")
0.100 (0.100 ms): mousetweaks/2235 ... [continued]: open()) = -1 ENOENT No such file or directory
0.142 (0.018 ms): mousetweaks/2235 open(filename: 0x14c3c10, mode: 438 ) ...
0.142 ( ): probe:vfs_getname:(ffffffff812230bc) pathname="/home/acme/.icons/Adwaita/index.theme")
0.192 (0.069 ms): mousetweaks/2235 ... [continued]: open()) = -1 ENOENT No such file or directory
0.230 (0.017 ms): mousetweaks/2235 open(filename: 0x14c3c10, mode: 438 ) ...
0.230 ( ): probe:vfs_getname:(ffffffff812230bc) pathname="/usr/share/icons/Adwaita/cursors/xterm")
0.253 (0.041 ms): mousetweaks/2235 ... [continued]: open()) = 14
0.459 (0.008 ms): mousetweaks/2235 open(filename: 0x14e3910, mode: 438 ) ...
0.459 ( ): probe:vfs_getname:(ffffffff812230bc) pathname="/home/acme/.icons/Adwaita/cursors/left_side")
0.468 (0.017 ms): mousetweaks/2235 ... [continued]: open()) = -1 ENOENT No such file or directory
Need to combine that raw_syscalls:sys_enter(open) + probe:vfs_getname +
raw_syscalls:sys_exit(open) sequence...
Now, if you're bored, please write some more syscall groups, like the ones
in 'strace' and send it our way :-)
Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: Borislav Petkov <bp@suse.de>
Cc: David Ahern <dsahern@gmail.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Milian Wolff <mail@milianw.de>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Stephane Eranian <eranian@google.com>
Link: http://lkml.kernel.org/n/tip-a42xklu59lcbxp7bbnic74a8@git.kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2015-07-20 08:02:09 -07:00
STRACE_GROUPS_INSTDIR = $( prefix) /$( STRACE_GROUPS_DIR)
2016-01-07 04:41:53 -07:00
tip_instdir = $( prefix) /$( tipdir)
2013-03-17 16:56:01 -07:00
e n d i f
perfexec_instdir_SQ = $( subst ',' \' ' ,$( perfexec_instdir) )
2018-05-04 06:37:27 -07:00
perf_include_instdir_SQ = $( subst ',' \' ' ,$( perf_include_instdir) )
perf bpf: Add 'examples' directories
The first one is the bare minimum that bpf infrastructure accepts before
it expects actual events to be set up:
$ cat tools/perf/examples/bpf/empty.c
char _license[] __attribute__((section("license"), used)) = "GPL";
int _version __attribute__((section("version"), used)) = LINUX_VERSION_CODE;
$
If you remove that "version" line, then it will be refused with:
# perf trace -e tools/perf/examples/bpf/empty.c
event syntax error: 'tools/perf/examples/bpf/empty.c'
\___ Failed to load tools/perf/examples/bpf/empty.c from source: 'version' section incorrect or lost
(add -v to see detail)
Run 'perf list' for a list of valid events
Usage: perf trace [<options>] [<command>]
or: perf trace [<options>] -- <command> [<options>]
or: perf trace record [<options>] [<command>]
or: perf trace record [<options>] -- <command> [<options>]
-e, --event <event> event/syscall selector. use 'perf list' to list available events
#
The next ones will, step by step, show simple filters, then the needs
for headers will be made clear, it will be put in place and tested with
new examples, rinse, repeat.
Back to using this first one to test the perf+bpf infrastructure:
If we run it will fail, as no functions are present connecting with,
say, a tracepoint or a function using the kprobes or uprobes
infrastructure:
# perf trace -e tools/perf/examples/bpf/empty.c
WARNING: event parser found nothing
invalid or unsupported event: 'tools/perf/examples/bpf/empty.c'
Run 'perf list' for a list of valid events
Usage: perf trace [<options>] [<command>]
or: perf trace [<options>] -- <command> [<options>]
or: perf trace record [<options>] [<command>]
or: perf trace record [<options>] -- <command> [<options>]
-e, --event <event> event/syscall selector. use 'perf list' to list available events
#
But, if we set things up to dump the generated object file to a file,
and do this after having run 'make install', still on the developer's
$HOME directory:
# cat ~/.perfconfig
[llvm]
dump-obj = true
#
# perf trace -e ~acme/lib/examples/perf/bpf/empty.c
LLVM: dumping /home/acme/lib/examples/perf/bpf/empty.o
WARNING: event parser found nothing
invalid or unsupported event: '/home/acme/lib/examples/perf/bpf/empty.c'
<SNIP>
#
We can look at the dumped object file:
# ls -la ~acme/lib/examples/perf/bpf/empty.o
-rw-r--r--. 1 root root 576 May 4 12:10 /home/acme/lib/examples/perf/bpf/empty.o
# file ~acme/lib/examples/perf/bpf/empty.o
/home/acme/lib/examples/perf/bpf/empty.o: ELF 64-bit LSB relocatable, *unknown arch 0xf7* version 1 (SYSV), not stripped
# readelf -sw ~acme/lib/examples/perf/bpf/empty.o
Symbol table '.symtab' contains 3 entries:
Num: Value Size Type Bind Vis Ndx Name
0: 0000000000000000 0 NOTYPE LOCAL DEFAULT UND
1: 0000000000000000 0 NOTYPE GLOBAL DEFAULT 3 _license
2: 0000000000000000 0 NOTYPE GLOBAL DEFAULT 4 _version
#
# tools/bpf/bpftool/bpftool --pretty ~acme/lib/examples/perf/bpf/empty.o
null
#
Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: David Ahern <dsahern@gmail.com>
Cc: Jiri Olsa <jolsa@kernel.org>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Wang Nan <wangnan0@huawei.com>
Link: https://lkml.kernel.org/n/tip-y7dkhakejz3013o0w21n98xd@git.kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2018-05-04 07:56:15 -07:00
perf_examples_instdir_SQ = $( subst ',' \' ' ,$( perf_examples_instdir) )
perf trace: Support 'strace' syscall event groups
I.e.:
$ cat ~/share/perf-core/strace/groups/file
access
chmod
creat
execve
faccessat
getcwd
lstat
mkdir
open
openat
quotactl
readlink
rename
rmdir
stat
statfs
symlink
unlink
$
Then, on a quiet desktop, try running this and then moving your mouse to
see the deluge of mouse related activity:
# perf probe 'vfs_getname=getname_flags:72 pathname=filename:string'
Added new event:
probe:vfs_getname (on getname_flags:72 with pathname=filename:string)
You can now use it in all perf tools, such as:
perf record -e probe:vfs_getname -aR sleep 1
#
# trace --ev probe:vfs_getname --filter-pids 2232 -e file
0.042 (0.042 ms): mousetweaks/2235 open(filename: 0x14e3910, mode: 438 ) ...
0.042 ( ): probe:vfs_getname:(ffffffff812230bc) pathname="/home/acme/.icons/Adwaita/cursors/xterm")
0.100 (0.100 ms): mousetweaks/2235 ... [continued]: open()) = -1 ENOENT No such file or directory
0.142 (0.018 ms): mousetweaks/2235 open(filename: 0x14c3c10, mode: 438 ) ...
0.142 ( ): probe:vfs_getname:(ffffffff812230bc) pathname="/home/acme/.icons/Adwaita/index.theme")
0.192 (0.069 ms): mousetweaks/2235 ... [continued]: open()) = -1 ENOENT No such file or directory
0.230 (0.017 ms): mousetweaks/2235 open(filename: 0x14c3c10, mode: 438 ) ...
0.230 ( ): probe:vfs_getname:(ffffffff812230bc) pathname="/usr/share/icons/Adwaita/cursors/xterm")
0.253 (0.041 ms): mousetweaks/2235 ... [continued]: open()) = 14
0.459 (0.008 ms): mousetweaks/2235 open(filename: 0x14e3910, mode: 438 ) ...
0.459 ( ): probe:vfs_getname:(ffffffff812230bc) pathname="/home/acme/.icons/Adwaita/cursors/left_side")
0.468 (0.017 ms): mousetweaks/2235 ... [continued]: open()) = -1 ENOENT No such file or directory
Need to combine that raw_syscalls:sys_enter(open) + probe:vfs_getname +
raw_syscalls:sys_exit(open) sequence...
Now, if you're bored, please write some more syscall groups, like the ones
in 'strace' and send it our way :-)
Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: Borislav Petkov <bp@suse.de>
Cc: David Ahern <dsahern@gmail.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Milian Wolff <mail@milianw.de>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Stephane Eranian <eranian@google.com>
Link: http://lkml.kernel.org/n/tip-a42xklu59lcbxp7bbnic74a8@git.kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2015-07-20 08:02:09 -07:00
STRACE_GROUPS_INSTDIR_SQ = $( subst ',' \' ' ,$( STRACE_GROUPS_INSTDIR) )
2016-01-07 04:41:53 -07:00
tip_instdir_SQ = $( subst ',' \' ' ,$( tip_instdir) )
2013-12-03 06:09:21 -07:00
2022-09-09 08:27:52 -07:00
export perfexec_instdir_SQ
2015-03-02 05:30:30 -07:00
print_var = $( eval $( print_var_code) ) $( info $( MSG) )
d e f i n e p r i n t _ v a r _ c o d e
2022-08-18 05:09:56 -07:00
MSG = $( shell printf '...%40s: %s' $( 1) $( $( 1) ) )
2014-02-19 08:52:55 -07:00
e n d e f
tools build: Fix feature detection output due to eval expansion
As the first eval expansion is used only to generate Makefile statements,
messages should not be displayed at this stage, as for example conditional
expressions are not evaluated.
It can be seen for example in the output of feature detection for bpftool,
where the number of detected features does not change, despite turning on
the verbose mode (VF = 1) and there are additional features to display.
Fix this issue by escaping the $ before $(info) statements, to ensure that
messages are printed only when the function containing them is actually
executed, and not when it is expanded.
In addition, move the $(info) statement out of feature_print_status, due to
the fact that is called both inside and outside an eval context, and place
it to the caller so that the $ can be escaped when necessary. For symmetry,
move the $(info) statement also out of feature_print_text, and place it to
the caller.
Force the TMP variable evaluation in verbose mode, to display the features
in FEATURE_TESTS that are not in FEATURE_DISPLAY.
Reorder perf feature detection messages (first non-verbose, then verbose
ones) by moving the call to feature_display_entries earlier, before the VF
environment variable check.
Also, remove the newline from that function, as perf might display
additional messages. Move the newline to perf Makefile, and display another
one if displaying the detection result is not deferred as in the case of
bpftool.
Committer testing:
Collecting the output from:
$ make VF=1 -C tools/bpf/bpftool/ |& grep "Auto-detecting system features" -A20
$ diff -u before after
--- before 2022-08-18 09:59:55.460529231 -0300
+++ after 2022-08-18 10:01:11.182517282 -0300
@@ -4,3 +4,5 @@
... libbfd-liberty-z: [ on ]
... libcap: [ on ]
... clang-bpf-co-re: [ on ]
+... disassembler-four-args: [ on ]
+... disassembler-init-styled: [ OFF ]
$
Fixes: 0afc5cad387db560 ("perf build: Separate feature make support into config/Makefile.feature")
Signed-off-by: Roberto Sassu <roberto.sassu@huawei.com>
Tested-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
Cc: bpf@vger.kernel.org
Cc: Ingo Molnar <mingo@redhat.com>
Cc: Jiri Olsa <jolsa@kernel.org>
Cc: Mark Rutland <mark.rutland@arm.com>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Quentin Monnet <quentin@isovalent.com>
Link: https://lore.kernel.org/r/20220818120957.319995-1-roberto.sassu@huaweicloud.com
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2022-08-18 05:09:55 -07:00
i f e q ( $( feature_display ) , 1 )
$( call feature_display_entries)
e n d i f
2014-02-19 08:52:54 -07:00
i f e q ( $( VF ) , 1 )
2018-01-09 02:26:46 -07:00
# Display EXTRA features which are detected manualy
# from here with feature_check call and thus cannot
# be partof global state output.
tools build: Fix feature detection output due to eval expansion
As the first eval expansion is used only to generate Makefile statements,
messages should not be displayed at this stage, as for example conditional
expressions are not evaluated.
It can be seen for example in the output of feature detection for bpftool,
where the number of detected features does not change, despite turning on
the verbose mode (VF = 1) and there are additional features to display.
Fix this issue by escaping the $ before $(info) statements, to ensure that
messages are printed only when the function containing them is actually
executed, and not when it is expanded.
In addition, move the $(info) statement out of feature_print_status, due to
the fact that is called both inside and outside an eval context, and place
it to the caller so that the $ can be escaped when necessary. For symmetry,
move the $(info) statement also out of feature_print_text, and place it to
the caller.
Force the TMP variable evaluation in verbose mode, to display the features
in FEATURE_TESTS that are not in FEATURE_DISPLAY.
Reorder perf feature detection messages (first non-verbose, then verbose
ones) by moving the call to feature_display_entries earlier, before the VF
environment variable check.
Also, remove the newline from that function, as perf might display
additional messages. Move the newline to perf Makefile, and display another
one if displaying the detection result is not deferred as in the case of
bpftool.
Committer testing:
Collecting the output from:
$ make VF=1 -C tools/bpf/bpftool/ |& grep "Auto-detecting system features" -A20
$ diff -u before after
--- before 2022-08-18 09:59:55.460529231 -0300
+++ after 2022-08-18 10:01:11.182517282 -0300
@@ -4,3 +4,5 @@
... libbfd-liberty-z: [ on ]
... libcap: [ on ]
... clang-bpf-co-re: [ on ]
+... disassembler-four-args: [ on ]
+... disassembler-init-styled: [ OFF ]
$
Fixes: 0afc5cad387db560 ("perf build: Separate feature make support into config/Makefile.feature")
Signed-off-by: Roberto Sassu <roberto.sassu@huawei.com>
Tested-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
Cc: bpf@vger.kernel.org
Cc: Ingo Molnar <mingo@redhat.com>
Cc: Jiri Olsa <jolsa@kernel.org>
Cc: Mark Rutland <mark.rutland@arm.com>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Quentin Monnet <quentin@isovalent.com>
Link: https://lore.kernel.org/r/20220818120957.319995-1-roberto.sassu@huaweicloud.com
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2022-08-18 05:09:55 -07:00
$( foreach feat,$( FEATURE_TESTS_EXTRA) ,$( call feature_print_status,$( feat) ,) $( info $( MSG) ) )
2015-03-02 05:30:30 -07:00
$( call print_var,prefix)
$( call print_var,bindir)
$( call print_var,libdir)
$( call print_var,sysconfdir)
$( call print_var,LIBUNWIND_DIR)
$( call print_var,LIBDW_DIR)
2016-11-02 06:35:49 -07:00
$( call print_var,JDIR)
2015-12-23 10:58:31 -07:00
ifeq ( $( dwarf-post-unwind) ,1)
tools build: Fix feature detection output due to eval expansion
As the first eval expansion is used only to generate Makefile statements,
messages should not be displayed at this stage, as for example conditional
expressions are not evaluated.
It can be seen for example in the output of feature detection for bpftool,
where the number of detected features does not change, despite turning on
the verbose mode (VF = 1) and there are additional features to display.
Fix this issue by escaping the $ before $(info) statements, to ensure that
messages are printed only when the function containing them is actually
executed, and not when it is expanded.
In addition, move the $(info) statement out of feature_print_status, due to
the fact that is called both inside and outside an eval context, and place
it to the caller so that the $ can be escaped when necessary. For symmetry,
move the $(info) statement also out of feature_print_text, and place it to
the caller.
Force the TMP variable evaluation in verbose mode, to display the features
in FEATURE_TESTS that are not in FEATURE_DISPLAY.
Reorder perf feature detection messages (first non-verbose, then verbose
ones) by moving the call to feature_display_entries earlier, before the VF
environment variable check.
Also, remove the newline from that function, as perf might display
additional messages. Move the newline to perf Makefile, and display another
one if displaying the detection result is not deferred as in the case of
bpftool.
Committer testing:
Collecting the output from:
$ make VF=1 -C tools/bpf/bpftool/ |& grep "Auto-detecting system features" -A20
$ diff -u before after
--- before 2022-08-18 09:59:55.460529231 -0300
+++ after 2022-08-18 10:01:11.182517282 -0300
@@ -4,3 +4,5 @@
... libbfd-liberty-z: [ on ]
... libcap: [ on ]
... clang-bpf-co-re: [ on ]
+... disassembler-four-args: [ on ]
+... disassembler-init-styled: [ OFF ]
$
Fixes: 0afc5cad387db560 ("perf build: Separate feature make support into config/Makefile.feature")
Signed-off-by: Roberto Sassu <roberto.sassu@huawei.com>
Tested-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
Cc: bpf@vger.kernel.org
Cc: Ingo Molnar <mingo@redhat.com>
Cc: Jiri Olsa <jolsa@kernel.org>
Cc: Mark Rutland <mark.rutland@arm.com>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Quentin Monnet <quentin@isovalent.com>
Link: https://lore.kernel.org/r/20220818120957.319995-1-roberto.sassu@huaweicloud.com
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2022-08-18 05:09:55 -07:00
$( call feature_print_text,"DWARF post unwind library" , $( dwarf-post-unwind-text) ) $( info $( MSG) )
2015-12-23 10:58:31 -07:00
endif
2014-02-19 08:52:54 -07:00
e n d i f
2014-12-29 07:03:09 -07:00
tools build: Fix feature detection output due to eval expansion
As the first eval expansion is used only to generate Makefile statements,
messages should not be displayed at this stage, as for example conditional
expressions are not evaluated.
It can be seen for example in the output of feature detection for bpftool,
where the number of detected features does not change, despite turning on
the verbose mode (VF = 1) and there are additional features to display.
Fix this issue by escaping the $ before $(info) statements, to ensure that
messages are printed only when the function containing them is actually
executed, and not when it is expanded.
In addition, move the $(info) statement out of feature_print_status, due to
the fact that is called both inside and outside an eval context, and place
it to the caller so that the $ can be escaped when necessary. For symmetry,
move the $(info) statement also out of feature_print_text, and place it to
the caller.
Force the TMP variable evaluation in verbose mode, to display the features
in FEATURE_TESTS that are not in FEATURE_DISPLAY.
Reorder perf feature detection messages (first non-verbose, then verbose
ones) by moving the call to feature_display_entries earlier, before the VF
environment variable check.
Also, remove the newline from that function, as perf might display
additional messages. Move the newline to perf Makefile, and display another
one if displaying the detection result is not deferred as in the case of
bpftool.
Committer testing:
Collecting the output from:
$ make VF=1 -C tools/bpf/bpftool/ |& grep "Auto-detecting system features" -A20
$ diff -u before after
--- before 2022-08-18 09:59:55.460529231 -0300
+++ after 2022-08-18 10:01:11.182517282 -0300
@@ -4,3 +4,5 @@
... libbfd-liberty-z: [ on ]
... libcap: [ on ]
... clang-bpf-co-re: [ on ]
+... disassembler-four-args: [ on ]
+... disassembler-init-styled: [ OFF ]
$
Fixes: 0afc5cad387db560 ("perf build: Separate feature make support into config/Makefile.feature")
Signed-off-by: Roberto Sassu <roberto.sassu@huawei.com>
Tested-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
Cc: bpf@vger.kernel.org
Cc: Ingo Molnar <mingo@redhat.com>
Cc: Jiri Olsa <jolsa@kernel.org>
Cc: Mark Rutland <mark.rutland@arm.com>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Quentin Monnet <quentin@isovalent.com>
Link: https://lore.kernel.org/r/20220818120957.319995-1-roberto.sassu@huaweicloud.com
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2022-08-18 05:09:55 -07:00
$( info )
2014-12-29 07:03:09 -07:00
$( call detected_var ,bindir_SQ )
$( call detected_var ,PYTHON_WORD )
i f n e q ( $( OUTPUT ) , )
$( call detected_var ,OUTPUT )
e n d i f
2014-12-29 07:13:44 -07:00
$( call detected_var ,htmldir_SQ )
$( call detected_var ,infodir_SQ )
$( call detected_var ,mandir_SQ )
2014-12-29 09:42:46 -07:00
$( call detected_var ,ETC_PERFCONFIG_SQ )
perf trace: Support 'strace' syscall event groups
I.e.:
$ cat ~/share/perf-core/strace/groups/file
access
chmod
creat
execve
faccessat
getcwd
lstat
mkdir
open
openat
quotactl
readlink
rename
rmdir
stat
statfs
symlink
unlink
$
Then, on a quiet desktop, try running this and then moving your mouse to
see the deluge of mouse related activity:
# perf probe 'vfs_getname=getname_flags:72 pathname=filename:string'
Added new event:
probe:vfs_getname (on getname_flags:72 with pathname=filename:string)
You can now use it in all perf tools, such as:
perf record -e probe:vfs_getname -aR sleep 1
#
# trace --ev probe:vfs_getname --filter-pids 2232 -e file
0.042 (0.042 ms): mousetweaks/2235 open(filename: 0x14e3910, mode: 438 ) ...
0.042 ( ): probe:vfs_getname:(ffffffff812230bc) pathname="/home/acme/.icons/Adwaita/cursors/xterm")
0.100 (0.100 ms): mousetweaks/2235 ... [continued]: open()) = -1 ENOENT No such file or directory
0.142 (0.018 ms): mousetweaks/2235 open(filename: 0x14c3c10, mode: 438 ) ...
0.142 ( ): probe:vfs_getname:(ffffffff812230bc) pathname="/home/acme/.icons/Adwaita/index.theme")
0.192 (0.069 ms): mousetweaks/2235 ... [continued]: open()) = -1 ENOENT No such file or directory
0.230 (0.017 ms): mousetweaks/2235 open(filename: 0x14c3c10, mode: 438 ) ...
0.230 ( ): probe:vfs_getname:(ffffffff812230bc) pathname="/usr/share/icons/Adwaita/cursors/xterm")
0.253 (0.041 ms): mousetweaks/2235 ... [continued]: open()) = 14
0.459 (0.008 ms): mousetweaks/2235 open(filename: 0x14e3910, mode: 438 ) ...
0.459 ( ): probe:vfs_getname:(ffffffff812230bc) pathname="/home/acme/.icons/Adwaita/cursors/left_side")
0.468 (0.017 ms): mousetweaks/2235 ... [continued]: open()) = -1 ENOENT No such file or directory
Need to combine that raw_syscalls:sys_enter(open) + probe:vfs_getname +
raw_syscalls:sys_exit(open) sequence...
Now, if you're bored, please write some more syscall groups, like the ones
in 'strace' and send it our way :-)
Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: Borislav Petkov <bp@suse.de>
Cc: David Ahern <dsahern@gmail.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Milian Wolff <mail@milianw.de>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Stephane Eranian <eranian@google.com>
Link: http://lkml.kernel.org/n/tip-a42xklu59lcbxp7bbnic74a8@git.kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2015-07-20 08:02:09 -07:00
$( call detected_var ,STRACE_GROUPS_DIR_SQ )
2014-12-29 09:42:46 -07:00
$( call detected_var ,prefix_SQ )
$( call detected_var ,perfexecdir_SQ )
2022-11-04 07:45:36 -07:00
$( call detected_var ,libbpf_include_dir_SQ )
perf bpf: Add 'examples' directories
The first one is the bare minimum that bpf infrastructure accepts before
it expects actual events to be set up:
$ cat tools/perf/examples/bpf/empty.c
char _license[] __attribute__((section("license"), used)) = "GPL";
int _version __attribute__((section("version"), used)) = LINUX_VERSION_CODE;
$
If you remove that "version" line, then it will be refused with:
# perf trace -e tools/perf/examples/bpf/empty.c
event syntax error: 'tools/perf/examples/bpf/empty.c'
\___ Failed to load tools/perf/examples/bpf/empty.c from source: 'version' section incorrect or lost
(add -v to see detail)
Run 'perf list' for a list of valid events
Usage: perf trace [<options>] [<command>]
or: perf trace [<options>] -- <command> [<options>]
or: perf trace record [<options>] [<command>]
or: perf trace record [<options>] -- <command> [<options>]
-e, --event <event> event/syscall selector. use 'perf list' to list available events
#
The next ones will, step by step, show simple filters, then the needs
for headers will be made clear, it will be put in place and tested with
new examples, rinse, repeat.
Back to using this first one to test the perf+bpf infrastructure:
If we run it will fail, as no functions are present connecting with,
say, a tracepoint or a function using the kprobes or uprobes
infrastructure:
# perf trace -e tools/perf/examples/bpf/empty.c
WARNING: event parser found nothing
invalid or unsupported event: 'tools/perf/examples/bpf/empty.c'
Run 'perf list' for a list of valid events
Usage: perf trace [<options>] [<command>]
or: perf trace [<options>] -- <command> [<options>]
or: perf trace record [<options>] [<command>]
or: perf trace record [<options>] -- <command> [<options>]
-e, --event <event> event/syscall selector. use 'perf list' to list available events
#
But, if we set things up to dump the generated object file to a file,
and do this after having run 'make install', still on the developer's
$HOME directory:
# cat ~/.perfconfig
[llvm]
dump-obj = true
#
# perf trace -e ~acme/lib/examples/perf/bpf/empty.c
LLVM: dumping /home/acme/lib/examples/perf/bpf/empty.o
WARNING: event parser found nothing
invalid or unsupported event: '/home/acme/lib/examples/perf/bpf/empty.c'
<SNIP>
#
We can look at the dumped object file:
# ls -la ~acme/lib/examples/perf/bpf/empty.o
-rw-r--r--. 1 root root 576 May 4 12:10 /home/acme/lib/examples/perf/bpf/empty.o
# file ~acme/lib/examples/perf/bpf/empty.o
/home/acme/lib/examples/perf/bpf/empty.o: ELF 64-bit LSB relocatable, *unknown arch 0xf7* version 1 (SYSV), not stripped
# readelf -sw ~acme/lib/examples/perf/bpf/empty.o
Symbol table '.symtab' contains 3 entries:
Num: Value Size Type Bind Vis Ndx Name
0: 0000000000000000 0 NOTYPE LOCAL DEFAULT UND
1: 0000000000000000 0 NOTYPE GLOBAL DEFAULT 3 _license
2: 0000000000000000 0 NOTYPE GLOBAL DEFAULT 4 _version
#
# tools/bpf/bpftool/bpftool --pretty ~acme/lib/examples/perf/bpf/empty.o
null
#
Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: David Ahern <dsahern@gmail.com>
Cc: Jiri Olsa <jolsa@kernel.org>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Wang Nan <wangnan0@huawei.com>
Link: https://lkml.kernel.org/n/tip-y7dkhakejz3013o0w21n98xd@git.kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2018-05-04 07:56:15 -07:00
$( call detected_var ,perf_examples_dir_SQ )
2016-01-07 04:41:53 -07:00
$( call detected_var ,tipdir_SQ )
2016-01-09 03:16:28 -07:00
$( call detected_var ,srcdir_SQ )
2014-12-29 16:16:01 -07:00
$( call detected_var ,LIBDIR )
2014-12-29 16:34:23 -07:00
$( call detected_var ,GTK_CFLAGS )
2014-12-30 05:11:32 -07:00
$( call detected_var ,PERL_EMBED_CCOPTS )
$( call detected_var ,PYTHON_EMBED_CCOPTS )
2021-05-24 04:15:14 -07:00
i f n e q ( $( BISON_FILE_PREFIX_MAP ) , )
$( call detected_var ,BISON_FILE_PREFIX_MAP )
e n d i f
2021-04-26 11:27:32 -07:00
# re-generate FEATURE-DUMP as we may have called feature_check, found out
# extra libraries to add to LDFLAGS of some other test and then redo those
2023-06-26 23:32:57 -07:00
# tests, see the block about libbfd, disassembler-four-args, for instance.
2021-04-26 11:27:32 -07:00
$( shell rm -f $ ( FEATURE_DUMP_FILENAME ) )
$( foreach feat ,$ ( FEATURE_TESTS ) ,$ ( shell echo "$ ( call feature_assign ,$ ( feat ) ) " >> $ ( FEATURE_DUMP_FILENAME ) ) )