From 4f99a9eb031020c10b2a10b431ab8be6d75a534e Mon Sep 17 00:00:00 2001 From: hongxu Date: Tue, 23 Sep 2025 20:58:57 +0800 Subject: [PATCH] perf: fix reproducibility issue occasionally Due to commit [1] applied in kernel v6.16 (such as qemux86-64), perl has reproducibility issue occasionally. Perf's build process generates two copies of its internal headers, one at tools/lib/perf/include/internal and one at libperf/include/internal with files like core.h. Although the files are identical, the binaries including them would see them at different paths and have different debuginfo data. [2] The reason is the order of include dir `tools/lib/perf/include' and `libperf/include' is not stable, such as $ x86_64-poky-linux-gcc ... \ -Ipath-to/tmp/work/qemux86_64-poky-linux/perf/1.0/sources/perf-1.0/tools/lib/perf/include \ -Ipath-to/tmp/work/qemux86_64-poky-linux/perf/1.0/sources/perf-1.0/libperf/include \ -c -o path-to/tmp/work/qemux86_64-poky-linux/perf/1.0/sources/perf-1.0/libperf/core.o core.c $ recipe-sysroot-native/usr/bin/dwarfsrcfiles sources/perf-1.0/libperf/core.o /usr/src/debug/perf/1.0/tools/lib/perf/core.c ... /usr/src/debug/perf/1.0/tools/lib/perf/include/perf/core.h /usr/src/debug/perf/1.0/tools/lib/perf/include/internal/lib.h ... $ x86_64-poky-linux-gcc ... \ -Ipath-to/tmp/work/qemux86_64-poky-linux/perf/1.0/sources/perf-1.0/libperf/include \ -Ipath-to/tmp/work/qemux86_64-poky-linux/perf/1.0/sources/perf-1.0/tools/lib/perf/include \ -c -o path-to/tmp/work/qemux86_64-poky-linux/perf/1.0/sources/perf-1.0/libperf/core.o core.c $ recipe-sysroot-native/usr/bin/dwarfsrcfiles sources/perf-1.0/libperf/core.o /usr/src/debug/perf/1.0/tools/lib/perf/core.c ... /usr/src/debug/perf/1.0/libperf/include/perf/core.h /usr/src/debug/perf/1.0/libperf/include/internal/lib.h ... This commit explicitly sets the order of these two include dirs in EXTRA_CFLAGS. This commit has no regression for kernel v6.6 (such as genericx86-64) Also enable verbose for compile to trace the detail of build [1] https://github.com/torvalds/linux/commit/f5b07010c13c77541e8ade167d05bef3b8a63739 [2] https://git.openembedded.org/openembedded-core/commit/?id=0a886fcacaab0fbce1306c0f99d482f940a8f705 (From OE-Core rev: e18d697e92b55e57124e80234369d46575226386) Signed-off-by: Hongxu Jia Signed-off-by: Richard Purdie --- meta/recipes-kernel/perf/perf.bb | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/meta/recipes-kernel/perf/perf.bb b/meta/recipes-kernel/perf/perf.bb index e1915207ee..3b9e52fdb8 100644 --- a/meta/recipes-kernel/perf/perf.bb +++ b/meta/recipes-kernel/perf/perf.bb @@ -105,7 +105,7 @@ EXTRA_OEMAKE = '\ LDSHARED="${CC} -shared" \ AR="${AR}" \ LD="${LD}" \ - EXTRA_CFLAGS="-ldw -I${S}" \ + EXTRA_CFLAGS="-ldw -I${S} -I${S}/libperf/include -I${S}/tools/lib/perf/include" \ YFLAGS='-y --file-prefix-map=${WORKDIR}=${TARGET_DBGSRC_DIR}' \ EXTRA_LDFLAGS="${PERF_EXTRA_LDFLAGS}" \ perfexecdir=${libexecdir} \ @@ -174,8 +174,8 @@ do_compile() { # There are two copies of internal headers such as: # libperf/include/internal/xyarray.h and tools/lib/perf/include/internal/xyarray.h # For reproducibile binaries, we need to find one copy, hence force libperf to be created first - oe_runmake ${B}/libperf/libperf.a - oe_runmake all + oe_runmake ${B}/libperf/libperf.a V=1 + oe_runmake all V=1 } do_install() {