All of lore.kernel.org
 help / color / mirror / Atom feed
From: George Guo <dongtai.guo@linux.dev>
To: Alexei Starovoitov <ast@kernel.org>,
	Daniel Borkmann <daniel@iogearbox.net>,
	Andrii Nakryiko <andrii@kernel.org>
Cc: Eduard Zingerman <eddyz87@gmail.com>,
	Emil Tsalapatis <emil@etsalapatis.com>,
	Mykola Lysenko <mykolal@fb.com>,
	Martin KaFai Lau <martin.lau@linux.dev>,
	Kumar Kartikeya Dwivedi <memxor@gmail.com>,
	Huacai Chen <chenhuacai@kernel.org>,
	Tiezhu Yang <yangtiezhu@loongson.cn>,
	George Guo <guodongtai@kylinos.cn>,
	bpf@vger.kernel.org, loongarch@lists.linux.dev,
	linux-kernel@vger.kernel.org
Subject: [PATCH bpf] selftests/bpf: Skip libarena when the BPF backend lacks 32-bit arena cmpxchg
Date: Tue, 30 Jun 2026 10:58:09 +0800	[thread overview]
Message-ID: <20260630025809.74043-1-dongtai.guo@linux.dev> (raw)

From: George Guo <guodongtai@kylinos.cn>

The arena qspinlock pulled in by libarena (bpf_arena_spin_lock.h) performs
a 32-bit atomic compare-and-exchange on an arena (address space 1) pointer
via atomic_try_cmpxchg_acquire() on the 32-bit atomic_t lock word. Not
every LLVM BPF backend can select that operation; releases such as clang 19
abort instruction selection with:

  error: unsupported atomic operation, please use 64 bit version
  fatal error: error in backend: Cannot select: AtomicCmpSwap<(s32)> ...
  In function: arena_spin_lock_slowpath

Because libarena/libarena.skel.h is an unconditional dependency of
test_progs, this aborts the entire selftests/bpf build before test_progs is
ever linked, so none of the other tests can be built or run. This was
observed building selftests/bpf for LoongArch with clang 19, but it is a
property of the BPF backend, not of the host architecture.

Mirror the existing CLANG_HAS_ARENA_ASAN feature probe: detect whether the
backend can compile a 32-bit arena cmpxchg, and only build libarena when it
can. Define HAS_BPF_ARENA in that case and guard prog_tests/libarena.c
behind it - exactly the way prog_tests/libarena_asan.c is guarded behind
HAS_BPF_ARENA_ASAN - so the test still compiles and reports as skipped when
libarena is not built. When the operation is unsupported, libarena is
skipped and the rest of test_progs builds and links as before.

Fixes: d5327480a12a ("selftests/bpf: Add basic libarena scaffolding")
Signed-off-by: George Guo <guodongtai@kylinos.cn>
---
 tools/testing/selftests/bpf/Makefile          | 14 ++++++++++++++
 .../selftests/bpf/prog_tests/libarena.c       | 19 ++++++++++++++++++-
 2 files changed, 32 insertions(+), 1 deletion(-)

diff --git a/tools/testing/selftests/bpf/Makefile b/tools/testing/selftests/bpf/Makefile
index b642ee489ea6..0098d892cb39 100644
--- a/tools/testing/selftests/bpf/Makefile
+++ b/tools/testing/selftests/bpf/Makefile
@@ -91,6 +91,17 @@ CLANG_HAS_ARENA_ASAN := $(shell echo 'int x;' | \
 	-mllvm -asan-shadow-addr-space=1 \
 	-x c -c - -o /dev/null 2>/dev/null && echo 1)
 
