Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
torvalds
GitHub Repository: torvalds/linux
Path: blob/master/tools/testing/selftests/bpf/bpf_arena_common.h
26285 views
1
/* SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) */
2
/* Copyright (c) 2024 Meta Platforms, Inc. and affiliates. */
3
#pragma once
4
5
#ifndef WRITE_ONCE
6
#define WRITE_ONCE(x, val) ((*(volatile typeof(x) *) &(x)) = (val))
7
#endif
8
9
#ifndef NUMA_NO_NODE
10
#define NUMA_NO_NODE (-1)
11
#endif
12
13
#ifndef arena_container_of
14
#define arena_container_of(ptr, type, member) \
15
({ \
16
void __arena *__mptr = (void __arena *)(ptr); \
17
((type *)(__mptr - offsetof(type, member))); \
18
})
19
#endif
20
21
#ifdef __BPF__ /* when compiled as bpf program */
22
23
#ifndef PAGE_SIZE
24
#define PAGE_SIZE __PAGE_SIZE
25
/*
26
* for older kernels try sizeof(struct genradix_node)
27
* or flexible:
28
* static inline long __bpf_page_size(void) {
29
* return bpf_core_enum_value(enum page_size_enum___l, __PAGE_SIZE___l) ?: sizeof(struct genradix_node);
30
* }
31
* but generated code is not great.
32
*/
33
#endif
34
35
#if defined(__BPF_FEATURE_ADDR_SPACE_CAST) && !defined(BPF_ARENA_FORCE_ASM)
36
#define __arena __attribute__((address_space(1)))
37
#define __arena_global __attribute__((address_space(1)))
38
#define cast_kern(ptr) /* nop for bpf prog. emitted by LLVM */
39
#define cast_user(ptr) /* nop for bpf prog. emitted by LLVM */
40
#else
41
#define __arena
42
#define __arena_global SEC(".addr_space.1")
43
#define cast_kern(ptr) bpf_addr_space_cast(ptr, 0, 1)
44
#define cast_user(ptr) bpf_addr_space_cast(ptr, 1, 0)
45
#endif
46
47
void __arena* bpf_arena_alloc_pages(void *map, void __arena *addr, __u32 page_cnt,
48
int node_id, __u64 flags) __ksym __weak;
49
int bpf_arena_reserve_pages(void *map, void __arena *addr, __u32 page_cnt) __ksym __weak;
50
void bpf_arena_free_pages(void *map, void __arena *ptr, __u32 page_cnt) __ksym __weak;
51
52
#define arena_base(map) ((void __arena *)((struct bpf_arena *)(map))->user_vm_start)
53
54
#else /* when compiled as user space code */
55
56
#define __arena
57
#define __arg_arena
58
#define cast_kern(ptr) /* nop for user space */
59
#define cast_user(ptr) /* nop for user space */
60
__weak char arena[1];
61
62
#ifndef offsetof
63
#define offsetof(type, member) ((unsigned long)&((type *)0)->member)
64
#endif
65
66
static inline void __arena* bpf_arena_alloc_pages(void *map, void *addr, __u32 page_cnt,
67
int node_id, __u64 flags)
68
{
69
return NULL;
70
}
71
static inline void bpf_arena_free_pages(void *map, void __arena *ptr, __u32 page_cnt)
72
{
73
}
74
75
#endif
76
77