Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

selftests/bpf: Fix arena_spin_lock compilation on PowerPC

Venkat reported a compilation error for BPF selftests on PowerPC [0].
The crux of the error is the following message:
In file included from progs/arena_spin_lock.c:7:
/root/bpf-next/tools/testing/selftests/bpf/bpf_arena_spin_lock.h:122:8:
error: member reference base type '__attribute__((address_space(1)))
u32' (aka '__attribute__((address_space(1))) unsigned int') is not a
structure or union
122 | old = atomic_read(&lock->val);

This is because PowerPC overrides the qspinlock type changing the
lock->val member's type from atomic_t to u32.

To remedy this, import the asm-generic version in the arena spin lock
header, name it __qspinlock (since it's aliased to arena_spinlock_t, the
actual name hardly matters), and adjust the selftest to not depend on
the type in vmlinux.h.

[0]: https://lore.kernel.org/bpf/7bc80a3b-d708-4735-aa3b-6a8c21720f9d@linux.ibm.com

Fixes: 88d706ba7cc5 ("selftests/bpf: Introduce arena spin lock")
Reported-by: Venkat Rao Bagalkote <venkat88@linux.ibm.com>
Signed-off-by: Kumar Kartikeya Dwivedi <memxor@gmail.com>
Signed-off-by: Andrii Nakryiko <andrii@kernel.org>
Tested-by: Venkat Rao Bagalkote <venkat88@linux.ibm.com>
Link: https://lore.kernel.org/bpf/20250311154244.3775505-1-memxor@gmail.com
Signed-off-by: Alexei Starovoitov <ast@kernel.org>

authored by

Kumar Kartikeya Dwivedi and committed by
Alexei Starovoitov
1f375aef 38c6104e

+24 -3
+22 -1
tools/testing/selftests/bpf/bpf_arena_spin_lock.h
··· 22 22 23 23 extern unsigned long CONFIG_NR_CPUS __kconfig; 24 24 25 - #define arena_spinlock_t struct qspinlock 25 + /* 26 + * Typically, we'd just rely on the definition in vmlinux.h for qspinlock, but 27 + * PowerPC overrides the definition to define lock->val as u32 instead of 28 + * atomic_t, leading to compilation errors. Import a local definition below so 29 + * that we don't depend on the vmlinux.h version. 30 + */ 31 + 32 + struct __qspinlock { 33 + union { 34 + atomic_t val; 35 + struct { 36 + u8 locked; 37 + u8 pending; 38 + }; 39 + struct { 40 + u16 locked_pending; 41 + u16 tail; 42 + }; 43 + }; 44 + }; 45 + 46 + #define arena_spinlock_t struct __qspinlock 26 47 /* FIXME: Using typedef causes CO-RE relocation error */ 27 48 /* typedef struct qspinlock arena_spinlock_t; */ 28 49
+2 -2
tools/testing/selftests/bpf/prog_tests/arena_spin_lock.c
··· 4 4 #include <network_helpers.h> 5 5 #include <sys/sysinfo.h> 6 6 7 - struct qspinlock { int val; }; 8 - typedef struct qspinlock arena_spinlock_t; 7 + struct __qspinlock { int val; }; 8 + typedef struct __qspinlock arena_spinlock_t; 9 9 10 10 struct arena_qnode { 11 11 unsigned long next;