+# The arena qspinlock used by libarena performs a 32-bit atomic cmpxchg on an
+# arena (address space 1) pointer. Not every LLVM BPF backend can select it;
+# older releases bail out with "unsupported atomic operation, please use 64 bit
+# version", which aborts the whole selftests build. Probe for the operation and
+# skip libarena (and its dependent tests) when the backend cannot handle it.
+CLANG_HAS_ARENA_CMPXCHG32 := $(shell printf '%s\n' \
+	'struct s { int counter; };' \
+	'int f(struct s __attribute__((address_space(1))) *l, int o, int n)' \
+	'{ return __sync_val_compare_and_swap(&l->counter, o, n); }' | \
+	$(CLANG) --target=bpf -O2 -x c -c - -o /dev/null 2>/dev/null && echo 1)
+
 # Order correspond to 'make run_tests' order
 TEST_GEN_PROGS = test_verifier test_tag test_maps test_lru_map test_progs \
 	test_sockmap \
@@ -835,10 +846,13 @@ LIBARENA_BPF_DEPS := $(wildcard libarena/Makefile		\
 				 libarena/selftests/*		\
 				 libarena/*.bpf.o)
 
+ifneq ($(CLANG_HAS_ARENA_CMPXCHG32),)
 LIBARENA_SKEL := libarena/libarena.skel.h
+CFLAGS += -DHAS_BPF_ARENA
 
 $(LIBARENA_SKEL): $(INCLUDE_DIR)/vmlinux.h $(BPFOBJ) $(LIBARENA_BPF_DEPS)
 	+$(MAKE) -C libarena libarena.skel.h $(LIBARENA_MAKE_ARGS)
+endif
 
 ifneq ($(CLANG_HAS_ARENA_ASAN),)
 LIBARENA_ASAN_SKEL := libarena/libarena_asan.skel.h
diff --git a/tools/testing/selftests/bpf/prog_tests/libarena.c b/tools/testing/selftests/bpf/prog_tests/libarena.c
index 61ea68dce410..a7ede72c7256 100644
--- a/tools/testing/selftests/bpf/prog_tests/libarena.c
+++ b/tools/testing/selftests/bpf/prog_tests/libarena.c
@@ -1,6 +1,8 @@
 // SPDX-License-Identifier: LGPL-2.1 OR BSD-2-Clause
 /* Copyright (c) 2026 Meta Platforms, Inc. and affiliates. */
 #include <test_progs.h>
+
+#ifdef HAS_BPF_ARENA
 #include <unistd.h>
 
 #include <libarena/common.h>
@@ -198,7 +200,7 @@ static void run_libarena_parallel_test(struct libarena *skel, struct bpf_program
 	run_libarena_parallel_fini(skel, name, prefixlen);
 }
 
-void test_libarena(void)
+static void run_test(void)
 {
 	struct arena_alloc_reserve_args args;
 	struct libarena *skel;
@@ -251,3 +253,18 @@ void test_libarena(void)
 out:
 	libarena__destroy(skel);
 }
+
+#endif /* HAS_BPF_ARENA */
+
+/*
+ * Run the test only if the BPF backend can compile the arena programs
+ * libarena depends on (see CLANG_HAS_ARENA_CMPXCHG32 in the Makefile).
+ */
+void test_libarena(void)
+{
+#ifdef HAS_BPF_ARENA
+	run_test();
+#else
+	test__skip();
+#endif
+}
-- 
2.25.1


             reply	other threads:[~2026-06-30  2:58 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-06-30  2:58 George Guo [this message]
2026-06-30  3:16 ` [PATCH bpf] selftests/bpf: Skip libarena when the BPF backend lacks 32-bit arena cmpxchg sashiko-bot
2026-06-30 18:06 ` Alexei Starovoitov

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20260630025809.74043-1-dongtai.guo@linux.dev \
    --to=dongtai.guo@linux.dev \
    --cc=andrii@kernel.org \
    --cc=ast@kernel.org \
    --cc=bpf@vger.kernel.org \
    --cc=chenhuacai@kernel.org \
    --cc=daniel@iogearbox.net \
    --cc=eddyz87@gmail.com \
    --cc=emil@etsalapatis.com \
    --cc=guodongtai@kylinos.cn \
    --cc=linux-kernel@vger.kernel.org \
    --cc=loongarch@lists.linux.dev \
    --cc=martin.lau@linux.dev \
    --cc=memxor@gmail.com \
    --cc=mykolal@fb.com \
    --cc=yangtiezhu@loongson.cn \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.