// SPDX-License-Identifier: GPL-2.0 /* Copyright (c) 2024 Meta Platforms, Inc. and affiliates. */ #include <vmlinux.h> #include <bpf/bpf_helpers.h> #include <bpf/bpf_tracing.h> #include <bpf/bpf_core_read.h> #include "bpf_experimental.h" struct { __uint(type, BPF_MAP_TYPE_ARENA); __uint(map_flags, BPF_F_MMAPABLE); __uint(max_entries, 100); /* number of pages */ #ifdef __TARGET_ARCH_arm64 __ulong(map_extra, 0x1ull << 32); /* start of mmap() region */ #else __ulong(map_extra, 0x1ull << 44); /* start of mmap() region */ #endif } arena SEC(".maps"); #include "bpf_arena_alloc.h" #include "bpf_arena_list.h" struct elem { struct arena_list_node node; __u64 value; }; struct arena_list_head __arena *list_head; int list_sum; int cnt; bool skip = false; #ifdef __BPF_FEATURE_ADDR_SPACE_CAST long __arena arena_sum; int __arena test_val = 1; struct arena_list_head __arena global_head; #else long arena_sum SEC(".addr_space.1"); int test_val SEC(".addr_space.1"); #endif int zero; SEC("syscall") int arena_list_add(void *ctx) { #ifdef __BPF_FEATURE_ADDR_SPACE_CAST __u64 i; list_head = &global_head; for (i = zero; i < cnt; cond_break, i++) { struct elem __arena *n = bpf_alloc(sizeof(*n)); test_val++; n->value = i; arena_sum += i; list_add_head(&n->node, list_head); } #else skip = true; #endif return 0; } SEC("syscall") int arena_list_del(void *ctx) { #ifdef __BPF_FEATURE_ADDR_SPACE_CAST struct elem __arena *n; int sum = 0; arena_sum = 0; list_for_each_entry(n, list_head, node) { sum += n->value; arena_sum += n->value; list_del(&n->node); bpf_free(n); } list_sum = sum; #else skip = true; #endif return 0; } char _license[] SEC("license") = "GPL";