On Mon, Feb 12, 2024 at 4:34 PM Eduard Zingerman <eddyz87@xxxxxxxxx> wrote: > > On Thu, 2024-02-08 at 20:06 -0800, Alexei Starovoitov wrote: > > From: Alexei Starovoitov <ast@xxxxxxxxxx> > > > > LLVM automatically places __arena variables into ".arena.1" ELF section. > > When libbpf sees such section it creates internal 'struct bpf_map' LIBBPF_MAP_ARENA > > that is connected to actual BPF_MAP_TYPE_ARENA 'struct bpf_map'. > > They share the same kernel's side bpf map and single map_fd. > > Both are emitted into skeleton. Real arena with the name given by bpf program > > in SEC(".maps") and another with "__arena_internal" name. > > All global variables from ".arena.1" section are accessible from user space > > via skel->arena->name_of_var. > > [...] > > I hit a strange bug when playing with patch. Consider a simple example [0]. > When the following BPF global variable: > > int __arena * __arena bar; > > - is commented -- the test passes; > - is uncommented -- in the test fails because global variable 'shared' is NULL. Right. That's expected, because __uint(max_entries, 1); The test creates an area on 1 page and it's consumed by int __arena * __arena bar; variable. Of course, one variable doesn't take the whole page. There could have been many arena global vars. But that page is not available anymore to bpf_arena_alloc_pages, so it returns NULL.