All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Emil Tsalapatis" <emil@etsalapatis.com>
To: "Alexei Starovoitov" <alexei.starovoitov@gmail.com>,
	"Emil Tsalapatis" <emil@etsalapatis.com>
Cc: "bpf" <bpf@vger.kernel.org>,
	"Alexei Starovoitov" <ast@kernel.org>,
	"Andrii Nakryiko" <andrii@kernel.org>,
	"Kumar Kartikeya Dwivedi" <memxor@gmail.com>,
	"Daniel Borkmann" <daniel@iogearbox.net>,
	"Eduard" <eddyz87@gmail.com>, "Song Liu" <song@kernel.org>
Subject: Re: [PATCH bpf-next v4 5/9] selftests/bpf: Add basic libarena scaffolding
Date: Wed, 08 Apr 2026 20:18:18 -0400	[thread overview]
Message-ID: <DHO6YBPIPV5A.ZIBDPIXBG1NT@etsalapatis.com> (raw)
In-Reply-To: <CAADnVQLCyP+NzO9-332JO+dBe=EDEOr+ax+-ZrvAqJ9yTNYyEA@mail.gmail.com>

On Tue Apr 7, 2026 at 12:21 PM EDT, Alexei Starovoitov wrote:
> On Mon, Apr 6, 2026 at 9:57 PM Emil Tsalapatis <emil@etsalapatis.com> wrote:
>>
>> Add initial code for an arena-based BPF library. The current commit
>> introduces a test runner and Makefile for the library. Library code
>> can be added just by including the source file in the library's src/
>> subdirectory. Future commits will introduce the library code itself.
>>
>> The current commit also includes a standalone test runner. This is
>> to keep libarena self-contained and testable even when copied out
>> of the kernel tree. Subsequent commits add integration with test_progs.
>>
>> Signed-off-by: Emil Tsalapatis <emil@etsalapatis.com>
>> ---
>>  tools/testing/selftests/bpf/.gitignore        |   1 +
>>  tools/testing/selftests/bpf/Makefile          |  15 ++
>>  tools/testing/selftests/bpf/libarena/Makefile |  50 ++++++
>>  .../selftests/bpf/libarena/include/common.h   |  49 ++++++
>>  .../bpf/libarena/include/selftest_helpers.h   |  81 ++++++++++
>>  .../selftests/bpf/libarena/include/userapi.h  |  26 +++
>>  .../bpf/libarena/selftests/selftest.c         | 153 ++++++++++++++++++
>>  .../bpf/libarena/selftests/selftest.h         |  12 ++
>>  .../selftests/bpf/libarena/src/common.bpf.c   |  65 ++++++++
>>  9 files changed, 452 insertions(+)
>>  create mode 100644 tools/testing/selftests/bpf/libarena/Makefile
>>  create mode 100644 tools/testing/selftests/bpf/libarena/include/common.h
>>  create mode 100644 tools/testing/selftests/bpf/libarena/include/selftest_helpers.h
>>  create mode 100644 tools/testing/selftests/bpf/libarena/include/userapi.h
>>  create mode 100644 tools/testing/selftests/bpf/libarena/selftests/selftest.c
>>  create mode 100644 tools/testing/selftests/bpf/libarena/selftests/selftest.h
>>  create mode 100644 tools/testing/selftests/bpf/libarena/src/common.bpf.c
>>
>> diff --git a/tools/testing/selftests/bpf/.gitignore b/tools/testing/selftests/bpf/.gitignore
>> index bfdc5518ecc8..7f1960d6b59e 100644
>> --- a/tools/testing/selftests/bpf/.gitignore
>> +++ b/tools/testing/selftests/bpf/.gitignore
>> @@ -49,3 +49,4 @@ verification_cert.h
>>  *.BTF.base
>>  usdt_1
>>  usdt_2
>> +libarena/test_libarena
>> diff --git a/tools/testing/selftests/bpf/Makefile b/tools/testing/selftests/bpf/Makefile
>> index f75c4f52c028..0d332c991023 100644
>> --- a/tools/testing/selftests/bpf/Makefile
>> +++ b/tools/testing/selftests/bpf/Makefile
>> @@ -153,6 +153,7 @@ override define CLEAN
>>         $(Q)$(RM) -r $(TEST_KMODS)
>>         $(Q)$(RM) -r $(EXTRA_CLEAN)
>>         $(Q)$(MAKE) -C test_kmods clean
>> +       $(Q)$(MAKE) -C libarena clean
>>         $(Q)$(MAKE) docs-clean
>>  endef
>>
>> @@ -739,6 +740,17 @@ $(VERIFY_SIG_HDR): $(VERIFICATION_CERT)
>>          echo "};"; \
>>          echo "unsigned int test_progs_verification_cert_len = $$(wc -c < $<);") > $@
>>
>> +LIBARENA_MAKE_ARGS = \
>> +               BPFTOOL="$(BPFTOOL)" \
>> +               INCLUDE_DIR="$(HOST_INCLUDE_DIR)" \
>> +               LIBBPF_INCLUDE="$(HOST_INCLUDE_DIR)" \
>> +               BPFOBJ="$(BPFOBJ)" \
>> +               LDLIBS="$(LDLIBS) -lzstd" \
>> +               CLANG="$(CLANG)" \
>> +               BPF_CFLAGS="$(BPF_CFLAGS) $(CLANG_CFLAGS)" \
>> +               BPF_TARGET_ENDIAN="$(BPF_TARGET_ENDIAN)" \
>> +               Q="$(Q)"
>> +
>>  # Define test_progs test runner.
>>  TRUNNER_TESTS_DIR := prog_tests
>>  TRUNNER_BPF_PROGS_DIR := progs
>> @@ -931,3 +943,6 @@ override define INSTALL_RULE
>>                 rsync -a $(OUTPUT)/$$DIR/*.bpf.o $(INSTALL_PATH)/$$DIR;\
>>         done
>>  endef
>> +
>> +test_libarena: $(INCLUDE_DIR)/vmlinux.h $(BPFOBJ)
>> +       +$(MAKE) -C libarena $@ $(LIBARENA_MAKE_ARGS)
>> diff --git a/tools/testing/selftests/bpf/libarena/Makefile b/tools/testing/selftests/bpf/libarena/Makefile
>> new file mode 100644
>> index 000000000000..151ab6d0509c
>> --- /dev/null
>> +++ b/tools/testing/selftests/bpf/libarena/Makefile
>> @@ -0,0 +1,50 @@
>> +# SPDX-License-Identifier: LGPL-2.1 OR BSD-2-Clause
>> +# Copyright (c) 2026 Meta Platforms, Inc. and affiliates.
>> +
>> +.PHONY: clean
>> +
>> +LIBARENA=$(abspath .)
>> +
>> +
>> +LIBARENA_SOURCES = $(wildcard $(LIBARENA)/src/*.bpf.c) $(wildcard $(LIBARENA)/selftests/*.bpf.c)
>> +LIBARENA_OBJECTS = $(notdir $(LIBARENA_SOURCES:.bpf.c=.bpf.o))
>> +
>> +INCLUDES = -I$(LIBARENA)/include -I$(LIBARENA)/..
>> +ifneq ($(INCLUDE_DIR),)
>> +INCLUDES += -I$(INCLUDE_DIR)
>> +endif
>> +ifneq ($(LIBBPF_INCLUDE),)
>> +INCLUDES += -I$(LIBBPF_INCLUDE)
>> +endif
>> +
>> +# ENABLE_ATOMICS_TESTS required because we use arena spinlocks
>> +override BPF_CFLAGS += -DENABLE_ATOMICS_TESTS
>> +override BPF_CFLAGS += -O2 -Wno-incompatible-pointer-types-discards-qualifiers
>> +override BPF_CFLAGS += $(INCLUDES)
>> +
>> +CFLAGS = -O2 -no-pie
>> +CFLAGS += $(INCLUDES)
>> +
>> +vpath %.bpf.c $(LIBARENA)/src $(LIBARENA)/selftests
>> +vpath %.c $(LIBARENA)/src $(LIBARENA)/selftests
>> +
>> +all: test_libarena
>> +
>> +test_libarena: selftest.c $(BPFOBJ) libarena.skel.h
>> +       $(call msg,BINARY,libarena,$@)
>> +       $(Q)$(CLANG) $(CFLAGS) $< $(BPFOBJ) $(LDLIBS) -o $@
>> +
>> +libarena.skel.h: main.bpf.o
>> +       $(call msg,GEN-SKEL,libarena,$@)
>> +       $(Q)$(BPFTOOL) gen skeleton $< name "libarena" > $@
>> +
>> +main.bpf.o: $(LIBARENA_OBJECTS)
>> +       $(call msg,GEN-OBJ,libarena,$@)
>> +       $(Q)$(BPFTOOL) gen object $@ $^
>> +
>> +%.bpf.o: %.bpf.c
>> +       $(call msg,CLNG-BPF,libarena,$@)
>> +       $(Q)$(CLANG) $(BPF_CFLAGS) $(BPF_TARGET_ENDIAN) -c $< -o $@
>> +
>> +clean:
>> +       $(Q)rm -f *.skel.h *.bpf.o test_libarena
>> diff --git a/tools/testing/selftests/bpf/libarena/include/common.h b/tools/testing/selftests/bpf/libarena/include/common.h
>> new file mode 100644
>> index 000000000000..544a398a0d1e
>> --- /dev/null
>> +++ b/tools/testing/selftests/bpf/libarena/include/common.h
>> @@ -0,0 +1,49 @@
>> +// SPDX-License-Identifier: LGPL-2.1 OR BSD-2-Clause
>> +/* Copyright (c) 2026 Meta Platforms, Inc. and affiliates. */
>> +#pragma once
>> +
>> +#ifdef __BPF__
>
> Are you trying to re-use this common.h in user space code?
>
>> +
>> +#include <vmlinux.h>
>> +
>> +#include "bpf_experimental.h"
>> +#include "bpf_arena_common.h"
>> +#include "bpf_arena_spin_lock.h"
>> +
>> +#include <asm-generic/errno.h>
>> +
>> +#ifndef __BPF_FEATURE_ADDR_SPACE_CAST
>> +#error "Arena allocators require bpf_addr_space_cast feature"
>> +#endif
>> +
>> +#define arena_stdout(fmt, ...) bpf_stream_printk(1, (fmt), ##__VA_ARGS__)
>> +#define arena_stderr(fmt, ...) bpf_stream_printk(2, (fmt), ##__VA_ARGS__)
>> +
>> +#ifndef __maybe_unused
>> +#define __maybe_unused __attribute__((__unused__))
>> +#endif
>> +
>> +#define private(name) SEC(".data." #name) __hidden __attribute__((aligned(8)))
>> +
>> +#define ARENA_PAGES (1UL << (32 - __builtin_ffs(__PAGE_SIZE) + 1))
>> +
>> +struct {
>> +       __uint(type, BPF_MAP_TYPE_ARENA);
>> +       __uint(map_flags, BPF_F_MMAPABLE);
>> +       __uint(max_entries, ARENA_PAGES); /* number of pages */
>> +#if defined(__TARGET_ARCH_arm64) || defined(__aarch64__)
>> +        __ulong(map_extra, (1ull << 32)); /* start of mmap() region */
>> +#else
>> +        __ulong(map_extra, (1ull << 44)); /* start of mmap() region */
>> +#endif
>> +} arena __weak SEC(".maps");
>> +
>> +extern const volatile u32 zero;
>> +
>> +int arena_fls(__u64 word);
>> +
>> +#endif /* __BPF__ */
>> +
>> +struct arena_get_base_args {
>> +       void __arena *arena_base;
>> +};
>
> If so, then how above suppose to compile in user space?
> __arena is not defined yet.
>
>> diff --git a/tools/testing/selftests/bpf/libarena/include/selftest_helpers.h b/tools/testing/selftests/bpf/libarena/include/selftest_helpers.h
>> new file mode 100644
>> index 000000000000..ee445d8f5b26
>> --- /dev/null
>> +++ b/tools/testing/selftests/bpf/libarena/include/selftest_helpers.h
>> @@ -0,0 +1,81 @@
>> +// SPDX-License-Identifier: LGPL-2.1 OR BSD-2-Clause
>> +/* Copyright (c) 2026 Meta Platforms, Inc. and affiliates. */
>> +#pragma once
>> +
>> +#include <errno.h>
>> +#include <stdlib.h>
>> +#include <unistd.h>
>> +#include <sys/mman.h>
>> +
>> +#include <bpf/libbpf.h>
>> +#include <bpf/bpf.h>
>> +
>> +static inline int libarena_run_prog(int prog_fd)
>> +{
>> +       LIBBPF_OPTS(bpf_test_run_opts, opts);
>> +       int ret;
>> +
>> +       ret = bpf_prog_test_run_opts(prog_fd, &opts);
>> +       if (ret)
>> +               return ret;
>> +
>> +       return opts.retval;
>> +}
>> +
>> +static inline int libarena_get_arena_base(int arena_get_base_fd,
>> +                                         void **arena_base)
>> +{
>> +       LIBBPF_OPTS(bpf_test_run_opts, opts);
>> +       struct arena_get_base_args args = { .arena_base = NULL };
>> +       int ret;
>> +
>> +       opts.ctx_in = &args;
>> +       opts.ctx_size_in = sizeof(args);
>> +
>> +       ret = bpf_prog_test_run_opts(arena_get_base_fd, &opts);
>> +       if (ret)
>> +               return ret;
>> +       if (opts.retval)
>> +               return opts.retval;
>> +
>> +       *arena_base = args.arena_base;
>> +       return 0;
>> +}
>> +
>> +static inline int libarena_get_globals_pages(int arena_get_base_fd,
>> +                                            size_t arena_all_pages,
>> +                                            u64 *globals_pages)
>> +{
>> +       size_t pgsize = sysconf(_SC_PAGESIZE);
>> +       void *arena_base;
>> +       ssize_t i;
>> +       u8 *vec;
>> +       int ret;
>> +
>> +       ret = libarena_get_arena_base(arena_get_base_fd, &arena_base);
>> +       if (ret)
>> +               return ret;
>> +
>> +       if (!arena_base)
>> +               return -EINVAL;
>> +
>> +       vec = calloc(arena_all_pages, sizeof(*vec));
>> +       if (!vec)
>> +               return -ENOMEM;
>> +
>> +       if (mincore(arena_base, arena_all_pages * pgsize, vec) < 0) {
>> +               ret = -errno;
>> +               free(vec);
>> +               return ret;
>> +       }
>> +
>> +       *globals_pages = 0;
>> +       for (i = arena_all_pages - 1; i >= 0; i--) {
>> +               if (!(vec[i] & 0x1))
>> +                       break;
>> +               *globals_pages += 1;
>> +       }
>> +
>> +       free(vec);
>> +       return 0;
>> +}
>> diff --git a/tools/testing/selftests/bpf/libarena/include/userapi.h b/tools/testing/selftests/bpf/libarena/include/userapi.h
>> new file mode 100644
>> index 000000000000..b4ac6bc9bd79
>> --- /dev/null
>> +++ b/tools/testing/selftests/bpf/libarena/include/userapi.h
>> @@ -0,0 +1,26 @@
>> +// SPDX-License-Identifier: LGPL-2.1 OR BSD-2-Clause
>> +/* Copyright (c) 2026 Meta Platforms, Inc. and affiliates. */
>> +#pragma once
>> +
>> +#include <stdint.h>
>> +
>> +/*
>> + * Header for the userspace C programs that load
>> + * and initialize the BPF code.
>> + */
>> +
>> +#define __arena
>> +
>> +typedef uint8_t u8;
>> +typedef uint16_t u16;
>> +typedef uint32_t u32;
>> +typedef uint64_t u64;
>> +typedef int8_t s8;
>> +typedef int16_t s16;
>> +typedef int32_t s32;
>> +typedef int64_t s64;
>> +
>> +/* Dummy "definition" for userspace. */
>> +#define arena_spinlock_t u64
>> +
>> +#include "common.h"
>
> ohh. So user space _must_ include userapi.h first ?
> Why is this not part of common.h ?
> Why bother with extra userapi.h header?
>
>> diff --git a/tools/testing/selftests/bpf/libarena/selftests/selftest.c b/tools/testing/selftests/bpf/libarena/selftests/selftest.c
>> new file mode 100644
>> index 000000000000..b69adc7baaab
>> --- /dev/null
>> +++ b/tools/testing/selftests/bpf/libarena/selftests/selftest.c
>> @@ -0,0 +1,153 @@
>> +// SPDX-License-Identifier: LGPL-2.1 OR BSD-2-Clause
>> +/* Copyright (c) 2026 Meta Platforms, Inc. and affiliates. */
>> +
>> +#define _GNU_SOURCE
>> +#include <assert.h>
>> +#include <errno.h>
>> +#include <stdio.h>
>> +#include <string.h>
>> +#include <unistd.h>
>> +
>> +#include <bpf/libbpf.h>
>> +#include <bpf/bpf.h>
>> +
>> +#include <sys/mman.h>
>> +#include <sys/resource.h>
>> +#include <sys/sysinfo.h>
>> +
>> +#include <userapi.h>
>> +#include <selftest_helpers.h>
>> +
>> +#include "../libarena.skel.h"
>> +typedef struct libarena selftest;
>> +#define selftest__open libarena__open
>> +#define selftest__open_and_load libarena__open_and_load
>> +#define selftest__load libarena__load
>> +#define selftest__attach libarena__attach
>> +#define selftest__destroy libarena__destroy
>
> I don't like this obfuscation.
> What's the point of these #define-s?
>
>> +
>> +static bool verbose = false;
>> +static int testno = 1;
>> +
>> +static int
>> +run_prog_verbose(int prog_fd)
>> +{
>> +       char buf[1024];
>> +       int ret, err;
>> +
>> +       ret = libarena_run_prog(prog_fd);
>> +
>> +       if (ret)
>> +               fprintf(stderr, "error %d in %s\n", ret, __func__);
>> +
>> +       if (verbose) {
>> +               printf("BPF stdout:\n");
>> +               while ((err = bpf_prog_stream_read(prog_fd, 1, buf, 1024, NULL)) > 0)
>> +                       printf("%.*s", err, buf);
>> +
>> +               if (err)
>> +                       return err;
>> +
>> +               printf("BPF stderr:\n");
>> +               while ((err = bpf_prog_stream_read(prog_fd, 2, buf, 1024, NULL)) > 0)
>> +                       printf("%.*s", err, buf);
>> +
>> +               if (err)
>> +                       return err;
>> +       }
>> +
>> +       return ret;
>> +}
>> +
>> +static int libbpf_print_fn(enum libbpf_print_level level,
>> +               const char *format, va_list args)
>> +{
>> +       if (level == LIBBPF_DEBUG)
>> +               return 0;
>> +       return vfprintf(stderr, format, args);
>> +}
>> +
>> +int run_test(selftest *skel, const struct bpf_program *prog)
>> +{
>> +       int prog_fd;
>> +       int ret;
>> +
>> +       ret = libarena_run_prog(bpf_program__fd(skel->progs.arena_alloc_reserve));
>> +       if (ret)
>> +               return ret;
>> +
>> +       prog_fd = bpf_program__fd(prog);
>> +       if (prog_fd < 0)
>> +               return prog_fd;
>> +
>> +       return run_prog_verbose(prog_fd);
>> +}
>> +
>> +#define TEST(__test)                                   \
>> +int run_##__test(void)                                 \
>> +{                                                      \
>> +       selftest *skel;                                 \
>> +       int ret;                                        \
>> +                                                       \
>> +       skel = selftest__open_and_load();               \
>> +       if (!skel) {                                    \
>> +               ret = -EINVAL;                          \
>> +               goto error_no_destroy;                  \
>> +       }                                               \
>> +                                                       \
>> +       ret = selftest__attach(skel);                   \
>> +       if (ret)                                        \
>> +               goto error;                             \
>> +                                                       \
>> +       ret = run_test(skel, skel->progs.__test);       \
>> +       if (ret)                                        \
>> +               goto error;                             \
>> +                                                       \
>> +       selftest__destroy(skel);                        \
>> +                                                       \
>> +       printf("ok %d - %s\n", testno++, #__test);      \
>> +       return 0;                                       \
>> +                                                       \
>> +error:                                                 \
>> +       selftest__destroy(skel);                        \
>> +error_no_destroy:                                      \
>> +       printf("not ok %d - %s\n", testno++, #__test);  \
>> +       return ret;                                     \
>> +}
>> +
>> +static void
>> +banner(const char *progpath)
>> +{
>> +       char *name = basename(progpath);
>> +
>> +       printf("%s\n", name);
>> +
>> +       printf("=== %s ===\n", "libarena selftests");
>> +}
>> +
>> +int main(int argc, char *argv[])
>> +{
>> +       int ret;
>> +
>> +       struct rlimit rlim = {
>> +               .rlim_cur = RLIM_INFINITY,
>> +               .rlim_max = RLIM_INFINITY,
>> +       };
>> +
>> +       banner(argv[0]);
>> +
>> +       for (int i = 1; i < argc; i++) {
>> +               if (strcmp(argv[i], "-v") == 0 || strcmp(argv[i], "--verbose") == 0)
>> +                       verbose = true;
>> +       }
>> +
>> +       ret = setrlimit(RLIMIT_MEMLOCK, &rlim);
>
> where did you copy this from?
> It wasn't necessary for very long time.
>
>> +       if (ret) {
>> +               perror("setrlimit");
>> +               return ret;
>> +       }
>> +
>> +       libbpf_set_print(libbpf_print_fn);
>> +
>> +       return 0;
>> +}
>> diff --git a/tools/testing/selftests/bpf/libarena/selftests/selftest.h b/tools/testing/selftests/bpf/libarena/selftests/selftest.h
>> new file mode 100644
>> index 000000000000..b1cbff4d343b
>> --- /dev/null
>> +++ b/tools/testing/selftests/bpf/libarena/selftests/selftest.h
>> @@ -0,0 +1,12 @@
>> +// SPDX-License-Identifier: LGPL-2.1 OR BSD-2-Clause
>> +/* Copyright (c) 2026 Meta Platforms, Inc. and affiliates. */
>> +#pragma once
>> +
>> +#define ALLOC_SELFTEST(func, ...)              \
>> +       do {                            \
>> +               int ret = func(__VA_ARGS__);    \
>> +               if (ret) {              \
>> +                       arena_stderr("SELFTEST %s FAIL: %d", #func, ret);       \
>> +                       return ret;     \
>> +               }                       \
>> +       } while (0)
>
> I'm not excited about yet another special macro that hides control flow.
> Pls stick to ASSERT*() family.

Reusing test_progs.h would require us to other include the header in
libarena or complicate exporting it. Since as it is right now it's not
immediately exportable, I can everything to ASSERT and we can either
factor them out of test_progs.h later if necessary.

>
> pw-bot: cr


  reply	other threads:[~2026-04-09  0:18 UTC|newest]

Thread overview: 30+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-04-07  4:57 [PATCH bpf-next v4 0/9] Introduce arena library and runtime Emil Tsalapatis
2026-04-07  4:57 ` [PATCH bpf-next v4 1/9] bpf: Upgrade scalar to PTR_TO_ARENA on arena pointer addition Emil Tsalapatis
2026-04-07  5:43   ` bot+bpf-ci
2026-04-07  5:52   ` Leon Hwang
2026-04-07 16:10   ` Alexei Starovoitov
2026-04-09  0:15     ` Emil Tsalapatis
2026-04-09  2:17       ` Alexei Starovoitov
2026-04-07  4:57 ` [PATCH bpf-next v4 2/9] selftests/bpf: Add test for scalar/arena " Emil Tsalapatis
2026-04-07  4:57 ` [PATCH bpf-next v4 3/9] selftests/bpf: Move bpf_arena_spin_lock.h to the top level Emil Tsalapatis
2026-04-09  1:22   ` Song Liu
2026-04-07  4:57 ` [PATCH bpf-next v4 4/9] selftests/bpf: Deduplicate WRITE_ONCE macro between headers Emil Tsalapatis
2026-04-07  4:57 ` [PATCH bpf-next v4 5/9] selftests/bpf: Add basic libarena scaffolding Emil Tsalapatis
2026-04-07 16:21   ` Alexei Starovoitov
2026-04-09  0:18     ` Emil Tsalapatis [this message]
2026-04-09  2:21       ` Alexei Starovoitov
2026-04-07  4:57 ` [PATCH bpf-next v4 6/9] selftests/bpf: Add arena ASAN runtime to libarena Emil Tsalapatis
2026-04-07 16:39   ` Alexei Starovoitov
2026-04-09  0:38     ` Emil Tsalapatis
2026-04-09  2:28       ` Alexei Starovoitov
2026-04-07  4:57 ` [PATCH bpf-next v4 7/9] selftests/bpf: Add ASAN support for libarena selftests Emil Tsalapatis
2026-04-07 17:12   ` Alexei Starovoitov
2026-04-07  4:57 ` [PATCH bpf-next v4 8/9] selftests/bpf: Add buddy allocator for libarena Emil Tsalapatis
2026-04-07  5:43   ` bot+bpf-ci
2026-04-07 17:07   ` Alexei Starovoitov
2026-04-09  0:53     ` Emil Tsalapatis
2026-04-09  2:33       ` Alexei Starovoitov
2026-04-09 10:25         ` Puranjay Mohan
2026-04-09 10:40           ` Puranjay Mohan
2026-04-07  4:57 ` [PATCH bpf-next v4 9/9] selftests/bpf: Add selftests for libarena buddy allocator Emil Tsalapatis
2026-04-07 17:14   ` Alexei Starovoitov

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=DHO6YBPIPV5A.ZIBDPIXBG1NT@etsalapatis.com \
    --to=emil@etsalapatis.com \
    --cc=alexei.starovoitov@gmail.com \
    --cc=andrii@kernel.org \
    --cc=ast@kernel.org \
    --cc=bpf@vger.kernel.org \
    --cc=daniel@iogearbox.net \
    --cc=eddyz87@gmail.com \
    --cc=memxor@gmail.com \
    --cc=song@kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.