Re: [PATCH bpf-next 02/16] libbpf: Create arena percpu chunk from the arena percpu ELF section
From: bot+bpf-ci
Date: Tue Oct 20 2026 - 10:24:38 EST
> libbpf: Create arena percpu chunk from the arena percpu ELF section
TL;DR: Reading the possible-CPUs sysfs file at open time may make
bpf_object_open() fail, breaking 'bpftool gen skeleton' in sandboxes without
/sys; suggests computing nr_chunks lazily in relocate.
> diff --git a/tools/lib/bpf/libbpf.c b/tools/lib/bpf/libbpf.c
> --- a/tools/lib/bpf/libbpf.c
> +++ b/tools/lib/bpf/libbpf.c
[ ... ]
> @@ -3267,6 +3274,41 @@ static int bpf_object__init_arena_data(struct bpf_object *obj)
> return 0;
> }
>
> +static int init_arena_percpu_data(struct bpf_object *obj, void *percpu_data, size_t percpu_sz)
> +{
> + static const char *fcpu = "/sys/devices/system/cpu/possible";
> + bool *mask = NULL;
> + int possible_cpus;
> + int err;
> +
> + if (percpu_sz == 0) {
> + pr_warn("arena percpu: empty %s section\n", ARENA_PERCPU_SEC);
> + return -EINVAL;
> + }
> +
> + err = parse_cpu_mask_file(fcpu, &mask, &possible_cpus);
> + if (err) {
> + pr_warn("arena percpu: failed to get possible cpus: %s\n",
> + errstr(err));
> + return err;
> + }
Can this make bpf_object_open() fail on hosts where
/sys/devices/system/cpu/possible cannot be read?
init_arena_percpu_data() is reached from bpf_object__init_user_btf_maps()
during bpf_object_open(), so opening any object with a .arena.percpu section
now reads this sysfs file. Until now libbpf only needed the possible CPU
count at load or runtime, through map_set_def_max_entries(), the per-cpu
value size checks and perf_buffer setup.
The value computed here, obj->arena_percpu.nr_chunks, is first used in
bpf_object__relocate(), which runs from bpf_object_prepare():
> + size_t percpu_sz = obj->arena_percpu.nr_chunks * obj->arena_percpu.chunk_sz;
Open-only consumers such as 'bpftool gen skeleton' and 'bpftool gen
subskeleton' call bpf_object__open_mem() and never load, so they now depend
on the build host's sysfs. In a build chroot or sandbox without /sys, open
fails with "arena percpu: failed to get possible cpus" and skeleton
generation breaks, even though the CPU count is never used there.
With 'gen skeleton -L', open fails with this error before the intended
-EOPNOTSUPP check in bpf_object__relocate() is reached:
> + if (obj->gen_loader && obj->arena_percpu.present) {
> + pr_warn("map '%s': light skeletons don't support arena percpu variables\n",
> + arena_map->name);
> + return -EOPNOTSUPP;
> + }
Would it work to allocate and copy the chunk at open time, and compute
nr_chunks lazily in bpf_object__relocate(), where it is first needed? No
later commit in the series changes this.
> +
> + obj->arena_percpu.chunk_sz = roundup(percpu_sz, sysconf(_SC_PAGE_SIZE));
> + obj->arena_percpu.chunk = calloc(1, obj->arena_percpu.chunk_sz); /* zero padding */
> + if (!obj->arena_percpu.chunk) {
> + free(mask);
> + return -ENOMEM;
> + }
[ ... ]
---
AI reviewed your patch. Please fix the bug or email reply why it's not a bug.
See: https://github.com/kernel-patches/vmtest/blob/master/ci/claude/README.md
CI run summary: https://github.com/kernel-patches/bpf/actions/runs/39434884362