File Index
Files and directories
Sign in
FILE

bpf_arena_common.h

File preview with syntax highlighting.

linux-6.19.14/tools/testing/selftests/bpf/bpf_arena_common.h C
 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
47void __arena* bpf_arena_alloc_pages(void *map, void __arena *addr, __u32 page_cnt,
48				    int node_id, __u64 flags) __ksym __weak;
49int bpf_arena_reserve_pages(void *map, void __arena *addr, __u32 page_cnt) __ksym __weak;
50void 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
66static 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}
71static inline void bpf_arena_free_pages(void *map, void __arena *ptr, __u32 page_cnt)
72{
73}
74
75#endif
~/ Read-only file preview.