]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
selftests/bpf: Remove __arg_arena from the codebase
authorEmil Tsalapatis <emil@etsalapatis.com>
Tue, 2 Jun 2026 00:41:18 +0000 (20:41 -0400)
committerAlexei Starovoitov <ast@kernel.org>
Tue, 2 Jun 2026 01:42:33 +0000 (18:42 -0700)
Now that BPF __arg_arena has been subsumed by __arena, remove
__arg_arena from the codebase. This way the user has one fewer
annotation to worry about.

To remove __arg_arena we remove the typedefs we were previously
using to minimize __arena annotations. This is because __arena
now also includes a BTF type tag, which is ignored for non-pointer
types. As a result, we cannot capture the whole __arena annotation
inside a typedef and need to directly annotate the pointer type when
declaring the variable.

The extra verbosity is worth it because the use of the __arena tag
is intuitive to the programmer and removes the __arg_arena tag that
has been a consistent source of confusion for users. The typedefs
can be reintroduced later (without __arg_arena) once compilers start
supporting BTF type tags for non-pointer types.

Acked-by: Eduard Zingerman <eddyz87@gmail.com>
Signed-off-by: Emil Tsalapatis <emil@etsalapatis.com>
Link: https://lore.kernel.org/r/20260602004120.17087-5-emil@etsalapatis.com
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
13 files changed:
tools/testing/selftests/bpf/bpf_arena_htab.h
tools/testing/selftests/bpf/bpf_arena_strsearch.h
tools/testing/selftests/bpf/libarena/include/bpf_arena_common.h
tools/testing/selftests/bpf/libarena/include/bpf_arena_spin_lock.h
tools/testing/selftests/bpf/libarena/include/libarena/asan.h
tools/testing/selftests/bpf/libarena/include/libarena/buddy.h
tools/testing/selftests/bpf/libarena/selftests/st_asan_buddy.bpf.c
tools/testing/selftests/bpf/libarena/selftests/st_asan_common.h
tools/testing/selftests/bpf/libarena/selftests/st_buddy.bpf.c
tools/testing/selftests/bpf/libarena/src/asan.bpf.c
tools/testing/selftests/bpf/libarena/src/buddy.bpf.c
tools/testing/selftests/bpf/libarena/src/common.bpf.c
tools/testing/selftests/bpf/progs/arena_spin_lock.c

index acc01a876668eca1e8488457c3cc6e941d4488e5..d7ba86362d8620bd83a59e99f9465a43b646bb1d 100644 (file)
@@ -14,9 +14,8 @@ struct htab {
        htab_bucket_t *buckets;
        int n_buckets;
 };
-typedef struct htab __arena htab_t;
 
-static inline htab_bucket_t *__select_bucket(htab_t *htab, __u32 hash)
+static inline htab_bucket_t *__select_bucket(struct htab __arena *htab, __u32 hash)
 {
        htab_bucket_t *b = htab->buckets;
 
@@ -24,7 +23,7 @@ static inline htab_bucket_t *__select_bucket(htab_t *htab, __u32 hash)
        return &b[hash & (htab->n_buckets - 1)];
 }
 
-static inline arena_list_head_t *select_bucket(htab_t *htab, __u32 hash)
+static inline arena_list_head_t *select_bucket(struct htab __arena *htab, __u32 hash)
 {
        return &__select_bucket(htab, hash)->head;
 }
@@ -53,7 +52,7 @@ static int htab_hash(int key)
        return key;
 }
 
-__weak int htab_lookup_elem(htab_t *htab __arg_arena, int key)
+__weak int htab_lookup_elem(struct htab __arena *htab, int key)
 {
        hashtab_elem_t *l_old;
        arena_list_head_t *head;
@@ -66,7 +65,7 @@ __weak int htab_lookup_elem(htab_t *htab __arg_arena, int key)
        return 0;
 }
 
