* [PATCH v4 00/10] selftests/bpf: Tolerate partial builds across kernel configs
@ 2026-04-06 18:22 Ricardo B. Marlière
2026-04-06 18:22 ` [PATCH v4 01/10] selftests/bpf: Fix test_kmods KDIR to honor O= and distro kernels Ricardo B. Marlière
` (10 more replies)
0 siblings, 11 replies; 13+ messages in thread
From: Ricardo B. Marlière @ 2026-04-06 18:22 UTC (permalink / raw)
To: Andrii Nakryiko, Eduard Zingerman, Alexei Starovoitov,
Daniel Borkmann, Martin KaFai Lau, Kumar Kartikeya Dwivedi,
Song Liu, Yonghong Song, Jiri Olsa, Shuah Khan, Nathan Chancellor,
Nick Desaulniers, Bill Wendling, Justin Stitt
Cc: bpf, linux-kselftest, linux-kernel, llvm,
Ricardo B. Marlière
Currently the BPF selftests can only be built by using the minimum kernel
configuration defined in tools/testing/selftests/bpf/config*. This poses a
problem in distribution kernels that may have some of the flags disabled or
set as module. For example, we have been running the tests regularly in
openSUSE Tumbleweed [1] [2] but to work around this fact we created a
special package [3] that build the tests against an auxiliary vmlinux with
the BPF Kconfig. We keep a list of known issues that may happen due to,
amongst other things, configuration mismatches [4] [5].
The maintenance of this package is far from ideal, especially for
enterprise kernels. The goal of this series is to enable the common usecase
of running the following in any system:
```sh
make -C tools/testing/selftests install \
SKIP_TARGETS= \
TARGETS=bpf \
O=/lib/modules/$(uname -r)/build
```
As an example, the following script targeting a minimal config can be used
for testing:
```sh
make defconfig
scripts/config --file .config \
--enable DEBUG_INFO_DWARF_TOOLCHAIN_DEFAULT \
--enable DEBUG_INFO_BTF \
--enable BPF_SYSCALL \
--enable BPF_JIT
make olddefconfig
make -j$(nproc)
make -j$(nproc) -C tools/testing/selftests SKIP_TARGETS= TARGETS=bpf install
```
This produces a test_progs binary with 579 subtests, against the total of
708. Many of them will still fail or be skipped at runtime due to lack of
symbols, but at least there will be a clear way of building the tests.
[1]: https://openqa.opensuse.org/tests/5811715
[2]: https://openqa.opensuse.org/tests/5811730
[3]: https://src.opensuse.org/rmarliere/kselftests
[4]: https://github.com/openSUSE/kernel-qe/blob/main/kselftests_known_issues.yaml
[5]: https://openqa.opensuse.org/tests/5811730/logfile?filename=run_kselftests-config_mismatches.txt
Assisted-by: {codex,claude}
Signed-off-by: Ricardo B. Marlière <rbm@suse.com>
---
Changes in v4:
- Drop the test_kmods kselftest module flow patch: lib.mk gen_mods_dir
invokes $(MAKE) -C $(TEST_GEN_MODS_DIR) without forwarding
RESOLVE_BTFIDS, breaking ASAN and GCC BPF CI builds (Makefile.modfinal
cannot find resolve_btfids in the kbuild output tree)
- Link to v3:
https://patch.msgid.link/20260406-selftests-bpf_misconfig-v3-0-587a1114263c@suse.com
Changes in v3:
- Split test_kmods patch into two: fix KDIR handling (O= passthrough,
EXTRA_CFLAGS/EXTRA_LDFLAGS clearing) and wire into lib.mk via
TEST_GEN_MODS_DIR
- Pass O= through to the kernel module build so artifacts land in the
output tree, not the source tree
- Clear EXTRA_CFLAGS and EXTRA_LDFLAGS when invoking the kernel build to
prevent host flags (e.g. -static) leaking into module compilation
- Replace the bespoke test_kmods pattern rule with lib.mk module
infrastructure (TEST_GEN_MODS_DIR); lib.mk now drives build and clean
lifecycle
- Make the .ko copy step resilient: emit SKIP instead of failing when a
module is absent
- Expand the uprobe weak stub comment in bpf_cookie.c to explain why
noinline is required
- Link to v2:
https://patch.msgid.link/20260403-selftests-bpf_misconfig-v2-0-f06700380a9d@suse.com
Changes in v2:
- Skip test_kmods build/clean when KDIR directory does not exist
- Use `Module.symvers` instead of `.config` for in-tree detection
- Fix skeleton order-only prereqs commit message
- Guard BTFIDS step when .test.o is absent
- Add `__weak stack_mprotect()` stubs in `bpf_cookie.c` and `iters.c`
- Link to v1:
https://patch.msgid.link/20260401-selftests-bpf_misconfig-v1-0-3ae42c0af76f@suse.com
---
Ricardo B. Marlière (10):
selftests/bpf: Fix test_kmods KDIR to honor O= and distro kernels
selftests/bpf: Tolerate BPF and skeleton generation failures
selftests/bpf: Avoid rebuilds when running emit_tests
selftests/bpf: Make skeleton headers order-only prerequisites of .test.d
selftests/bpf: Tolerate test file compilation failures
selftests/bpf: Allow test_progs to link with a partial object set
selftests/bpf: Tolerate benchmark build failures
selftests/bpf: Provide weak definitions for cross-test functions
selftests/bpf: Skip tests whose objects were not built
selftests/bpf: Tolerate missing files during install
tools/testing/selftests/bpf/Makefile | 113 ++++++++++++++-------
.../testing/selftests/bpf/prog_tests/bpf_cookie.c | 24 ++++-
tools/testing/selftests/bpf/prog_tests/iters.c | 10 +-
tools/testing/selftests/bpf/test_kmods/Makefile | 15 ++-
tools/testing/selftests/bpf/test_progs.c | 7 +-
5 files changed, 120 insertions(+), 49 deletions(-)
---
base-commit: a1aa9ef47c299c5bbc30594d3c2f0589edf908e6
change-id: 20260401-selftests-bpf_misconfig-4c33ef5c56da
Best regards,
--
Ricardo B. Marlière <rbm@suse.com>
^ permalink raw reply [flat|nested] 13+ messages in thread
* [PATCH v4 01/10] selftests/bpf: Fix test_kmods KDIR to honor O= and distro kernels
2026-04-06 18:22 [PATCH v4 00/10] selftests/bpf: Tolerate partial builds across kernel configs Ricardo B. Marlière
@ 2026-04-06 18:22 ` Ricardo B. Marlière
2026-04-06 18:22 ` [PATCH v4 02/10] selftests/bpf: Tolerate BPF and skeleton generation failures Ricardo B. Marlière
` (9 subsequent siblings)
10 siblings, 0 replies; 13+ messages in thread
From: Ricardo B. Marlière @ 2026-04-06 18:22 UTC (permalink / raw)
To: Andrii Nakryiko, Eduard Zingerman, Alexei Starovoitov,
Daniel Borkmann, Martin KaFai Lau, Kumar Kartikeya Dwivedi,
Song Liu, Yonghong Song, Jiri Olsa, Shuah Khan, Nathan Chancellor,
Nick Desaulniers, Bill Wendling, Justin Stitt
Cc: bpf, linux-kselftest, linux-kernel, llvm,
Ricardo B. Marlière
test_kmods/Makefile always pointed KDIR at the kernel source tree root,
ignoring O= and KBUILD_OUTPUT. Module objects were therefore placed
inside the source tree rather than the designated build output directory.
On distro kernels where the source tree has not been built, the Makefile
had no fallback and would fail unconditionally.
When O= or KBUILD_OUTPUT is set, pass it through to the kernel module
build so module artifacts land in the correct output tree. Fall back to
/lib/modules/$(uname -r)/build when neither an explicit build directory
nor an in-tree Module.symvers is present. Guard both all and clean
against a missing KDIR so the step is silently skipped rather than
fatal.
Signed-off-by: Ricardo B. Marlière <rbm@suse.com>
---
tools/testing/selftests/bpf/test_kmods/Makefile | 15 ++++++++++++---
1 file changed, 12 insertions(+), 3 deletions(-)
diff --git a/tools/testing/selftests/bpf/test_kmods/Makefile b/tools/testing/selftests/bpf/test_kmods/Makefile
index 63c4d3f6a12f..b4f86f151a09 100644
--- a/tools/testing/selftests/bpf/test_kmods/Makefile
+++ b/tools/testing/selftests/bpf/test_kmods/Makefile
@@ -1,5 +1,7 @@
TEST_KMOD_DIR := $(realpath $(dir $(abspath $(lastword $(MAKEFILE_LIST)))))
-KDIR ?= $(abspath $(TEST_KMOD_DIR)/../../../../..)
+SRCTREE_KDIR := $(abspath $(TEST_KMOD_DIR)/../../../../..)
+KMOD_O := $(or $(O),$(KBUILD_OUTPUT))
+KDIR ?= $(if $(KMOD_O),$(SRCTREE_KDIR),$(if $(wildcard $(SRCTREE_KDIR)/Module.symvers),$(SRCTREE_KDIR),/lib/modules/$(shell uname -r)/build))
ifeq ($(V),1)
Q =
@@ -14,8 +16,15 @@ $(foreach m,$(MODULES),$(eval obj-m += $(m:.ko=.o)))
CFLAGS_bpf_testmod.o = -I$(src)
+# Ensure KDIR exists, otherwise skip module build and clean.
all:
- $(Q)$(MAKE) -C $(KDIR) M=$(TEST_KMOD_DIR) modules
+ifneq ("$(wildcard $(KDIR))", "")
+ $(Q)$(MAKE) -C $(KDIR) $(if $(KMOD_O),O=$(KMOD_O),KBUILD_OUTPUT=) \
+ M=$(TEST_KMOD_DIR) modules
+endif
clean:
- $(Q)$(MAKE) -C $(KDIR) M=$(TEST_KMOD_DIR) clean
+ifneq ("$(wildcard $(KDIR))", "")
+ $(Q)$(MAKE) -C $(KDIR) $(if $(KMOD_O),O=$(KMOD_O),KBUILD_OUTPUT=) \
+ M=$(TEST_KMOD_DIR) clean
+endif
--
2.53.0
^ permalink raw reply related [flat|nested] 13+ messages in thread
* [PATCH v4 02/10] selftests/bpf: Tolerate BPF and skeleton generation failures
2026-04-06 18:22 [PATCH v4 00/10] selftests/bpf: Tolerate partial builds across kernel configs Ricardo B. Marlière
2026-04-06 18:22 ` [PATCH v4 01/10] selftests/bpf: Fix test_kmods KDIR to honor O= and distro kernels Ricardo B. Marlière
@ 2026-04-06 18:22 ` Ricardo B. Marlière
2026-04-06 18:22 ` [PATCH v4 03/10] selftests/bpf: Avoid rebuilds when running emit_tests Ricardo B. Marlière
` (8 subsequent siblings)
10 siblings, 0 replies; 13+ messages in thread
From: Ricardo B. Marlière @ 2026-04-06 18:22 UTC (permalink / raw)
To: Andrii Nakryiko, Eduard Zingerman, Alexei Starovoitov,
Daniel Borkmann, Martin KaFai Lau, Kumar Kartikeya Dwivedi,
Song Liu, Yonghong Song, Jiri Olsa, Shuah Khan, Nathan Chancellor,
Nick Desaulniers, Bill Wendling, Justin Stitt
Cc: bpf, linux-kselftest, linux-kernel, llvm,
Ricardo B. Marlière
Some BPF programs cannot be built on distro kernels because required BTF
types or features are missing. A single failure currently aborts the
selftests/bpf build.
Make BPF object and skeleton generation best effort: emit SKIP-BPF or
SKIP-SKEL, remove failed outputs so downstream rules can detect absence,
and continue with remaining tests.
Signed-off-by: Ricardo B. Marlière <rbm@suse.com>
---
tools/testing/selftests/bpf/Makefile | 77 ++++++++++++++++++++++++------------
1 file changed, 51 insertions(+), 26 deletions(-)
diff --git a/tools/testing/selftests/bpf/Makefile b/tools/testing/selftests/bpf/Makefile
index f75c4f52c028..6052bba2c157 100644
--- a/tools/testing/selftests/bpf/Makefile
+++ b/tools/testing/selftests/bpf/Makefile
@@ -470,22 +470,26 @@ $(OUTPUT)/cgroup_getset_retval_hooks.o: cgroup_getset_retval_hooks.h
# $4 - binary name
define CLANG_BPF_BUILD_RULE
$(call msg,CLNG-BPF,$4,$2)
- $(Q)$(CLANG) $3 -O2 $(BPF_TARGET_ENDIAN) -c $1 -mcpu=v3 -o $2
+ $(Q)$(CLANG) $3 -O2 $(BPF_TARGET_ENDIAN) -c $1 -mcpu=v3 -o $2 || \
+ ($(RM) $2; printf ' %-12s %s\n' 'SKIP-BPF' '$(notdir $2)' 1>&2)
endef
# Similar to CLANG_BPF_BUILD_RULE, but with disabled alu32
define CLANG_NOALU32_BPF_BUILD_RULE
$(call msg,CLNG-BPF,$4,$2)
- $(Q)$(CLANG) $3 -O2 $(BPF_TARGET_ENDIAN) -c $1 -mcpu=v2 -o $2
+ $(Q)$(CLANG) $3 -O2 $(BPF_TARGET_ENDIAN) -c $1 -mcpu=v2 -o $2 || \
+ ($(RM) $2; printf ' %-12s %s\n' 'SKIP-BPF' '$(notdir $2)' 1>&2)
endef
# Similar to CLANG_BPF_BUILD_RULE, but with cpu-v4
define CLANG_CPUV4_BPF_BUILD_RULE
$(call msg,CLNG-BPF,$4,$2)
- $(Q)$(CLANG) $3 -O2 $(BPF_TARGET_ENDIAN) -c $1 -mcpu=v4 -o $2
+ $(Q)$(CLANG) $3 -O2 $(BPF_TARGET_ENDIAN) -c $1 -mcpu=v4 -o $2 || \
+ ($(RM) $2; printf ' %-12s %s\n' 'SKIP-BPF' '$(notdir $2)' 1>&2)
endef
# Build BPF object using GCC
define GCC_BPF_BUILD_RULE
$(call msg,GCC-BPF,$4,$2)
- $(Q)$(BPF_GCC) $3 -DBPF_NO_PRESERVE_ACCESS_INDEX -Wno-attributes -O2 -c $1 -o $2
+ $(Q)$(BPF_GCC) $3 -DBPF_NO_PRESERVE_ACCESS_INDEX -Wno-attributes -O2 -c $1 -o $2 || \
+ ($(RM) $2; printf ' %-12s %s\n' 'SKIP-BPF' '$(notdir $2)' 1>&2)
endef
SKEL_BLACKLIST := btf__% test_pinning_invalid.c test_sk_assign.c
@@ -591,32 +595,53 @@ $(TRUNNER_BPF_OBJS): $(TRUNNER_OUTPUT)/%.bpf.o: \
$$($$<-$2-CFLAGS),$(TRUNNER_BINARY))
$(TRUNNER_BPF_SKELS): %.skel.h: %.bpf.o $(BPFTOOL) | $(TRUNNER_OUTPUT)
- $$(call msg,GEN-SKEL,$(TRUNNER_BINARY),$$@)
- $(Q)$$(BPFTOOL) gen object $$(<:.o=.linked1.o) $$<
- $(Q)$$(BPFTOOL) gen object $$(<:.o=.linked2.o) $$(<:.o=.linked1.o)
- $(Q)$$(BPFTOOL) gen object $$(<:.o=.linked3.o) $$(<:.o=.linked2.o)
- $(Q)diff $$(<:.o=.linked2.o) $$(<:.o=.linked3.o)
- $(Q)$$(BPFTOOL) gen skeleton $$(<:.o=.linked3.o) name $$(notdir $$(<:.bpf.o=)) > $$@
- $(Q)$$(BPFTOOL) gen subskeleton $$(<:.o=.linked3.o) name $$(notdir $$(<:.bpf.o=)) > $$(@:.skel.h=.subskel.h)
- $(Q)rm -f $$(<:.o=.linked1.o) $$(<:.o=.linked2.o) $$(<:.o=.linked3.o)
+ $(Q)if [ ! -f $$< ]; then \
+ printf ' %-12s %s\n' 'SKIP-SKEL' '$$(notdir $$@)' 1>&2; \
+ exit 0; \
+ fi; \
+ printf ' %-12s %s\n' 'GEN-SKEL' '[$(TRUNNER_BINARY)] $$(notdir $$@)' 1>&2; \
+ $$(BPFTOOL) gen object $$(<:.o=.linked1.o) $$< && \
+ $$(BPFTOOL) gen object $$(<:.o=.linked2.o) $$(<:.o=.linked1.o) && \
+ $$(BPFTOOL) gen object $$(<:.o=.linked3.o) $$(<:.o=.linked2.o) && \
+ diff $$(<:.o=.linked2.o) $$(<:.o=.linked3.o) && \
+ $$(BPFTOOL) gen skeleton $$(<:.o=.linked3.o) name $$(notdir $$(<:.bpf.o=)) > $$@ && \
+ $$(BPFTOOL) gen subskeleton $$(<:.o=.linked3.o) name $$(notdir $$(<:.bpf.o=)) > $$(@:.skel.h=.subskel.h) || { \
+ $$(RM) $$@ $$(@:.skel.h=.subskel.h); \
+ printf ' %-12s %s\n' 'SKIP-SKEL' '$$(notdir $$@)' 1>&2; \
+ }; \
+ rm -f $$(<:.o=.linked1.o) $$(<:.o=.linked2.o) $$(<:.o=.linked3.o)
$(TRUNNER_BPF_LSKELS): %.lskel.h: %.bpf.o $(BPFTOOL) | $(TRUNNER_OUTPUT)
- $$(call msg,GEN-SKEL,$(TRUNNER_BINARY),$$@)
- $(Q)$$(BPFTOOL) gen object $$(<:.o=.llinked1.o) $$<
- $(Q)$$(BPFTOOL) gen object $$(<:.o=.llinked2.o) $$(<:.o=.llinked1.o)
- $(Q)$$(BPFTOOL) gen object $$(<:.o=.llinked3.o) $$(<:.o=.llinked2.o)
- $(Q)diff $$(<:.o=.llinked2.o) $$(<:.o=.llinked3.o)
- $(Q)$$(BPFTOOL) gen skeleton -L $$(<:.o=.llinked3.o) name $$(notdir $$(<:.bpf.o=_lskel)) > $$@
- $(Q)rm -f $$(<:.o=.llinked1.o) $$(<:.o=.llinked2.o) $$(<:.o=.llinked3.o)
+ $(Q)if [ ! -f $$< ]; then \
+ printf ' %-12s %s\n' 'SKIP-SKEL' '$$(notdir $$@)' 1>&2; \
+ exit 0; \
+ fi; \
+ printf ' %-12s %s\n' 'GEN-SKEL' '[$(TRUNNER_BINARY)] $$(notdir $$@)' 1>&2; \
+ $$(BPFTOOL) gen object $$(<:.o=.llinked1.o) $$< && \
+ $$(BPFTOOL) gen object $$(<:.o=.llinked2.o) $$(<:.o=.llinked1.o) && \
+ $$(BPFTOOL) gen object $$(<:.o=.llinked3.o) $$(<:.o=.llinked2.o) && \
+ diff $$(<:.o=.llinked2.o) $$(<:.o=.llinked3.o) && \
+ $$(BPFTOOL) gen skeleton -L $$(<:.o=.llinked3.o) name $$(notdir $$(<:.bpf.o=_lskel)) > $$@ || { \
+ $$(RM) $$@; \
+ printf ' %-12s %s\n' 'SKIP-SKEL' '$$(notdir $$@)' 1>&2; \
+ }; \
+ rm -f $$(<:.o=.llinked1.o) $$(<:.o=.llinked2.o) $$(<:.o=.llinked3.o)
$(TRUNNER_BPF_LSKELS_SIGNED): %.lskel.h: %.bpf.o $(BPFTOOL) | $(TRUNNER_OUTPUT)
- $$(call msg,GEN-SKEL,$(TRUNNER_BINARY) (signed),$$@)
- $(Q)$$(BPFTOOL) gen object $$(<:.o=.llinked1.o) $$<
- $(Q)$$(BPFTOOL) gen object $$(<:.o=.llinked2.o) $$(<:.o=.llinked1.o)
- $(Q)$$(BPFTOOL) gen object $$(<:.o=.llinked3.o) $$(<:.o=.llinked2.o)
- $(Q)diff $$(<:.o=.llinked2.o) $$(<:.o=.llinked3.o)
- $(Q)$$(BPFTOOL) gen skeleton $(LSKEL_SIGN) $$(<:.o=.llinked3.o) name $$(notdir $$(<:.bpf.o=_lskel)) > $$@
- $(Q)rm -f $$(<:.o=.llinked1.o) $$(<:.o=.llinked2.o) $$(<:.o=.llinked3.o)
+ $(Q)if [ ! -f $$< ]; then \
+ printf ' %-12s %s\n' 'SKIP-SKEL' '$$(notdir $$@)' 1>&2; \
+ exit 0; \
+ fi; \
+ printf ' %-12s %s\n' 'GEN-SKEL' '[$(TRUNNER_BINARY) (signed)] $$(notdir $$@)' 1>&2; \
+ $$(BPFTOOL) gen object $$(<:.o=.llinked1.o) $$< && \
+ $$(BPFTOOL) gen object $$(<:.o=.llinked2.o) $$(<:.o=.llinked1.o) && \
+ $$(BPFTOOL) gen object $$(<:.o=.llinked3.o) $$(<:.o=.llinked2.o) && \
+ diff $$(<:.o=.llinked2.o) $$(<:.o=.llinked3.o) && \
+ $$(BPFTOOL) gen skeleton $(LSKEL_SIGN) $$(<:.o=.llinked3.o) name $$(notdir $$(<:.bpf.o=_lskel)) > $$@ || { \
+ $$(RM) $$@; \
+ printf ' %-12s %s\n' 'SKIP-SKEL' '$$(notdir $$@)' 1>&2; \
+ }; \
+ rm -f $$(<:.o=.llinked1.o) $$(<:.o=.llinked2.o) $$(<:.o=.llinked3.o)
$(LINKED_BPF_OBJS): %: $(TRUNNER_OUTPUT)/%
--
2.53.0
^ permalink raw reply related [flat|nested] 13+ messages in thread
* [PATCH v4 03/10] selftests/bpf: Avoid rebuilds when running emit_tests
2026-04-06 18:22 [PATCH v4 00/10] selftests/bpf: Tolerate partial builds across kernel configs Ricardo B. Marlière
2026-04-06 18:22 ` [PATCH v4 01/10] selftests/bpf: Fix test_kmods KDIR to honor O= and distro kernels Ricardo B. Marlière
2026-04-06 18:22 ` [PATCH v4 02/10] selftests/bpf: Tolerate BPF and skeleton generation failures Ricardo B. Marlière
@ 2026-04-06 18:22 ` Ricardo B. Marlière
2026-04-06 18:22 ` [PATCH v4 04/10] selftests/bpf: Make skeleton headers order-only prerequisites of .test.d Ricardo B. Marlière
` (7 subsequent siblings)
10 siblings, 0 replies; 13+ messages in thread
From: Ricardo B. Marlière @ 2026-04-06 18:22 UTC (permalink / raw)
To: Andrii Nakryiko, Eduard Zingerman, Alexei Starovoitov,
Daniel Borkmann, Martin KaFai Lau, Kumar Kartikeya Dwivedi,
Song Liu, Yonghong Song, Jiri Olsa, Shuah Khan, Nathan Chancellor,
Nick Desaulniers, Bill Wendling, Justin Stitt
Cc: bpf, linux-kselftest, linux-kernel, llvm,
Ricardo B. Marlière
emit_tests is used while installing selftests to generate the kselftest
list. Pulling in .d files for this goal can trigger BPF rebuild rules and
mix build output into list generation.
Skip dependency file inclusion for emit_tests, like clean goals, so list
generation stays side-effect free.
Signed-off-by: Ricardo B. Marlière <rbm@suse.com>
---
tools/testing/selftests/bpf/Makefile | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/tools/testing/selftests/bpf/Makefile b/tools/testing/selftests/bpf/Makefile
index 6052bba2c157..781238152c4f 100644
--- a/tools/testing/selftests/bpf/Makefile
+++ b/tools/testing/selftests/bpf/Makefile
@@ -703,7 +703,7 @@ $(TRUNNER_TEST_OBJS:.o=.d): $(TRUNNER_OUTPUT)/%.test.d: \
$(TRUNNER_BPF_SKELS_LINKED) \
$$(BPFOBJ) | $(TRUNNER_OUTPUT)
-ifeq ($(filter clean docs-clean,$(MAKECMDGOALS)),)
+ifeq ($(filter clean docs-clean emit_tests,$(MAKECMDGOALS)),)
include $(wildcard $(TRUNNER_TEST_OBJS:.o=.d))
endif
--
2.53.0
^ permalink raw reply related [flat|nested] 13+ messages in thread
* [PATCH v4 04/10] selftests/bpf: Make skeleton headers order-only prerequisites of .test.d
2026-04-06 18:22 [PATCH v4 00/10] selftests/bpf: Tolerate partial builds across kernel configs Ricardo B. Marlière
` (2 preceding siblings ...)
2026-04-06 18:22 ` [PATCH v4 03/10] selftests/bpf: Avoid rebuilds when running emit_tests Ricardo B. Marlière
@ 2026-04-06 18:22 ` Ricardo B. Marlière
2026-04-06 18:22 ` [PATCH v4 05/10] selftests/bpf: Tolerate test file compilation failures Ricardo B. Marlière
` (6 subsequent siblings)
10 siblings, 0 replies; 13+ messages in thread
From: Ricardo B. Marlière @ 2026-04-06 18:22 UTC (permalink / raw)
To: Andrii Nakryiko, Eduard Zingerman, Alexei Starovoitov,
Daniel Borkmann, Martin KaFai Lau, Kumar Kartikeya Dwivedi,
Song Liu, Yonghong Song, Jiri Olsa, Shuah Khan, Nathan Chancellor,
Nick Desaulniers, Bill Wendling, Justin Stitt
Cc: bpf, linux-kselftest, linux-kernel, llvm,
Ricardo B. Marlière
The .test.d dependency files are generated by the C preprocessor and list
the headers each test file actually #includes. Skeleton headers appear in
those generated lists, so the .test.o -> .skel.h dependency is already
tracked by the .d file content.
Making skeletons order-only prerequisites of .test.d means that a missing
or skipped skeleton does not prevent .test.d generation, and regenerating
a skeleton does not force .test.d to be recreated. This avoids unnecessary
recompilation and, more importantly, avoids build errors when a skeleton
was intentionally skipped due to a BPF compilation failure.
Signed-off-by: Ricardo B. Marlière <rbm@suse.com>
---
tools/testing/selftests/bpf/Makefile | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/tools/testing/selftests/bpf/Makefile b/tools/testing/selftests/bpf/Makefile
index 781238152c4f..72f576a8236a 100644
--- a/tools/testing/selftests/bpf/Makefile
+++ b/tools/testing/selftests/bpf/Makefile
@@ -697,11 +697,11 @@ $(TRUNNER_TEST_OBJS): $(TRUNNER_OUTPUT)/%.test.o: \
$(TRUNNER_TEST_OBJS:.o=.d): $(TRUNNER_OUTPUT)/%.test.d: \
$(TRUNNER_TESTS_DIR)/%.c \
$(TRUNNER_EXTRA_HDRS) \
+ $$(BPFOBJ) | $(TRUNNER_OUTPUT) \
$(TRUNNER_BPF_SKELS) \
$(TRUNNER_BPF_LSKELS) \
$(TRUNNER_BPF_LSKELS_SIGNED) \
- $(TRUNNER_BPF_SKELS_LINKED) \
- $$(BPFOBJ) | $(TRUNNER_OUTPUT)
+ $(TRUNNER_BPF_SKELS_LINKED)
ifeq ($(filter clean docs-clean emit_tests,$(MAKECMDGOALS)),)
include $(wildcard $(TRUNNER_TEST_OBJS:.o=.d))
--
2.53.0
^ permalink raw reply related [flat|nested] 13+ messages in thread
* [PATCH v4 05/10] selftests/bpf: Tolerate test file compilation failures
2026-04-06 18:22 [PATCH v4 00/10] selftests/bpf: Tolerate partial builds across kernel configs Ricardo B. Marlière
` (3 preceding siblings ...)
2026-04-06 18:22 ` [PATCH v4 04/10] selftests/bpf: Make skeleton headers order-only prerequisites of .test.d Ricardo B. Marlière
@ 2026-04-06 18:22 ` Ricardo B. Marlière
2026-04-06 18:22 ` [PATCH v4 06/10] selftests/bpf: Allow test_progs to link with a partial object set Ricardo B. Marlière
` (5 subsequent siblings)
10 siblings, 0 replies; 13+ messages in thread
From: Ricardo B. Marlière @ 2026-04-06 18:22 UTC (permalink / raw)
To: Andrii Nakryiko, Eduard Zingerman, Alexei Starovoitov,
Daniel Borkmann, Martin KaFai Lau, Kumar Kartikeya Dwivedi,
Song Liu, Yonghong Song, Jiri Olsa, Shuah Khan, Nathan Chancellor,
Nick Desaulniers, Bill Wendling, Justin Stitt
Cc: bpf, linux-kselftest, linux-kernel, llvm,
Ricardo B. Marlière
Individual test files may fail to compile when headers or kernel features
required by that test are absent. Currently this aborts the entire build.
Make the per-test compilation non-fatal: remove the output object on
failure and print a SKIP-TEST marker to stderr. Guard the BTFIDS
post-processing step so it is skipped when the object file is absent.
The linker step will later ignore absent objects, allowing the remaining
tests to build and run.
Use plain printf and $(Q) instead of $(call msg,...) in the BTFIDS block:
the msg macro expands to @printf which is a make-recipe construct and is
invalid as a shell command inside an if-then-fi body; $(Q) restores
echo suppression at the recipe level where it is meaningful.
Signed-off-by: Ricardo B. Marlière <rbm@suse.com>
---
tools/testing/selftests/bpf/Makefile | 9 ++++++---
1 file changed, 6 insertions(+), 3 deletions(-)
diff --git a/tools/testing/selftests/bpf/Makefile b/tools/testing/selftests/bpf/Makefile
index 72f576a8236a..e67f9c4cb5d7 100644
--- a/tools/testing/selftests/bpf/Makefile
+++ b/tools/testing/selftests/bpf/Makefile
@@ -688,11 +688,14 @@ $(TRUNNER_TEST_OBJS): $(TRUNNER_OUTPUT)/%.test.o: \
$(TRUNNER_TESTS_DIR)/%.c \
| $(TRUNNER_OUTPUT)/%.test.d
$$(call msg,TEST-OBJ,$(TRUNNER_BINARY),$$@)
- $(Q)cd $$(@D) && $$(CC) -I. $$(CFLAGS) -MMD -MT $$@ -c $(CURDIR)/$$< $$(LDLIBS) -o $$(@F)
+ $(Q)cd $$(@D) && $$(CC) -I. $$(CFLAGS) -MMD -MT $$@ -c $(CURDIR)/$$< $$(LDLIBS) -o $$(@F) || \
+ ($(RM) $$(@F); printf ' %-12s %s\n' 'SKIP-TEST' '$$(notdir $$@)' 1>&2)
$$(if $$(TEST_NEEDS_BTFIDS), \
- $$(call msg,BTFIDS,$(TRUNNER_BINARY),$$@) \
+ $(Q)if [ -f $$@ ]; then \
+ printf ' %-8s%s %s\n' "BTFIDS" " [$(TRUNNER_BINARY)]" "$$(notdir $$@)"; \
$(RESOLVE_BTFIDS) --btf $(TRUNNER_OUTPUT)/btf_data.bpf.o $$@; \
- $(RESOLVE_BTFIDS) --patch_btfids $$@.BTF_ids $$@)
+ $(RESOLVE_BTFIDS) --patch_btfids $$@.BTF_ids $$@; \
+ fi)
$(TRUNNER_TEST_OBJS:.o=.d): $(TRUNNER_OUTPUT)/%.test.d: \
$(TRUNNER_TESTS_DIR)/%.c \
--
2.53.0
^ permalink raw reply related [flat|nested] 13+ messages in thread
* [PATCH v4 06/10] selftests/bpf: Allow test_progs to link with a partial object set
2026-04-06 18:22 [PATCH v4 00/10] selftests/bpf: Tolerate partial builds across kernel configs Ricardo B. Marlière
` (4 preceding siblings ...)
2026-04-06 18:22 ` [PATCH v4 05/10] selftests/bpf: Tolerate test file compilation failures Ricardo B. Marlière
@ 2026-04-06 18:22 ` Ricardo B. Marlière
2026-04-06 18:22 ` [PATCH v4 07/10] selftests/bpf: Tolerate benchmark build failures Ricardo B. Marlière
` (4 subsequent siblings)
10 siblings, 0 replies; 13+ messages in thread
From: Ricardo B. Marlière @ 2026-04-06 18:22 UTC (permalink / raw)
To: Andrii Nakryiko, Eduard Zingerman, Alexei Starovoitov,
Daniel Borkmann, Martin KaFai Lau, Kumar Kartikeya Dwivedi,
Song Liu, Yonghong Song, Jiri Olsa, Shuah Khan, Nathan Chancellor,
Nick Desaulniers, Bill Wendling, Justin Stitt
Cc: bpf, linux-kselftest, linux-kernel, llvm,
Ricardo B. Marlière
When individual test files are skipped due to compilation failures, their
.test.o files are absent. The linker step currently lists all expected
.test.o files as explicit prerequisites, so make considers any missing one
an error.
Move TRUNNER_TEST_OBJS to the order-only prerequisite list so that their
absence does not prevent linking. Use $(wildcard ...) in the filter
expression passed to the linker so that only the objects that were actually
built are linked in.
Place the wildcard expansion before $^ in the filter to preserve the
original link order: test objects must precede libbpf.a so that GNU ld,
which scans static archives left-to-right, pulls in archive members that
are referenced exclusively by test objects (e.g. ring_buffer__new from
ringbuf.c).
Signed-off-by: Ricardo B. Marlière <rbm@suse.com>
---
tools/testing/selftests/bpf/Makefile | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/tools/testing/selftests/bpf/Makefile b/tools/testing/selftests/bpf/Makefile
index e67f9c4cb5d7..a12bc9d76f8e 100644
--- a/tools/testing/selftests/bpf/Makefile
+++ b/tools/testing/selftests/bpf/Makefile
@@ -738,14 +738,14 @@ endif
# some X.test.o files have runtime dependencies on Y.bpf.o files
$(OUTPUT)/$(TRUNNER_BINARY): | $(TRUNNER_BPF_OBJS)
-$(OUTPUT)/$(TRUNNER_BINARY): $(TRUNNER_TEST_OBJS) \
- $(TRUNNER_EXTRA_OBJS) $$(BPFOBJ) \
+$(OUTPUT)/$(TRUNNER_BINARY): $(TRUNNER_EXTRA_OBJS) $$(BPFOBJ) \
$(TRUNNER_LIB_OBJS) \
$(TRUNNER_BPFTOOL) \
$(OUTPUT)/veristat \
- | $(TRUNNER_BINARY)-extras
+ | $(TRUNNER_BINARY)-extras \
+ $(TRUNNER_TEST_OBJS)
$$(call msg,BINARY,,$$@)
- $(Q)$$(CC) $$(CFLAGS) $$(filter %.a %.o,$$^) $$(LDLIBS) $$(LLVM_LDLIBS) $$(LDFLAGS) $$(LLVM_LDFLAGS) -o $$@
+ $(Q)$$(CC) $$(CFLAGS) $$(filter %.a %.o,$$(wildcard $(TRUNNER_TEST_OBJS)) $$^) $$(LDLIBS) $$(LLVM_LDLIBS) $$(LDFLAGS) $$(LLVM_LDFLAGS) -o $$@
$(Q)ln -sf $(if $2,..,.)/tools/build/bpftool/$(USE_BOOTSTRAP)bpftool \
$(OUTPUT)/$(if $2,$2/)bpftool
--
2.53.0
^ permalink raw reply related [flat|nested] 13+ messages in thread
* [PATCH v4 07/10] selftests/bpf: Tolerate benchmark build failures
2026-04-06 18:22 [PATCH v4 00/10] selftests/bpf: Tolerate partial builds across kernel configs Ricardo B. Marlière
` (5 preceding siblings ...)
2026-04-06 18:22 ` [PATCH v4 06/10] selftests/bpf: Allow test_progs to link with a partial object set Ricardo B. Marlière
@ 2026-04-06 18:22 ` Ricardo B. Marlière
2026-04-06 18:22 ` [PATCH v4 08/10] selftests/bpf: Provide weak definitions for cross-test functions Ricardo B. Marlière
` (3 subsequent siblings)
10 siblings, 0 replies; 13+ messages in thread
From: Ricardo B. Marlière @ 2026-04-06 18:22 UTC (permalink / raw)
To: Andrii Nakryiko, Eduard Zingerman, Alexei Starovoitov,
Daniel Borkmann, Martin KaFai Lau, Kumar Kartikeya Dwivedi,
Song Liu, Yonghong Song, Jiri Olsa, Shuah Khan, Nathan Chancellor,
Nick Desaulniers, Bill Wendling, Justin Stitt
Cc: bpf, linux-kselftest, linux-kernel, llvm,
Ricardo B. Marlière
Benchmark objects depend on skeletons that may be missing when some BPF
programs fail to build. In that case, benchmark object compilation or final
bench linking should not abort the full selftests/bpf build.
Keep both steps non-fatal, emit SKIP-BENCH or SKIP-LINK, and remove failed
outputs so stale objects or binaries are not reused by later incremental
builds.
Signed-off-by: Ricardo B. Marlière <rbm@suse.com>
---
tools/testing/selftests/bpf/Makefile | 6 ++++--
1 file changed, 4 insertions(+), 2 deletions(-)
diff --git a/tools/testing/selftests/bpf/Makefile b/tools/testing/selftests/bpf/Makefile
index a12bc9d76f8e..2b0747604d5f 100644
--- a/tools/testing/selftests/bpf/Makefile
+++ b/tools/testing/selftests/bpf/Makefile
@@ -875,7 +875,8 @@ $(OUTPUT)/test_cpp: test_cpp.cpp $(OUTPUT)/test_core_extern.skel.h $(BPFOBJ)
# Benchmark runner
$(OUTPUT)/bench_%.o: benchs/bench_%.c bench.h $(BPFOBJ)
$(call msg,CC,,$@)
- $(Q)$(CC) $(CFLAGS) -O2 -c $(filter %.c,$^) $(LDLIBS) -o $@
+ $(Q)$(CC) $(CFLAGS) -O2 -c $(filter %.c,$^) $(LDLIBS) -o $@ || \
+ ($(RM) $@; printf ' %-12s %s\n' 'SKIP-BENCH' '$(notdir $@)' 1>&2)
$(OUTPUT)/bench_rename.o: $(OUTPUT)/test_overhead.skel.h
$(OUTPUT)/bench_trigger.o: $(OUTPUT)/trigger_bench.skel.h
$(OUTPUT)/bench_ringbufs.o: $(OUTPUT)/ringbuf_bench.skel.h \
@@ -918,7 +919,8 @@ $(OUTPUT)/bench: $(OUTPUT)/bench.o \
$(OUTPUT)/usdt_2.o \
#
$(call msg,BINARY,,$@)
- $(Q)$(CC) $(CFLAGS) $(LDFLAGS) $(filter %.a %.o,$^) $(LDLIBS) -o $@
+ $(Q)$(CC) $(CFLAGS) $(LDFLAGS) $(filter %.a %.o,$(wildcard $^)) $(LDLIBS) -o $@ || \
+ ($(RM) $@; printf ' %-12s %s\n' 'SKIP-LINK' '$(notdir $@) (some benchmarks may have been skipped)' 1>&2)
# This works around GCC warning about snprintf truncating strings like:
#
--
2.53.0
^ permalink raw reply related [flat|nested] 13+ messages in thread
* [PATCH v4 08/10] selftests/bpf: Provide weak definitions for cross-test functions
2026-04-06 18:22 [PATCH v4 00/10] selftests/bpf: Tolerate partial builds across kernel configs Ricardo B. Marlière
` (6 preceding siblings ...)
2026-04-06 18:22 ` [PATCH v4 07/10] selftests/bpf: Tolerate benchmark build failures Ricardo B. Marlière
@ 2026-04-06 18:22 ` Ricardo B. Marlière
2026-04-06 18:22 ` [PATCH v4 09/10] selftests/bpf: Skip tests whose objects were not built Ricardo B. Marlière
` (2 subsequent siblings)
10 siblings, 0 replies; 13+ messages in thread
From: Ricardo B. Marlière @ 2026-04-06 18:22 UTC (permalink / raw)
To: Andrii Nakryiko, Eduard Zingerman, Alexei Starovoitov,
Daniel Borkmann, Martin KaFai Lau, Kumar Kartikeya Dwivedi,
Song Liu, Yonghong Song, Jiri Olsa, Shuah Khan, Nathan Chancellor,
Nick Desaulniers, Bill Wendling, Justin Stitt
Cc: bpf, linux-kselftest, linux-kernel, llvm,
Ricardo B. Marlière
Some test files reference functions defined in other test translation
units. When those units are not compiled (e.g. because a BPF skeleton
could not be generated), the link step fails with undefined references.
Replace forward declarations with weak stub definitions for:
- uprobe_multi_func_{1,2,3}() in bpf_cookie.c (defined in
uprobe_multi_test.c)
- stack_mprotect() in bpf_cookie.c and iters.c (defined in test_lsm.c)
The linker will prefer the strong definitions from the original objects
when they are present, and fall back to the stubs otherwise.
The uprobe stubs are marked noinline because uprobe_multi_test_run()
takes their addresses directly to configure the BPF program's uprobe
attachment points. An inlined function has no stable address in the
binary, which would cause the attachment to probe the wrong location.
Signed-off-by: Ricardo B. Marlière <rbm@suse.com>
---
.../testing/selftests/bpf/prog_tests/bpf_cookie.c | 24 +++++++++++++++++-----
tools/testing/selftests/bpf/prog_tests/iters.c | 10 ++++++++-
2 files changed, 28 insertions(+), 6 deletions(-)
diff --git a/tools/testing/selftests/bpf/prog_tests/bpf_cookie.c b/tools/testing/selftests/bpf/prog_tests/bpf_cookie.c
index 35adc3f6d443..5fc6b2cd0bb9 100644
--- a/tools/testing/selftests/bpf/prog_tests/bpf_cookie.c
+++ b/tools/testing/selftests/bpf/prog_tests/bpf_cookie.c
@@ -252,10 +252,17 @@ static void kprobe_multi_attach_api_subtest(void)
kprobe_multi__destroy(skel);
}
-/* defined in prog_tests/uprobe_multi_test.c */
-void uprobe_multi_func_1(void);
-void uprobe_multi_func_2(void);
-void uprobe_multi_func_3(void);
+/*
+ * Weak uprobe target stubs. noinline is required because
+ * uprobe_multi_test_run() takes their addresses to configure the BPF
+ * program's attachment points; an inlined function has no stable
+ * address in the binary to probe. The strong definitions in
+ * uprobe_multi_test.c take precedence when that translation unit is
+ * linked.
+ */
+noinline __weak void uprobe_multi_func_1(void) {}
+noinline __weak void uprobe_multi_func_2(void) {}
+noinline __weak void uprobe_multi_func_3(void) {}
static void uprobe_multi_test_run(struct uprobe_multi *skel)
{
@@ -574,7 +581,14 @@ static void tracing_subtest(struct test_bpf_cookie *skel)
close(fmod_ret_fd);
}
-int stack_mprotect(void);
+/*
+ * Weak stub for stack_mprotect(); the real definition lives in
+ * test_lsm.c and takes precedence when that object is linked in.
+ */
+__weak int stack_mprotect(void)
+{
+ return 0;
+}
static void lsm_subtest(struct test_bpf_cookie *skel)
{
diff --git a/tools/testing/selftests/bpf/prog_tests/iters.c b/tools/testing/selftests/bpf/prog_tests/iters.c
index a539980a2fbe..6888bc9173fd 100644
--- a/tools/testing/selftests/bpf/prog_tests/iters.c
+++ b/tools/testing/selftests/bpf/prog_tests/iters.c
@@ -7,6 +7,7 @@
#include <unistd.h>
#include <malloc.h>
#include <stdlib.h>
+#include <linux/compiler.h>
#include <test_progs.h>
#include "cgroup_helpers.h"
@@ -202,7 +203,14 @@ static void subtest_task_iters(void)
iters_task__destroy(skel);
}
-extern int stack_mprotect(void);
+/*
+ * Weak stub for stack_mprotect(); the real definition lives in
+ * test_lsm.c and takes precedence when that object is linked in.
+ */
+__weak int stack_mprotect(void)
+{
+ return 0;
+}
static void subtest_css_task_iters(void)
{
--
2.53.0
^ permalink raw reply related [flat|nested] 13+ messages in thread
* [PATCH v4 09/10] selftests/bpf: Skip tests whose objects were not built
2026-04-06 18:22 [PATCH v4 00/10] selftests/bpf: Tolerate partial builds across kernel configs Ricardo B. Marlière
` (7 preceding siblings ...)
2026-04-06 18:22 ` [PATCH v4 08/10] selftests/bpf: Provide weak definitions for cross-test functions Ricardo B. Marlière
@ 2026-04-06 18:22 ` Ricardo B. Marlière
2026-04-06 18:22 ` [PATCH v4 10/10] selftests/bpf: Tolerate missing files during install Ricardo B. Marlière
2026-04-10 10:06 ` [PATCH v4 00/10] selftests/bpf: Tolerate partial builds across kernel configs Alan Maguire
10 siblings, 0 replies; 13+ messages in thread
From: Ricardo B. Marlière @ 2026-04-06 18:22 UTC (permalink / raw)
To: Andrii Nakryiko, Eduard Zingerman, Alexei Starovoitov,
Daniel Borkmann, Martin KaFai Lau, Kumar Kartikeya Dwivedi,
Song Liu, Yonghong Song, Jiri Olsa, Shuah Khan, Nathan Chancellor,
Nick Desaulniers, Bill Wendling, Justin Stitt
Cc: bpf, linux-kselftest, linux-kernel, llvm,
Ricardo B. Marlière
When Kconfig options or missing headers cause a .test.o not to be
compiled, the corresponding prog_test_def entry in tests.h has NULL
for both run_test and run_serial_test. The existing infrastructure
check treats this case as a fatal coding error and calls exit().
Separate the two failure modes: having both function pointers non-NULL
is a genuine coding error and remains fatal. Having both NULL means
the test object was intentionally omitted from the build; mark it
should_run=false and continue so that the remaining tests are
unaffected.
Signed-off-by: Ricardo B. Marlière <rbm@suse.com>
---
tools/testing/selftests/bpf/test_progs.c | 7 +++++--
1 file changed, 5 insertions(+), 2 deletions(-)
diff --git a/tools/testing/selftests/bpf/test_progs.c b/tools/testing/selftests/bpf/test_progs.c
index 0929f4a7bda4..85ac25a51a8d 100644
--- a/tools/testing/selftests/bpf/test_progs.c
+++ b/tools/testing/selftests/bpf/test_progs.c
@@ -2022,12 +2022,15 @@ int main(int argc, char **argv)
test->should_run = should_run(&env.test_selector,
test->test_num, test->test_name);
- if ((test->run_test == NULL && test->run_serial_test == NULL) ||
- (test->run_test != NULL && test->run_serial_test != NULL)) {
+ if (test->run_test && test->run_serial_test) {
fprintf(stderr, "Test %d:%s must have either test_%s() or serial_test_%sl() defined.\n",
test->test_num, test->test_name, test->test_name, test->test_name);
exit(EXIT_ERR_SETUP_INFRA);
}
+ if (!test->run_test && !test->run_serial_test) {
+ test->should_run = false;
+ continue;
+ }
if (test->should_run)
test->should_tmon = should_tmon(&env.tmon_selector, test->test_name);
}
--
2.53.0
^ permalink raw reply related [flat|nested] 13+ messages in thread
* [PATCH v4 10/10] selftests/bpf: Tolerate missing files during install
2026-04-06 18:22 [PATCH v4 00/10] selftests/bpf: Tolerate partial builds across kernel configs Ricardo B. Marlière
` (8 preceding siblings ...)
2026-04-06 18:22 ` [PATCH v4 09/10] selftests/bpf: Skip tests whose objects were not built Ricardo B. Marlière
@ 2026-04-06 18:22 ` Ricardo B. Marlière
2026-04-10 10:06 ` [PATCH v4 00/10] selftests/bpf: Tolerate partial builds across kernel configs Alan Maguire
10 siblings, 0 replies; 13+ messages in thread
From: Ricardo B. Marlière @ 2026-04-06 18:22 UTC (permalink / raw)
To: Andrii Nakryiko, Eduard Zingerman, Alexei Starovoitov,
Daniel Borkmann, Martin KaFai Lau, Kumar Kartikeya Dwivedi,
Song Liu, Yonghong Song, Jiri Olsa, Shuah Khan, Nathan Chancellor,
Nick Desaulniers, Bill Wendling, Justin Stitt
Cc: bpf, linux-kselftest, linux-kernel, llvm,
Ricardo B. Marlière
With partial builds, some TEST_GEN_FILES entries can be absent at install
time. rsync treats missing source arguments as fatal and aborts kselftest
installation.
Override INSTALL_SINGLE_RULE in selftests/bpf to use --ignore-missing-args,
while keeping the existing bpf-specific INSTALL_RULE extension logic.
Signed-off-by: Ricardo B. Marlière <rbm@suse.com>
---
tools/testing/selftests/bpf/Makefile | 7 +++++++
1 file changed, 7 insertions(+)
diff --git a/tools/testing/selftests/bpf/Makefile b/tools/testing/selftests/bpf/Makefile
index 2b0747604d5f..e1c100f1ef36 100644
--- a/tools/testing/selftests/bpf/Makefile
+++ b/tools/testing/selftests/bpf/Makefile
@@ -953,6 +953,13 @@ EXTRA_CLEAN := $(SCRATCH_DIR) $(HOST_SCRATCH_DIR) \
# Delete partially updated (corrupted) files on error
.DELETE_ON_ERROR:
+# Some generated files might be absent when only a subset of BPF objects
+# could be built. Tell rsync to ignore missing source arguments.
+override define INSTALL_SINGLE_RULE
+ $(if $(INSTALL_LIST),@mkdir -p $(INSTALL_PATH))
+ $(if $(INSTALL_LIST),rsync -a --copy-unsafe-links --ignore-missing-args $(INSTALL_LIST) $(INSTALL_PATH)/)
+endef
+
DEFAULT_INSTALL_RULE := $(INSTALL_RULE)
override define INSTALL_RULE
$(DEFAULT_INSTALL_RULE)
--
2.53.0
^ permalink raw reply related [flat|nested] 13+ messages in thread
* Re: [PATCH v4 00/10] selftests/bpf: Tolerate partial builds across kernel configs
2026-04-06 18:22 [PATCH v4 00/10] selftests/bpf: Tolerate partial builds across kernel configs Ricardo B. Marlière
` (9 preceding siblings ...)
2026-04-06 18:22 ` [PATCH v4 10/10] selftests/bpf: Tolerate missing files during install Ricardo B. Marlière
@ 2026-04-10 10:06 ` Alan Maguire
2026-04-10 13:57 ` Ricardo B. Marlière
10 siblings, 1 reply; 13+ messages in thread
From: Alan Maguire @ 2026-04-10 10:06 UTC (permalink / raw)
To: Ricardo B. Marlière, Andrii Nakryiko, Eduard Zingerman,
Alexei Starovoitov, Daniel Borkmann, Martin KaFai Lau,
Kumar Kartikeya Dwivedi, Song Liu, Yonghong Song, Jiri Olsa,
Shuah Khan, Nathan Chancellor, Nick Desaulniers, Bill Wendling,
Justin Stitt
Cc: bpf, linux-kselftest, linux-kernel, llvm
On 06/04/2026 19:22, Ricardo B. Marlière wrote:
> Currently the BPF selftests can only be built by using the minimum kernel
> configuration defined in tools/testing/selftests/bpf/config*. This poses a
> problem in distribution kernels that may have some of the flags disabled or
> set as module. For example, we have been running the tests regularly in
> openSUSE Tumbleweed [1] [2] but to work around this fact we created a
> special package [3] that build the tests against an auxiliary vmlinux with
> the BPF Kconfig. We keep a list of known issues that may happen due to,
> amongst other things, configuration mismatches [4] [5].
>
> The maintenance of this package is far from ideal, especially for
> enterprise kernels. The goal of this series is to enable the common usecase
> of running the following in any system:
>
> ```sh
> make -C tools/testing/selftests install \
> SKIP_TARGETS= \
> TARGETS=bpf \
> O=/lib/modules/$(uname -r)/build
> ```
>
> As an example, the following script targeting a minimal config can be used
> for testing:
>
> ```sh
> make defconfig
> scripts/config --file .config \
> --enable DEBUG_INFO_DWARF_TOOLCHAIN_DEFAULT \
> --enable DEBUG_INFO_BTF \
> --enable BPF_SYSCALL \
> --enable BPF_JIT
> make olddefconfig
> make -j$(nproc)
> make -j$(nproc) -C tools/testing/selftests SKIP_TARGETS= TARGETS=bpf install
> ```
>
> This produces a test_progs binary with 579 subtests, against the total of
> 708. Many of them will still fail or be skipped at runtime due to lack of
> symbols, but at least there will be a clear way of building the tests.
>
hi Ricardo, I've been looking at this series and one concern I had was if
tolerating failures to build with incomplete config would create problems
in detecting failures when the config is complete, i.e. in BPF CI. So for
example if say a BPF skeleton didn't compile when it really should due to
an introduced bug, we wouldn't want to drive on in all cases.
However, from what I can see, CI held up well with these changes in place [1].
That said it might be nice to preserve a "strict" mode which fails when
we hit compilation issues etc, failing as we do today; I couldn't find any existing
general kselftest concept that fits with that but it would be valuable I think
if possible. Perhaps we could default to non-strict mode when a make -C is initiated
or something like that, and continue to operate strictly when building directly
in tools/testing/selftests/bpf?
I ran the changes through the usual workflow I use - build bpf selftests at
tools/testing/selftests/bpf level and run ./test_progs ; no regressions were
observed, so feel free to add for the series
Tested-by: Alan Maguire <alan.maguire@oracle.com>
There are some comments on sashiko.dev [2] that would be worth looking through
too, in particular the concern about O= and M= mentioned for patch 1.
[1] https://github.com/kernel-patches/bpf/actions/runs/24168181680
[2] https://sashiko.dev/#/patchset/20260406-selftests-bpf_misconfig-v4-0-9914f50efdf7%40suse.com
> [1]: https://openqa.opensuse.org/tests/5811715
> [2]: https://openqa.opensuse.org/tests/5811730
> [3]: https://src.opensuse.org/rmarliere/kselftests
> [4]: https://github.com/openSUSE/kernel-qe/blob/main/kselftests_known_issues.yaml
> [5]: https://openqa.opensuse.org/tests/5811730/logfile?filename=run_kselftests-config_mismatches.txt
>
> Assisted-by: {codex,claude}
> Signed-off-by: Ricardo B. Marlière <rbm@suse.com>
> ---
> Changes in v4:
> - Drop the test_kmods kselftest module flow patch: lib.mk gen_mods_dir
> invokes $(MAKE) -C $(TEST_GEN_MODS_DIR) without forwarding
> RESOLVE_BTFIDS, breaking ASAN and GCC BPF CI builds (Makefile.modfinal
> cannot find resolve_btfids in the kbuild output tree)
> - Link to v3:
> https://patch.msgid.link/20260406-selftests-bpf_misconfig-v3-0-587a1114263c@suse.com
>
> Changes in v3:
> - Split test_kmods patch into two: fix KDIR handling (O= passthrough,
> EXTRA_CFLAGS/EXTRA_LDFLAGS clearing) and wire into lib.mk via
> TEST_GEN_MODS_DIR
> - Pass O= through to the kernel module build so artifacts land in the
> output tree, not the source tree
> - Clear EXTRA_CFLAGS and EXTRA_LDFLAGS when invoking the kernel build to
> prevent host flags (e.g. -static) leaking into module compilation
> - Replace the bespoke test_kmods pattern rule with lib.mk module
> infrastructure (TEST_GEN_MODS_DIR); lib.mk now drives build and clean
> lifecycle
> - Make the .ko copy step resilient: emit SKIP instead of failing when a
> module is absent
> - Expand the uprobe weak stub comment in bpf_cookie.c to explain why
> noinline is required
> - Link to v2:
> https://patch.msgid.link/20260403-selftests-bpf_misconfig-v2-0-f06700380a9d@suse.com
>
> Changes in v2:
> - Skip test_kmods build/clean when KDIR directory does not exist
> - Use `Module.symvers` instead of `.config` for in-tree detection
> - Fix skeleton order-only prereqs commit message
> - Guard BTFIDS step when .test.o is absent
> - Add `__weak stack_mprotect()` stubs in `bpf_cookie.c` and `iters.c`
> - Link to v1:
> https://patch.msgid.link/20260401-selftests-bpf_misconfig-v1-0-3ae42c0af76f@suse.com
>
> ---
> Ricardo B. Marlière (10):
> selftests/bpf: Fix test_kmods KDIR to honor O= and distro kernels
> selftests/bpf: Tolerate BPF and skeleton generation failures
> selftests/bpf: Avoid rebuilds when running emit_tests
> selftests/bpf: Make skeleton headers order-only prerequisites of .test.d
> selftests/bpf: Tolerate test file compilation failures
> selftests/bpf: Allow test_progs to link with a partial object set
> selftests/bpf: Tolerate benchmark build failures
> selftests/bpf: Provide weak definitions for cross-test functions
> selftests/bpf: Skip tests whose objects were not built
> selftests/bpf: Tolerate missing files during install
>
> tools/testing/selftests/bpf/Makefile | 113 ++++++++++++++-------
> .../testing/selftests/bpf/prog_tests/bpf_cookie.c | 24 ++++-
> tools/testing/selftests/bpf/prog_tests/iters.c | 10 +-
> tools/testing/selftests/bpf/test_kmods/Makefile | 15 ++-
> tools/testing/selftests/bpf/test_progs.c | 7 +-
> 5 files changed, 120 insertions(+), 49 deletions(-)
> ---
> base-commit: a1aa9ef47c299c5bbc30594d3c2f0589edf908e6
> change-id: 20260401-selftests-bpf_misconfig-4c33ef5c56da
>
> Best regards,
> --
> Ricardo B. Marlière <rbm@suse.com>
>
>
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCH v4 00/10] selftests/bpf: Tolerate partial builds across kernel configs
2026-04-10 10:06 ` [PATCH v4 00/10] selftests/bpf: Tolerate partial builds across kernel configs Alan Maguire
@ 2026-04-10 13:57 ` Ricardo B. Marlière
0 siblings, 0 replies; 13+ messages in thread
From: Ricardo B. Marlière @ 2026-04-10 13:57 UTC (permalink / raw)
To: Alan Maguire, Ricardo B. Marlière, Andrii Nakryiko,
Eduard Zingerman, Alexei Starovoitov, Daniel Borkmann,
Martin KaFai Lau, Kumar Kartikeya Dwivedi, Song Liu,
Yonghong Song, Jiri Olsa, Shuah Khan, Nathan Chancellor,
Nick Desaulniers, Bill Wendling, Justin Stitt
Cc: bpf, linux-kselftest, linux-kernel, llvm
Hi Alan,
On Fri Apr 10, 2026 at 7:06 AM -03, Alan Maguire wrote:
> On 06/04/2026 19:22, Ricardo B. Marlière wrote:
>> Currently the BPF selftests can only be built by using the minimum kernel
>> configuration defined in tools/testing/selftests/bpf/config*. This poses a
>> problem in distribution kernels that may have some of the flags disabled or
>> set as module. For example, we have been running the tests regularly in
>> openSUSE Tumbleweed [1] [2] but to work around this fact we created a
>> special package [3] that build the tests against an auxiliary vmlinux with
>> the BPF Kconfig. We keep a list of known issues that may happen due to,
>> amongst other things, configuration mismatches [4] [5].
>>
>> The maintenance of this package is far from ideal, especially for
>> enterprise kernels. The goal of this series is to enable the common usecase
>> of running the following in any system:
>>
>> ```sh
>> make -C tools/testing/selftests install \
>> SKIP_TARGETS= \
>> TARGETS=bpf \
>> O=/lib/modules/$(uname -r)/build
>> ```
>>
>> As an example, the following script targeting a minimal config can be used
>> for testing:
>>
>> ```sh
>> make defconfig
>> scripts/config --file .config \
>> --enable DEBUG_INFO_DWARF_TOOLCHAIN_DEFAULT \
>> --enable DEBUG_INFO_BTF \
>> --enable BPF_SYSCALL \
>> --enable BPF_JIT
>> make olddefconfig
>> make -j$(nproc)
>> make -j$(nproc) -C tools/testing/selftests SKIP_TARGETS= TARGETS=bpf install
>> ```
>>
>> This produces a test_progs binary with 579 subtests, against the total of
>> 708. Many of them will still fail or be skipped at runtime due to lack of
>> symbols, but at least there will be a clear way of building the tests.
>>
>
> hi Ricardo, I've been looking at this series and one concern I had was if
> tolerating failures to build with incomplete config would create problems
> in detecting failures when the config is complete, i.e. in BPF CI. So for
> example if say a BPF skeleton didn't compile when it really should due to
> an introduced bug, we wouldn't want to drive on in all cases.
Agreed.
>
> However, from what I can see, CI held up well with these changes in place [1].
>
> That said it might be nice to preserve a "strict" mode which fails when
> we hit compilation issues etc, failing as we do today; I couldn't find any existing
> general kselftest concept that fits with that but it would be valuable I think
> if possible. Perhaps we could default to non-strict mode when a make -C is initiated
> or something like that, and continue to operate strictly when building directly
> in tools/testing/selftests/bpf?
>
> I ran the changes through the usual workflow I use - build bpf selftests at
> tools/testing/selftests/bpf level and run ./test_progs ; no regressions were
> observed, so feel free to add for the series
>
> Tested-by: Alan Maguire <alan.maguire@oracle.com>
Thanks for testing!
>
> There are some comments on sashiko.dev [2] that would be worth looking through
> too, in particular the concern about O= and M= mentioned for patch 1.
I will send v5 with those addressed and possibly a strict-mode switch.
>
> [1] https://github.com/kernel-patches/bpf/actions/runs/24168181680
> [2] https://sashiko.dev/#/patchset/20260406-selftests-bpf_misconfig-v4-0-9914f50efdf7%40suse.com
> > [1]: https://openqa.opensuse.org/tests/5811715
>> [2]: https://openqa.opensuse.org/tests/5811730
>> [3]: https://src.opensuse.org/rmarliere/kselftests
>> [4]: https://github.com/openSUSE/kernel-qe/blob/main/kselftests_known_issues.yaml
>> [5]: https://openqa.opensuse.org/tests/5811730/logfile?filename=run_kselftests-config_mismatches.txt
>>
>> Assisted-by: {codex,claude}
>> Signed-off-by: Ricardo B. Marlière <rbm@suse.com>
>> ---
>> Changes in v4:
>> - Drop the test_kmods kselftest module flow patch: lib.mk gen_mods_dir
>> invokes $(MAKE) -C $(TEST_GEN_MODS_DIR) without forwarding
>> RESOLVE_BTFIDS, breaking ASAN and GCC BPF CI builds (Makefile.modfinal
>> cannot find resolve_btfids in the kbuild output tree)
>> - Link to v3:
>> https://patch.msgid.link/20260406-selftests-bpf_misconfig-v3-0-587a1114263c@suse.com
>>
>> Changes in v3:
>> - Split test_kmods patch into two: fix KDIR handling (O= passthrough,
>> EXTRA_CFLAGS/EXTRA_LDFLAGS clearing) and wire into lib.mk via
>> TEST_GEN_MODS_DIR
>> - Pass O= through to the kernel module build so artifacts land in the
>> output tree, not the source tree
>> - Clear EXTRA_CFLAGS and EXTRA_LDFLAGS when invoking the kernel build to
>> prevent host flags (e.g. -static) leaking into module compilation
>> - Replace the bespoke test_kmods pattern rule with lib.mk module
>> infrastructure (TEST_GEN_MODS_DIR); lib.mk now drives build and clean
>> lifecycle
>> - Make the .ko copy step resilient: emit SKIP instead of failing when a
>> module is absent
>> - Expand the uprobe weak stub comment in bpf_cookie.c to explain why
>> noinline is required
>> - Link to v2:
>> https://patch.msgid.link/20260403-selftests-bpf_misconfig-v2-0-f06700380a9d@suse.com
>>
>> Changes in v2:
>> - Skip test_kmods build/clean when KDIR directory does not exist
>> - Use `Module.symvers` instead of `.config` for in-tree detection
>> - Fix skeleton order-only prereqs commit message
>> - Guard BTFIDS step when .test.o is absent
>> - Add `__weak stack_mprotect()` stubs in `bpf_cookie.c` and `iters.c`
>> - Link to v1:
>> https://patch.msgid.link/20260401-selftests-bpf_misconfig-v1-0-3ae42c0af76f@suse.com
>>
>> ---
>> Ricardo B. Marlière (10):
>> selftests/bpf: Fix test_kmods KDIR to honor O= and distro kernels
>> selftests/bpf: Tolerate BPF and skeleton generation failures
>> selftests/bpf: Avoid rebuilds when running emit_tests
>> selftests/bpf: Make skeleton headers order-only prerequisites of .test.d
>> selftests/bpf: Tolerate test file compilation failures
>> selftests/bpf: Allow test_progs to link with a partial object set
>> selftests/bpf: Tolerate benchmark build failures
>> selftests/bpf: Provide weak definitions for cross-test functions
>> selftests/bpf: Skip tests whose objects were not built
>> selftests/bpf: Tolerate missing files during install
>>
>> tools/testing/selftests/bpf/Makefile | 113 ++++++++++++++-------
>> .../testing/selftests/bpf/prog_tests/bpf_cookie.c | 24 ++++-
>> tools/testing/selftests/bpf/prog_tests/iters.c | 10 +-
>> tools/testing/selftests/bpf/test_kmods/Makefile | 15 ++-
>> tools/testing/selftests/bpf/test_progs.c | 7 +-
>> 5 files changed, 120 insertions(+), 49 deletions(-)
>> ---
>> base-commit: a1aa9ef47c299c5bbc30594d3c2f0589edf908e6
>> change-id: 20260401-selftests-bpf_misconfig-4c33ef5c56da
>>
>> Best regards,
>> --
>> Ricardo B. Marlière <rbm@suse.com>
>>
>>
^ permalink raw reply [flat|nested] 13+ messages in thread
end of thread, other threads:[~2026-04-10 13:57 UTC | newest]
Thread overview: 13+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-04-06 18:22 [PATCH v4 00/10] selftests/bpf: Tolerate partial builds across kernel configs Ricardo B. Marlière
2026-04-06 18:22 ` [PATCH v4 01/10] selftests/bpf: Fix test_kmods KDIR to honor O= and distro kernels Ricardo B. Marlière
2026-04-06 18:22 ` [PATCH v4 02/10] selftests/bpf: Tolerate BPF and skeleton generation failures Ricardo B. Marlière
2026-04-06 18:22 ` [PATCH v4 03/10] selftests/bpf: Avoid rebuilds when running emit_tests Ricardo B. Marlière
2026-04-06 18:22 ` [PATCH v4 04/10] selftests/bpf: Make skeleton headers order-only prerequisites of .test.d Ricardo B. Marlière
2026-04-06 18:22 ` [PATCH v4 05/10] selftests/bpf: Tolerate test file compilation failures Ricardo B. Marlière
2026-04-06 18:22 ` [PATCH v4 06/10] selftests/bpf: Allow test_progs to link with a partial object set Ricardo B. Marlière
2026-04-06 18:22 ` [PATCH v4 07/10] selftests/bpf: Tolerate benchmark build failures Ricardo B. Marlière
2026-04-06 18:22 ` [PATCH v4 08/10] selftests/bpf: Provide weak definitions for cross-test functions Ricardo B. Marlière
2026-04-06 18:22 ` [PATCH v4 09/10] selftests/bpf: Skip tests whose objects were not built Ricardo B. Marlière
2026-04-06 18:22 ` [PATCH v4 10/10] selftests/bpf: Tolerate missing files during install Ricardo B. Marlière
2026-04-10 10:06 ` [PATCH v4 00/10] selftests/bpf: Tolerate partial builds across kernel configs Alan Maguire
2026-04-10 13:57 ` Ricardo B. Marlière
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox