19f2c156fSAlexei Starovoitov // SPDX-License-Identifier: GPL-2.0 29f2c156fSAlexei Starovoitov /* Copyright (c) 2024 Meta Platforms, Inc. and affiliates. */ 3*6a826014SDaniel Xu #define BPF_NO_KFUNC_PROTOTYPES 49f2c156fSAlexei Starovoitov #include <vmlinux.h> 59f2c156fSAlexei Starovoitov #include <bpf/bpf_helpers.h> 69f2c156fSAlexei Starovoitov #include <bpf/bpf_tracing.h> 79f2c156fSAlexei Starovoitov #include <bpf/bpf_core_read.h> 89f2c156fSAlexei Starovoitov #include "bpf_experimental.h" 99f2c156fSAlexei Starovoitov 109f2c156fSAlexei Starovoitov struct { 119f2c156fSAlexei Starovoitov __uint(type, BPF_MAP_TYPE_ARENA); 129f2c156fSAlexei Starovoitov __uint(map_flags, BPF_F_MMAPABLE); 139f2c156fSAlexei Starovoitov __uint(max_entries, 100); /* number of pages */ 149f2c156fSAlexei Starovoitov #ifdef __TARGET_ARCH_arm64 159f2c156fSAlexei Starovoitov __ulong(map_extra, 0x1ull << 32); /* start of mmap() region */ 169f2c156fSAlexei Starovoitov #else 179f2c156fSAlexei Starovoitov __ulong(map_extra, 0x1ull << 44); /* start of mmap() region */ 189f2c156fSAlexei Starovoitov #endif 199f2c156fSAlexei Starovoitov } arena SEC(".maps"); 209f2c156fSAlexei Starovoitov 219f2c156fSAlexei Starovoitov #include "bpf_arena_alloc.h" 229f2c156fSAlexei Starovoitov #include "bpf_arena_list.h" 239f2c156fSAlexei Starovoitov 249f2c156fSAlexei Starovoitov struct elem { 259f2c156fSAlexei Starovoitov struct arena_list_node node; 269f2c156fSAlexei Starovoitov __u64 value; 279f2c156fSAlexei Starovoitov }; 289f2c156fSAlexei Starovoitov 299f2c156fSAlexei Starovoitov struct arena_list_head __arena *list_head; 309f2c156fSAlexei Starovoitov int list_sum; 319f2c156fSAlexei Starovoitov int cnt; 329f2c156fSAlexei Starovoitov bool skip = false; 339f2c156fSAlexei Starovoitov 3410ebe835SAlexei Starovoitov #ifdef __BPF_FEATURE_ADDR_SPACE_CAST 359f2c156fSAlexei Starovoitov long __arena arena_sum; 369f2c156fSAlexei Starovoitov int __arena test_val = 1; 379f2c156fSAlexei Starovoitov struct arena_list_head __arena global_head; 389f2c156fSAlexei Starovoitov #else 3910ebe835SAlexei Starovoitov long arena_sum SEC(".addr_space.1"); 4010ebe835SAlexei Starovoitov int test_val SEC(".addr_space.1"); 419f2c156fSAlexei Starovoitov #endif 429f2c156fSAlexei Starovoitov 439f2c156fSAlexei Starovoitov int zero; 449f2c156fSAlexei Starovoitov 459f2c156fSAlexei Starovoitov SEC("syscall") arena_list_add(void * ctx)469f2c156fSAlexei Starovoitovint arena_list_add(void *ctx) 479f2c156fSAlexei Starovoitov { 4810ebe835SAlexei Starovoitov #ifdef __BPF_FEATURE_ADDR_SPACE_CAST 499f2c156fSAlexei Starovoitov __u64 i; 509f2c156fSAlexei Starovoitov 519f2c156fSAlexei Starovoitov list_head = &global_head; 529f2c156fSAlexei Starovoitov 53ba39486dSJose E. Marchesi for (i = zero; i < cnt && can_loop; i++) { 549f2c156fSAlexei Starovoitov struct elem __arena *n = bpf_alloc(sizeof(*n)); 559f2c156fSAlexei Starovoitov 569f2c156fSAlexei Starovoitov test_val++; 579f2c156fSAlexei Starovoitov n->value = i; 589f2c156fSAlexei Starovoitov arena_sum += i; 599f2c156fSAlexei Starovoitov list_add_head(&n->node, list_head); 609f2c156fSAlexei Starovoitov } 619f2c156fSAlexei Starovoitov #else 629f2c156fSAlexei Starovoitov skip = true; 639f2c156fSAlexei Starovoitov #endif 649f2c156fSAlexei Starovoitov return 0; 659f2c156fSAlexei Starovoitov } 669f2c156fSAlexei Starovoitov 679f2c156fSAlexei Starovoitov SEC("syscall") arena_list_del(void * ctx)689f2c156fSAlexei Starovoitovint arena_list_del(void *ctx) 699f2c156fSAlexei Starovoitov { 7010ebe835SAlexei Starovoitov #ifdef __BPF_FEATURE_ADDR_SPACE_CAST 719f2c156fSAlexei Starovoitov struct elem __arena *n; 729f2c156fSAlexei Starovoitov int sum = 0; 739f2c156fSAlexei Starovoitov 749f2c156fSAlexei Starovoitov arena_sum = 0; 759f2c156fSAlexei Starovoitov list_for_each_entry(n, list_head, node) { 769f2c156fSAlexei Starovoitov sum += n->value; 779f2c156fSAlexei Starovoitov arena_sum += n->value; 789f2c156fSAlexei Starovoitov list_del(&n->node); 799f2c156fSAlexei Starovoitov bpf_free(n); 809f2c156fSAlexei Starovoitov } 819f2c156fSAlexei Starovoitov list_sum = sum; 829f2c156fSAlexei Starovoitov #else 839f2c156fSAlexei Starovoitov skip = true; 849f2c156fSAlexei Starovoitov #endif 859f2c156fSAlexei Starovoitov return 0; 869f2c156fSAlexei Starovoitov } 879f2c156fSAlexei Starovoitov 889f2c156fSAlexei Starovoitov char _license[] SEC("license") = "GPL"; 89