On 24/08/04 05:31PM, Alexei Starovoitov wrote: > On Sun, Aug 4, 2024 at 1:40 PM Jose Fernandez <jose.fernandez@xxxxxxxxx> wrote: > > > > On 24/08/04 09:59AM, Jose Fernandez wrote: > > > Hi folks, > > > > > > I have not found BPF arena documentation, beyond the patches and selftests. > > > I'm using the arena_atomics selftest as reference to create a simple BPF program > > > that increments a value atomically. > > > > > > bpf: https://github.com/jfernandez/bpf-playground/blob/main/arena.bpf.c > > > userspace: https://github.com/jfernandez/bpf-playground/blob/main/arena.c > > > common header: https://github.com/jfernandez/bpf-playground/blob/main/bpf_arena_common.h > > > > > > I'm using the 6.10.2 kernel and libbpf 1.4.3. > > > > I forgot to mention that I was using the latest clang release (18.1.8), and this > > turned out to be the issue. The arena bpf program loaded after I used clang > > compiled from the llvm-project master branch. > > > > I now realise that __BPF_FEATURE_ADDR_SPACE_CAST flag is only available starting > > with the 19.1.0 RC: > > > > $ git --no-pager tag --contains 65b123e287d1320170bb3317179bc917f21852fa > > llvmorg-19.1.0-rc1 > > llvmorg-20-init > > > That is correct and sorry about this footgun in bpf_arena_common.h. > The cast_kern() and cast_user() macros were added there only for > selftests to make sure the kernel part of arena is tested when llvm is > older than 19 which is likely the case for many bpf developers. > The cast_kern/user() are obviously unnecessary with llvm 19+. Hi Aexei, thank you for confirming. > I think we need to create a common directory/repo somewhere > with ready-to-be-consumed .h and .c with various algorithms based on arena. > So people don't repeat your debugging experience. After I got the atomic example working, I moved to a custom struct based on the list and htab examples. Another surprise was that bpf_arena_alloc_pages() requires the bpf prog to be sleepable. Will this always be the case? I want to use arenas in a non-sleepable raw tracepoint program. Your description in the patch says that you could fault-in pages from userspace to avoid needing to call bpf_arena_alloc_pages() from bpf. I haven't been able to figure out the correct pattern do this. I'm happy to subtmit a selftest if you could provide a few pointers. > For example I've copy pasted glob_match() from kernel to bpf prog and > it works: > https://git.kernel.org/pub/scm/linux/kernel/git/ast/bpf.git/commit/?h=arena&id=7fd6f96cc80ac8e1ba2838bb1570dd4aed81c567 > More such examples/samples are needed to realize the power of arena.