-__weak int htab_update_elem(htab_t *htab __arg_arena, int key, int value)
+__weak int htab_update_elem(struct htab __arena *htab, int key, int value)
 {
        hashtab_elem_t *l_new = NULL, *l_old;
        arena_list_head_t *head;
@@ -90,7 +89,7 @@ __weak int htab_update_elem(htab_t *htab __arg_arena, int key, int value)
        return 0;
 }
 
-void htab_init(htab_t *htab)
+void htab_init(struct htab __arena *htab)
 {
        void __arena *buckets = bpf_arena_alloc_pages(&arena, NULL, 2, NUMA_NO_NODE, 0);
 
index f0d575daef5aaf7df3b794e7c8bf62b2c6820281..10a70667c8bff4d04f62dfb091008489db68d2db 100644 (file)
@@ -3,7 +3,7 @@
 #pragma once
 #include <bpf_arena_common.h>
 
-__noinline int bpf_arena_strlen(const char __arena *s __arg_arena)
+__noinline int bpf_arena_strlen(const char __arena *s)
 {
        const char __arena *sc;
 
@@ -40,7 +40,7 @@ __noinline int bpf_arena_strlen(const char __arena *s __arg_arena)
  *
  * An opening bracket without a matching close is matched literally.
  */
-__noinline bool glob_match(char const __arena *pat __arg_arena, char const __arena *str __arg_arena)
+__noinline bool glob_match(char const __arena *pat, char const __arena *str)
 {
        /*
         * Backtrack to previous * on mismatch and retry starting one
index 445be3c4edecf8cd09bf5244a37c875cf63dae93..82aafe879fae26f5e06948c1ba7f32cb94720365 100644 (file)
@@ -38,7 +38,7 @@
 #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 __attribute__((btf_type_tag("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)
@@ -54,7 +54,6 @@ void bpf_arena_free_pages(void *map, void __arena *ptr, __u32 page_cnt) __ksym _
 #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];
index 164638690a4df80dfb72f5218a11e2adee50c086..ae6b72d15bb67d55347ffb27c98125aae28e7614 100644 (file)
 #define EOPNOTSUPP 95
 #define ETIMEDOUT 110
 
-#ifndef __arena
-#define __arena __attribute__((address_space(1)))
-#endif
-
 extern unsigned long CONFIG_NR_CPUS __kconfig;
 
 /*
@@ -246,7 +242,7 @@ static __always_inline int arena_spin_trylock(arena_spinlock_t __arena *lock)
 }
 
 __noinline __weak
-int arena_spin_lock_slowpath(arena_spinlock_t __arena __arg_arena *lock, u32 val)
+int arena_spin_lock_slowpath(arena_spinlock_t __arena *lock, u32 val)
 {
        struct arena_mcs_spinlock __arena *prev, *next, *node0, *node;
        int ret = -ETIMEDOUT;
index eb9fc69d9eb04caa2b35f03b6b1538a929045b2d..9002671592925a8dad7f5c1dfee3f618c5c79026 100644 (file)
@@ -25,12 +25,10 @@ extern volatile bool asan_report_once;
 
 #ifdef BPF_ARENA_ASAN
 
-typedef s8 __arena s8a;
-
 static inline
-s8a *mem_to_shadow(void __arena __arg_arena *addr)
+s8 __arena *mem_to_shadow(void __arena *addr)
 {
-       return (s8a *)(((u32)(u64)addr >> ASAN_SHADOW_SHIFT) +
+       return (s8 __arena *)(((u32)(u64)addr >> ASAN_SHADOW_SHIFT) +
                        __asan_shadow_memory_dynamic_address);
 }
 
index 00e2437128ef6e8887228375a153cbb8b6e8e1b0..4d57fc1b5c26f367e74e3135f6dd434f0d4aa6d2 100644 (file)
@@ -2,12 +2,6 @@
 /* Copyright (c) 2026 Meta Platforms, Inc. and affiliates. */
 #pragma once
 
-struct buddy_chunk;
-typedef struct buddy_chunk __arena buddy_chunk_t;
-
-struct buddy_header;
-typedef struct buddy_header __arena buddy_header_t;
-
 enum buddy_consts {
        /*
         * Minimum allocation is 1 << BUDDY_MIN_ALLOC_SHIFT.
@@ -68,25 +62,21 @@ struct buddy_chunk {
        u8              allocated[BUDDY_CHUNK_ITEMS / 8];
        /* Freelists for O(1) allocation. */
        u64             freelists[BUDDY_CHUNK_NUM_ORDERS];
-       buddy_chunk_t   *next;
+       struct buddy_chunk __arena      *next;
 };
 
 struct buddy {
-       buddy_chunk_t *first_chunk;             /* Pointer to the chunk linked list. */
+       struct buddy_chunk __arena *first_chunk;                /* Pointer to the chunk linked list. */
        arena_spinlock_t lock;                  /* Allocator lock */
        u64 vaddr;                              /* Allocation into reserved vaddr */
 };
 
-typedef struct buddy __arena buddy_t;
-
 #ifdef __BPF__
 
-int buddy_init(buddy_t *buddy);
-int buddy_destroy(buddy_t *buddy);
-int buddy_free_internal(buddy_t *buddy, u64 free);
-#define buddy_free(buddy, ptr) buddy_free_internal((buddy), (u64)(ptr))
-u64 buddy_alloc_internal(buddy_t *buddy, size_t size);
+int buddy_init(struct buddy __arena *buddy);
+int buddy_destroy(struct buddy __arena *buddy);
+int buddy_free(struct buddy __arena *buddy, void __arena *free);
+u64 buddy_alloc_internal(struct buddy __arena *buddy, size_t size);
 #define buddy_alloc(alloc, size) ((void __arena *)buddy_alloc_internal((alloc), (size)))
 
-
 #endif /* __BPF__  */
index 97acd50ffa5c4b489377736ff72128e572e0dbf5..686caba2c643b5997e623994eff2cd8f0daf9346 100644 (file)
@@ -8,7 +8,7 @@
 /* Required for parsing the ASAN call stacks. */
 #include "test_progs_compat.h"
 
-extern buddy_t buddy;
+extern struct buddy __arena buddy;
 
 #ifdef BPF_ARENA_ASAN
 
@@ -54,7 +54,7 @@ static __always_inline int asan_test_buddy_oob_single(size_t alloc_size)
  * Factored out because asan_validate_addr is complex enough to cause
  * verification failures if verified with the rest of asan_test_buddy_uaf_single.
  */
-__weak int asan_test_buddy_byte(u8 __arena __arg_arena *mem, int i, bool freed)
+__weak int asan_test_buddy_byte(u8 __arena *mem, int i, bool freed)
 {
        int ret;
 
index 1d3edc4372ac097f4ece4e2c5b3f2e0c177b06fc..34a7918cb4cf6c07a79190c08bb64a059c7e007b 100644 (file)
@@ -9,7 +9,7 @@ static inline void print_asan_map_state(void __arena *addr)
 {
        arena_stdout("%s:%d ASAN %p -> (val: %x gran: %x set: [%s])",
                        __func__, __LINE__, addr,
-                       *(s8a *)(addr), ASAN_GRANULE(addr),
+                       *(s8 __arena *)(addr), ASAN_GRANULE(addr),
                        asan_shadow_set(addr) ? "yes" : "no");
 }
 
index 79e6f0baabfe3f352bcb04c69f38e79a50697f23..b45a306816c0e4d826e7e935208bcdaf671c8f5c 100644 (file)
@@ -6,7 +6,7 @@
 #include <libarena/asan.h>
 #include <libarena/buddy.h>
 
-extern buddy_t buddy;
+extern struct buddy __arena buddy;
 
 struct segarr_entry {
        u8 __arena *block;
index 64c5b990086c2da6a396241c95d00a8c3174a9bb..5135d5c72a46d6d1d740540cb27b0d0a5bcac629 100644 (file)
@@ -110,7 +110,7 @@ volatile bool asan_report_once = false;
  * to exit due to a missing implementation. Provide a simple implementation
  * just for memset to use it for poisoning/unpoisoning the map.
  */
-__weak int asan_memset(s8a __arg_arena *dst, s8 val, size_t size)
+__weak int asan_memset(s8 __arena *dst, s8 val, size_t size)
 {
        size_t i;
 
@@ -121,9 +121,9 @@ __weak int asan_memset(s8a __arg_arena *dst, s8 val, size_t size)
 }
 
 /* Validate a 1-byte access, always within a single byte. */
-static __always_inline bool memory_is_poisoned_1(s8a *addr)
+static __always_inline bool memory_is_poisoned_1(s8 __arena *addr)
 {
-       s8 shadow_value = *(s8a *)mem_to_shadow(addr);
+       s8 shadow_value = *(s8 __arena *)mem_to_shadow(addr);
 
        /* Byte is 0, access is valid. */
        if (likely(!shadow_value))
@@ -139,7 +139,7 @@ static __always_inline bool memory_is_poisoned_1(s8a *addr)
 }
 
 /* Validate a 2- 4-, 8-byte access, shadow spans up to 2 bytes. */
-static __always_inline bool memory_is_poisoned_2_4_8(s8a *addr, u64 size)
+static __always_inline bool memory_is_poisoned_2_4_8(s8 __arena *addr, u64 size)
 {
        u64 end = (u64)addr + size - 1;
 
@@ -148,17 +148,17 @@ static __always_inline bool memory_is_poisoned_2_4_8(s8a *addr, u64 size)
         * overflow above ASAN_GRANULE).
         */
        if (likely(ASAN_GRANULE(end) >= size - 1))
-               return memory_is_poisoned_1((s8a *)end);
+               return memory_is_poisoned_1((s8 __arena *)end);
 
        /*
         * Otherwise first byte must be fully unpoisoned, and second byte
         * must be unpoisoned up to the end of the accessed region.
         */
 
-       return *(s8a *)mem_to_shadow(addr) || memory_is_poisoned_1((s8a *)end);
+       return *(s8 __arena *)mem_to_shadow(addr) || memory_is_poisoned_1((s8 __arena *)end);
 }
 
-__weak bool asan_shadow_set(void __arena __arg_arena *addr)
+__weak bool asan_shadow_set(void __arena *addr)
 {
        return memory_is_poisoned_1(addr);
 }
@@ -166,7 +166,7 @@ __weak bool asan_shadow_set(void __arena __arg_arena *addr)
 static __always_inline u64 first_nonzero_byte(u64 addr, size_t size)
 {
        while (size && can_loop) {
-               if (unlikely(*(s8a *)addr))
+               if (unlikely(*(s8 __arena *)addr))
                        return addr;
                addr += 1;
                size -= 1;
@@ -175,7 +175,7 @@ static __always_inline u64 first_nonzero_byte(u64 addr, size_t size)
        return SHADOW_ALL_ZEROES;
 }
 
-static __always_inline bool memory_is_poisoned_n(s8a *addr, u64 size)
+static __always_inline bool memory_is_poisoned_n(s8 __arena *addr, u64 size)
 {
        u64 ret;
        u64 start;
@@ -189,10 +189,10 @@ static __always_inline bool memory_is_poisoned_n(s8a *addr, u64 size)
        if (likely(ret == SHADOW_ALL_ZEROES))
                return false;
 
-       return unlikely(ret != end || ASAN_GRANULE(addr + size - 1) >= *(s8a *)end);
+       return unlikely(ret != end || ASAN_GRANULE(addr + size - 1) >= *(s8 __arena *)end);
 }
 
-__weak int asan_report(s8a __arg_arena *addr, size_t sz, u32 flags)
+__weak int asan_report(s8 __arena *addr, size_t sz, u32 flags)
 {
        u32 reported = __sync_val_compare_and_swap(&asan_reported, false, true);
 
@@ -211,7 +211,7 @@ __weak int asan_report(s8a __arg_arena *addr, size_t sz, u32 flags)
        return 0;
 }
 
-static __always_inline bool check_asan_args(s8a *addr, size_t size,
+static __always_inline bool check_asan_args(s8 __arena *addr, size_t size,
                                            bool *result)
 {
        bool valid = true;
@@ -253,7 +253,7 @@ confirmed_valid:
 static __always_inline bool check_region_inline(intptr_t ptr, size_t size,
                                                u32 flags)
 {
-       s8a *addr = (s8a *)(u64)ptr;
+       s8 __arena *addr = (s8 __arena *)(u64)ptr;
        bool is_poisoned, is_valid;
 
        if (check_asan_args(addr, size, &is_valid)) {
@@ -305,19 +305,19 @@ static __always_inline bool check_region_inline(intptr_t ptr, size_t size,
        }                                                             \
        __hidden void __asan_report_store##size(intptr_t addr)           \
        {                                                             \
-               asan_report((s8a *)addr, size, ASAN_WRITE);           \
+               asan_report((s8 __arena *)addr, size, ASAN_WRITE);           \
        }                                                             \
        __hidden void __asan_report_store##size##_noabort(intptr_t addr) \
        {                                                             \
-               asan_report((s8a *)addr, size, ASAN_WRITE);           \
+               asan_report((s8 __arena *)addr, size, ASAN_WRITE);           \
        }                                                             \
        __hidden void __asan_report_load##size(intptr_t addr)            \
        {                                                             \
-               asan_report((s8a *)addr, size, ASAN_READ);            \
+               asan_report((s8 __arena *)addr, size, ASAN_READ);            \
        }                                                             \
        __hidden void __asan_report_load##size##_noabort(intptr_t addr)  \
        {                                                             \
-               asan_report((s8a *)addr, size, ASAN_READ);            \
+               asan_report((s8 __arena *)addr, size, ASAN_READ);            \
        }
 
 DEFINE_ASAN_LOAD_STORE(1);
@@ -385,7 +385,7 @@ void *__asan_memset(void *p, int c, size_t n)
  */
 __hidden __noasan int asan_poison(void __arena *addr, s8 val, size_t size)
 {
-       s8a *shadow;
+       s8 __arena *shadow;
        size_t len;
 
        /*
@@ -443,7 +443,7 @@ __hidden __noasan int asan_poison(void __arena *addr, s8 val, size_t size)
 __hidden __noasan int asan_unpoison(void __arena *addr, size_t size)
 {
        size_t partial = size & ASAN_GRANULE_MASK;
-       s8a *shadow;
+       s8 __arena *shadow;
        size_t len;
 
        /*
index 865e00803daa2e885c53b59832d5958d4edc3530..f4ed4c3abb4b026356a86fd50e041d816bfbc8c6 100644 (file)
@@ -45,12 +45,12 @@ enum {
        BUDDY_CHUNK_PAGES       = BUDDY_CHUNK_BYTES / __PAGE_SIZE
 };
 
-static inline int buddy_lock(buddy_t *buddy)
+static inline int buddy_lock(struct buddy __arena *buddy)
 {
        return arena_spin_lock(&buddy->lock);
 }
 
-static inline void buddy_unlock(buddy_t *buddy)
+static inline void buddy_unlock(struct buddy __arena *buddy)
 {
        arena_spin_unlock(&buddy->lock);
 }
@@ -61,7 +61,7 @@ static inline void buddy_unlock(buddy_t *buddy)
  * page alloc kfuncs do not support aligning to a boundary (in this
  * case 1 MiB, see buddy.h on how this is derived).
  */
-static int buddy_reserve_arena_vaddr(buddy_t *buddy)
+static int buddy_reserve_arena_vaddr(struct buddy __arena *buddy)
 {
        buddy->vaddr = 0;
 
@@ -73,7 +73,7 @@ static int buddy_reserve_arena_vaddr(buddy_t *buddy)
 /*
  * Free up any unused address space. Used only during teardown.
  */
-static void buddy_unreserve_arena_vaddr(buddy_t *buddy)
+static void buddy_unreserve_arena_vaddr(struct buddy __arena *buddy)
 {
        bpf_arena_free_pages(
                &arena, (void __arena *)(BUDDY_VADDR_OFFSET + buddy->vaddr),
@@ -94,7 +94,7 @@ static void buddy_unreserve_arena_vaddr(buddy_t *buddy)
  * However, bump allocation must still be atomic because this function
  * is called without the buddy lock from multiple threads concurrently.
  */
-__weak int buddy_alloc_arena_vaddr(buddy_t __arg_arena *buddy, u64 *vaddrp)
+__weak int buddy_alloc_arena_vaddr(struct buddy __arena *buddy, u64 *vaddrp)
 {
        u64 vaddr, old, new;
 
@@ -134,7 +134,7 @@ static u64 arena_next_pow2(__u64 n)
 }
 
 __weak
-int idx_set_allocated(buddy_chunk_t __arg_arena *chunk, u64 idx, bool allocated)
+int idx_set_allocated(struct buddy_chunk __arena *chunk, u64 idx, bool allocated)
 {
        bool already_allocated;
 
@@ -160,7 +160,7 @@ int idx_set_allocated(buddy_chunk_t __arg_arena *chunk, u64 idx, bool allocated)
        return 0;
 }
 
-static int idx_is_allocated(buddy_chunk_t *chunk, u64 idx, bool *allocated)
+static int idx_is_allocated(struct buddy_chunk __arena *chunk, u64 idx, bool *allocated)
 {
        if (unlikely(idx >= BUDDY_CHUNK_ITEMS)) {
                arena_stderr("getting state of invalid idx (%llu, max %d)\n", idx,
@@ -173,7 +173,7 @@ static int idx_is_allocated(buddy_chunk_t *chunk, u64 idx, bool *allocated)
 }
 
 __weak
-int idx_set_order(buddy_chunk_t __arg_arena *chunk, u64 idx, u8 order)
+int idx_set_order(struct buddy_chunk __arena *chunk, u64 idx, u8 order)
 {
        u8 prev_order;
 
@@ -206,7 +206,7 @@ int idx_set_order(buddy_chunk_t __arg_arena *chunk, u64 idx, u8 order)
        return 0;
 }
 
-static u8 idx_get_order(buddy_chunk_t *chunk, u64 idx)
+static u8 idx_get_order(struct buddy_chunk __arena *chunk, u64 idx)
 {
        u8 result;
 
@@ -223,7 +223,7 @@ static u8 idx_get_order(buddy_chunk_t *chunk, u64 idx)
        return (idx & 0x1) ? (result & 0xf) : (result >> 4);
 }
 
-static void __arena *idx_to_addr(buddy_chunk_t *chunk, size_t idx)
+static void __arena *idx_to_addr(struct buddy_chunk __arena *chunk, size_t idx)
 {
        u64 address;
 
@@ -246,7 +246,7 @@ static void __arena *idx_to_addr(buddy_chunk_t *chunk, size_t idx)
        return (void __arena *)address;
 }
 
-static buddy_header_t *idx_to_header(buddy_chunk_t *chunk, size_t idx)
+static struct buddy_header __arena *idx_to_header(struct buddy_chunk __arena *chunk, size_t idx)
 {
        bool allocated;
        u64 address;
@@ -283,13 +283,13 @@ static buddy_header_t *idx_to_header(buddy_chunk_t *chunk, size_t idx)
         * less probable.
         */
 
-       return (buddy_header_t *)(address + BUDDY_HEADER_OFF);
+       return (struct buddy_header __arena *)(address + BUDDY_HEADER_OFF);
 }
 
-static void header_add_freelist(buddy_chunk_t *chunk, buddy_header_t *header,
+static void header_add_freelist(struct buddy_chunk __arena *chunk, struct buddy_header __arena *header,
                u64 idx, u8 order)
 {
-       buddy_header_t *tmp_header;
+       struct buddy_header __arena *tmp_header;
 
        idx_set_order(chunk, idx, order);
 
@@ -304,10 +304,10 @@ static void header_add_freelist(buddy_chunk_t *chunk, buddy_header_t *header,
        chunk->freelists[order] = idx;
 }
 
-static void header_remove_freelist(buddy_chunk_t  *chunk,
-                                  buddy_header_t *header, u8 order)
+static void header_remove_freelist(struct buddy_chunk __arena  *chunk,
+                                  struct buddy_header __arena *header, u8 order)
 {
-       buddy_header_t *tmp_header;
+       struct buddy_header __arena *tmp_header;
 
        if (header->prev_index != BUDDY_CHUNK_ITEMS) {
                tmp_header = idx_to_header(chunk, header->prev_index);
@@ -356,10 +356,10 @@ static u64 size_to_order(size_t size)
 }
 
 __weak
-int add_leftovers_to_freelist(buddy_chunk_t __arg_arena *chunk, u32 cur_idx,
+int add_leftovers_to_freelist(struct buddy_chunk __arena *chunk, u32 cur_idx,
                u64 min_order, u64 max_order)
 {
-       buddy_header_t *header;
+       struct buddy_header __arena *header;
        u64 ord;
        u32 idx;
 
@@ -381,10 +381,10 @@ int add_leftovers_to_freelist(buddy_chunk_t __arg_arena *chunk, u32 cur_idx,
        return 0;
 }
 
-static buddy_chunk_t *buddy_chunk_get(buddy_t *buddy)
+static struct buddy_chunk __arena *buddy_chunk_get(struct buddy __arena *buddy)
 {
        u64 order, ord, min_order, max_order;
-       buddy_chunk_t  *chunk;
+       struct buddy_chunk __arena  *chunk;
        size_t left;
        int power2;
        u64 vaddr;
@@ -561,9 +561,9 @@ static buddy_chunk_t *buddy_chunk_get(buddy_t *buddy)
        return chunk;
 }
 
-__weak int buddy_init(buddy_t __arg_arena *buddy)
+__weak int buddy_init(struct buddy __arena *buddy)
 {
-       buddy_chunk_t *chunk;
+       struct buddy_chunk __arena *chunk;
        int ret;
 
        if (!asan_ready())
@@ -602,9 +602,9 @@ __weak int buddy_init(buddy_t __arg_arena *buddy)
  * We do not take a lock because we are freeing arena pages, and nobody should
  * be using the allocator at that point in the execution.
  */
-__weak int buddy_destroy(buddy_t __arg_arena *buddy)
+__weak int buddy_destroy(struct buddy __arena *buddy)
 {
-       buddy_chunk_t *chunk, *next;
+       struct buddy_chunk __arena *chunk, *next;
 
        if (!buddy)
                return -EINVAL;
@@ -631,9 +631,9 @@ __weak int buddy_destroy(buddy_t __arg_arena *buddy)
        return 0;
 }
 
-__weak u64 buddy_chunk_alloc(buddy_chunk_t __arg_arena *chunk, int order_req)
+__weak u64 buddy_chunk_alloc(struct buddy_chunk __arena *chunk, int order_req)
 {
-       buddy_header_t *header, *tmp_header, *next_header;
+       struct buddy_header __arena *header, *tmp_header, *next_header;
        u32 idx, tmpidx, retidx;
        u64 address;
        u64 order = 0;
@@ -709,9 +709,9 @@ __weak u64 buddy_chunk_alloc(buddy_chunk_t __arg_arena *chunk, int order_req)
 }
 
 /* Scan the existing chunks for available memory. */
-static u64 buddy_alloc_from_existing_chunks(buddy_t *buddy, int order)
+static u64 buddy_alloc_from_existing_chunks(struct buddy __arena *buddy, int order)
 {
-       buddy_chunk_t *chunk;
+       struct buddy_chunk __arena *chunk;
        u64 address;
 
        for (chunk = buddy->first_chunk; chunk != NULL && can_loop;
@@ -728,7 +728,7 @@ static u64 buddy_alloc_from_existing_chunks(buddy_t *buddy, int order)
  * Try an allocation from a newly allocated chunk. Also
  * incorporate the chunk into the linked list.
  */
-static u64 buddy_alloc_from_new_chunk(buddy_t *buddy, buddy_chunk_t *chunk, int order)
+static u64 buddy_alloc_from_new_chunk(struct buddy __arena *buddy, struct buddy_chunk __arena *chunk, int order)
 {
        u64 address;
 
@@ -750,10 +750,10 @@ static u64 buddy_alloc_from_new_chunk(buddy_t *buddy, buddy_chunk_t *chunk, int
        return (u64)address;
 }
 __weak
-u64 buddy_alloc_internal(buddy_t __arg_arena *buddy, size_t size)
+u64 buddy_alloc_internal(struct buddy __arena *buddy, size_t size)
 {
-       buddy_chunk_t *chunk;
        u64 address = (u64)NULL;
+       struct buddy_chunk __arena *chunk;
        int order;
 
        if (!buddy)
@@ -788,20 +788,20 @@ done:
         * data is smaller than the header, we must poison any
         * unused bytes that were part of the header.
         */
-       if (size < BUDDY_HEADER_OFF + sizeof(buddy_header_t))
-               asan_poison((u8 __arena *)address + BUDDY_HEADER_OFF,
-                           BUDDY_POISONED, sizeof(buddy_header_t));
+       if (size < BUDDY_HEADER_OFF + sizeof(struct buddy_header __arena))
+               asan_poison((u8 __arena *)address + BUDDY_HEADER_OFF, BUDDY_POISONED,
+                           sizeof(struct buddy_header __arena));
 
        asan_unpoison((u8 __arena *)address, size);
 
        return address;
 }
 
-static __always_inline int buddy_free_unlocked(buddy_t *buddy, u64 addr)
+static __always_inline int buddy_free_unlocked(struct buddy __arena *buddy, u64 addr)
 {
-       buddy_header_t *header, *buddy_header;
+       struct buddy_header __arena *header, *buddy_header;
        u64 idx, buddy_idx, tmp_idx;
-       buddy_chunk_t *chunk;
+       struct buddy_chunk __arena *chunk;
        bool allocated;
        u8 order;
        int ret;
@@ -878,7 +878,7 @@ static __always_inline int buddy_free_unlocked(buddy_t *buddy, u64 addr)
        return 0;
 }
 
-__weak int buddy_free_internal(buddy_t __arg_arena *buddy, u64 addr)
+__weak int buddy_free(struct buddy __arena *buddy, void __arena *addr)
 {
        int ret;
 
@@ -893,7 +893,7 @@ __weak int buddy_free_internal(buddy_t __arg_arena *buddy, u64 addr)
        if (ret)
                return ret;
 
-       ret = buddy_free_unlocked(buddy, addr);
+       ret = buddy_free_unlocked(buddy, (u64)addr);
 
        buddy_unlock(buddy);
 
index 544bf9e1cb38f53e2ecc4748498a641c44a3b72b..ec9de29e6f3ee9a3890f55babeb07b913cbe5aa2 100644 (file)
@@ -6,7 +6,7 @@
 
 const volatile u32 zero = 0;
 
-buddy_t buddy;
+struct buddy __arena buddy;
 
 int arena_fls(__u64 word)
 {
@@ -43,9 +43,9 @@ __weak u64 arena_malloc_internal(size_t size)
        return buddy_alloc_internal(&buddy, size);
 }
 
-__weak void arena_free(void __arg_arena __arena *ptr)
+__weak void arena_free(void __arena *ptr)
 {
-       buddy_free_internal(&buddy, (u64)ptr);
+       buddy_free(&buddy, ptr);
 }
 
 
index 7236d92d382f1a23ab3e2d282bccda9991be21e9..cf7cda79c16c0ce50de06f2b994d5d0b849786ad 100644 (file)
@@ -4,6 +4,7 @@
 #include <bpf/bpf_tracing.h>
 #include <bpf/bpf_helpers.h>
 #include "bpf_misc.h"
+#include <bpf_arena_common.h>
 #include <bpf_arena_spin_lock.h>
 
 struct {