Path: blob/master/tools/testing/selftests/bpf/bpf_arena_common.h
26285 views
/* SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) */1/* Copyright (c) 2024 Meta Platforms, Inc. and affiliates. */2#pragma once34#ifndef WRITE_ONCE5#define WRITE_ONCE(x, val) ((*(volatile typeof(x) *) &(x)) = (val))6#endif78#ifndef NUMA_NO_NODE9#define NUMA_NO_NODE (-1)10#endif1112#ifndef arena_container_of13#define arena_container_of(ptr, type, member) \14({ \15void __arena *__mptr = (void __arena *)(ptr); \16((type *)(__mptr - offsetof(type, member))); \17})18#endif1920#ifdef __BPF__ /* when compiled as bpf program */2122#ifndef PAGE_SIZE23#define PAGE_SIZE __PAGE_SIZE24/*25* for older kernels try sizeof(struct genradix_node)26* or flexible:27* static inline long __bpf_page_size(void) {28* return bpf_core_enum_value(enum page_size_enum___l, __PAGE_SIZE___l) ?: sizeof(struct genradix_node);29* }30* but generated code is not great.31*/32#endif3334#if defined(__BPF_FEATURE_ADDR_SPACE_CAST) && !defined(BPF_ARENA_FORCE_ASM)35#define __arena __attribute__((address_space(1)))36#define __arena_global __attribute__((address_space(1)))37#define cast_kern(ptr) /* nop for bpf prog. emitted by LLVM */38#define cast_user(ptr) /* nop for bpf prog. emitted by LLVM */39#else40#define __arena41#define __arena_global SEC(".addr_space.1")42#define cast_kern(ptr) bpf_addr_space_cast(ptr, 0, 1)43#define cast_user(ptr) bpf_addr_space_cast(ptr, 1, 0)44#endif4546void __arena* bpf_arena_alloc_pages(void *map, void __arena *addr, __u32 page_cnt,47int node_id, __u64 flags) __ksym __weak;48int bpf_arena_reserve_pages(void *map, void __arena *addr, __u32 page_cnt) __ksym __weak;49void bpf_arena_free_pages(void *map, void __arena *ptr, __u32 page_cnt) __ksym __weak;5051#define arena_base(map) ((void __arena *)((struct bpf_arena *)(map))->user_vm_start)5253#else /* when compiled as user space code */5455#define __arena56#define __arg_arena57#define cast_kern(ptr) /* nop for user space */58#define cast_user(ptr) /* nop for user space */59__weak char arena[1];6061#ifndef offsetof62#define offsetof(type, member) ((unsigned long)&((type *)0)->member)63#endif6465static inline void __arena* bpf_arena_alloc_pages(void *map, void *addr, __u32 page_cnt,66int node_id, __u64 flags)67{68return NULL;69}70static inline void bpf_arena_free_pages(void *map, void __arena *ptr, __u32 page_cnt)71{72}7374#endif757677