mirror of
git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-08-05 16:54:27 +00:00

Add selftests for the new bpf_arena_reserve_pages kfunc. Acked-by: Yonghong Song <yonghong.song@linux.dev> Signed-off-by: Emil Tsalapatis <emil@etsalapatis.com> Acked-by: Kumar Kartikeya Dwivedi <memxor@gmail.com> Link: https://lore.kernel.org/r/20250709191312.29840-3-emil@etsalapatis.com Signed-off-by: Alexei Starovoitov <ast@kernel.org>
75 lines
2.2 KiB
C
75 lines
2.2 KiB
C
/* SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) */
|
|
/* Copyright (c) 2024 Meta Platforms, Inc. and affiliates. */
|
|
#pragma once
|
|
|
|
#ifndef WRITE_ONCE
|
|
#define WRITE_ONCE(x, val) ((*(volatile typeof(x) *) &(x)) = (val))
|
|
#endif
|
|
|
|
#ifndef NUMA_NO_NODE
|
|
#define NUMA_NO_NODE (-1)
|
|
#endif
|
|
|
|
#ifndef arena_container_of
|
|
#define arena_container_of(ptr, type, member) \
|
|
({ \
|
|
void __arena *__mptr = (void __arena *)(ptr); \
|
|
((type *)(__mptr - offsetof(type, member))); \
|
|
})
|
|
#endif
|
|
|
|
#ifdef __BPF__ /* when compiled as bpf program */
|
|
|
|
#ifndef PAGE_SIZE
|
|
#define PAGE_SIZE __PAGE_SIZE
|
|
/*
|
|
* for older kernels try sizeof(struct genradix_node)
|
|
* or flexible:
|
|
* static inline long __bpf_page_size(void) {
|
|
* return bpf_core_enum_value(enum page_size_enum___l, __PAGE_SIZE___l) ?: sizeof(struct genradix_node);
|
|
* }
|
|
* but generated code is not great.
|
|
*/
|
|
#endif
|
|
|
|
#if defined(__BPF_FEATURE_ADDR_SPACE_CAST) && !defined(BPF_ARENA_FORCE_ASM)
|
|
#define __arena __attribute__((address_space(1)))
|
|
#define __arena_global __attribute__((address_space(1)))
|
|
#define cast_kern(ptr) /* nop for bpf prog. emitted by LLVM */
|
|
#define cast_user(ptr) /* nop for bpf prog. emitted by LLVM */
|
|
#else
|
|
#define __arena
|
|
#define __arena_global SEC(".addr_space.1")
|
|
#define cast_kern(ptr) bpf_addr_space_cast(ptr, 0, 1)
|
|
#define cast_user(ptr) bpf_addr_space_cast(ptr, 1, 0)
|
|
#endif
|
|
|
|
void __arena* bpf_arena_alloc_pages(void *map, void __arena *addr, __u32 page_cnt,
|
|
int node_id, __u64 flags) __ksym __weak;
|
|
int bpf_arena_reserve_pages(void *map, void __arena *addr, __u32 page_cnt) __ksym __weak;
|
|
void bpf_arena_free_pages(void *map, void __arena *ptr, __u32 page_cnt) __ksym __weak;
|
|
|
|
#define arena_base(map) ((void __arena *)((struct bpf_arena *)(map))->user_vm_start)
|
|
|
|
#else /* when compiled as user space code */
|
|
|
|
#define __arena
|
|
#define __arg_arena
|
|
#define cast_kern(ptr) /* nop for user space */
|
|
#define cast_user(ptr) /* nop for user space */
|
|
__weak char arena[1];
|
|
|
|
#ifndef offsetof
|
|
#define offsetof(type, member) ((unsigned long)&((type *)0)->member)
|
|
#endif
|
|
|
|
static inline void __arena* bpf_arena_alloc_pages(void *map, void *addr, __u32 page_cnt,
|
|
int node_id, __u64 flags)
|
|
{
|
|
return NULL;
|
|
}
|
|
static inline void bpf_arena_free_pages(void *map, void __arena *ptr, __u32 page_cnt)
|
|
{
|
|
}
|
|
|
|
#endif
|