Re: [PATCH] selftests/bpf: Remove duplicate copies of the arena spinlock qnodes

"Kumar Kartikeya Dwivedi" <[email protected]>
Newsgroups org.kernel.vger.linux-kselftest,dev.linux.lists.sched-ext,org.kernel.vger.bpf,org.kernel.vger.linux-kernel
Message-ID <[email protected]>
On Mon Aug 3, 2026 at 2:18 AM CEST, Changwoo Min wrote:
> bpf_arena_spin_lock.h defines its 64KB qnodes array in the header, so
> every translation unit including it emits a copy. __weak makes them all
> resolve to one instance, but bpftool gen object merges only the symbols
> and concatenates each input's .addr_space.1 bytes, leaving the surplus
> copies unreferenced in the linked object.
>
> libarena links ten such units, so nine copies were dead weight (bytes):
>
>   object                             before       after
>   -----------------------------------------------------
>   .addr_space.1 in libarena.bpf.o    676200       86376
>   libarena.skel.h                   2100123      892371
>   libarena_asan.skel.h              2641124     1466477
>
> Declare qnodes in the header and let each program define it once:
> libarena in src/common.bpf.c, and the arena_spin_lock test beside the
> lock it guards.
>
> Tested with test_progs -t arena_spin_lock and -t libarena.
>
> Signed-off-by: Changwoo Min <[email protected]>
> ---

This seems ok to me. I don't have better ideas. Emil, any thoughts?

>  .../selftests/bpf/libarena/include/bpf_arena_spin_lock.h   | 7 +------
>  tools/testing/selftests/bpf/libarena/src/common.bpf.c      | 7 +++++++
>  tools/testing/selftests/bpf/progs/arena_spin_lock.c        | 7 +++++++
>  3 files changed, 15 insertions(+), 6 deletions(-)
>
> diff --git a/tools/testing/selftests/bpf/libarena/include/bpf_arena_spin_lock.h b/tools/testing/selftests/bpf/libarena/include/bpf_arena_spin_lock.h
> index ae6b72d15bb6..71d9db610263 100644
> --- a/tools/testing/selftests/bpf/libarena/include/bpf_arena_spin_lock.h
> +++ b/tools/testing/selftests/bpf/libarena/include/bpf_arena_spin_lock.h
> @@ -103,12 +103,7 @@ struct arena_qnode {
>  #define _Q_LOCKED_VAL		(1U << _Q_LOCKED_OFFSET)
>  #define _Q_PENDING_VAL		(1U << _Q_PENDING_OFFSET)
>
> -/*
> - * The qnodes are marked __weak so we can define them in the header
> - * while still ensuring all compilation units use the same struct
> - * instance.
> - */
> -struct arena_qnode __weak __arena __hidden qnodes[_Q_MAX_CPUS][_Q_MAX_NODES];
> +extern struct arena_qnode __arena __hidden qnodes[_Q_MAX_CPUS][_Q_MAX_NODES];
>
>  static inline u32 encode_tail(int cpu, int idx)
>  {
> diff --git a/tools/testing/selftests/bpf/libarena/src/common.bpf.c b/tools/testing/selftests/bpf/libarena/src/common.bpf.c
> index 50be57213dfb..06481f2a2892 100644
> --- a/tools/testing/selftests/bpf/libarena/src/common.bpf.c
> +++ b/tools/testing/selftests/bpf/libarena/src/common.bpf.c
> @@ -8,6 +8,13 @@ const volatile u32 zero = 0;
>
>  struct buddy __arena buddy;
>
> +/*
> + * Storage for the queue nodes declared by bpf_arena_spin_lock.h. Each program
> + * linking the arena spinlock provides exactly one definition, so that the array
> + * is emitted once rather than once per translation unit.
> + */
> +struct arena_qnode __arena __hidden qnodes[_Q_MAX_CPUS][_Q_MAX_NODES];
> +
>  int arena_fls(__u64 word)
>  {
>  	if (!word)
> diff --git a/tools/testing/selftests/bpf/progs/arena_spin_lock.c b/tools/testing/selftests/bpf/progs/arena_spin_lock.c
> index cf7cda79c16c..92e75ec3844c 100644
> --- a/tools/testing/selftests/bpf/progs/arena_spin_lock.c
> +++ b/tools/testing/selftests/bpf/progs/arena_spin_lock.c
> @@ -23,6 +23,13 @@ int cs_count;
>  #if defined(ENABLE_ATOMICS_TESTS) && defined(__BPF_FEATURE_ADDR_SPACE_CAST)
>  arena_spinlock_t __arena lock;
>  int test_skip = 1;
> +
> +/*
> + * Storage for the queue nodes declared by bpf_arena_spin_lock.h. Each program
> + * linking the arena spinlock provides exactly one definition; libarena's lives
> + * in libarena/src/common.bpf.c.
> + */
> +struct arena_qnode __arena __hidden qnodes[_Q_MAX_CPUS][_Q_MAX_NODES];
>  #else
>  int test_skip = 2;
>  #endif
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.