mirror of
git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-04-18 20:29:04 +08:00
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: 88d706ba7c ("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>
This commit is contained in:
committed by
Alexei Starovoitov
parent
38c6104e0b
commit
1f375aef6c
@@ -22,7 +22,28 @@
|
||||
|
||||
extern unsigned long CONFIG_NR_CPUS __kconfig;
|
||||
|
||||
#define arena_spinlock_t struct qspinlock
|
||||
/*
|
||||
* Typically, we'd just rely on the definition in vmlinux.h for qspinlock, but
|
||||
* PowerPC overrides the definition to define lock->val as u32 instead of
|
||||
* atomic_t, leading to compilation errors. Import a local definition below so
|
||||
* that we don't depend on the vmlinux.h version.
|
||||
*/
|
||||
|
||||
struct __qspinlock {
|
||||
union {
|
||||
atomic_t val;
|
||||
struct {
|
||||
u8 locked;
|
||||
u8 pending;
|
||||
};
|
||||
struct {
|
||||
u16 locked_pending;
|
||||
u16 tail;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
#define arena_spinlock_t struct __qspinlock
|
||||
/* FIXME: Using typedef causes CO-RE relocation error */
|
||||
/* typedef struct qspinlock arena_spinlock_t; */
|
||||
|
||||
|
||||
@@ -4,8 +4,8 @@
|
||||
#include <network_helpers.h>
|
||||
#include <sys/sysinfo.h>
|
||||
|
||||
struct qspinlock { int val; };
|
||||
typedef struct qspinlock arena_spinlock_t;
|
||||
struct __qspinlock { int val; };
|
||||
typedef struct __qspinlock arena_spinlock_t;
|
||||
|
||||
struct arena_qnode {
|
||||
unsigned long next;
|
||||
|
||||
Reference in New Issue
Block a user