xref: /linux/tools/testing/selftests/bpf/progs/arena_list.c (revision a1ff5a7d78a036d6c2178ee5acd6ba4946243800)
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 Starovoitov int 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 Starovoitov int 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