BPF List
 help / color / mirror / Atom feed
From: "Kumar Kartikeya Dwivedi" <memxor@gmail.com>
To: "Ihor Solodrai" <ihor.solodrai@linux.dev>, <bpf@vger.kernel.org>
Cc: "Alexei Starovoitov" <ast@kernel.org>,
	"Andrii Nakryiko" <andrii@kernel.org>,
	"Daniel Borkmann" <daniel@iogearbox.net>,
	"Eduard Zingerman" <eddyz87@gmail.com>,
	"Emil Tsalapatis" <emil@etsalapatis.com>, <kkd@meta.com>,
	<kernel-team@meta.com>
Subject: Re: [PATCH bpf-next v1 11/14] bpf: Replace arena kfunc argument flags with suffixes
Date: Fri, 28 Aug 2026 07:07:46 +0200	[thread overview]
Message-ID: <DL0BERKE6VTQ.2QHCO1DI0MX90@gmail.com> (raw)
In-Reply-To: <49226345-d2e4-4618-8c9d-9dd1d9b0ff4b@linux.dev>

On Wed Aug 26, 2026 at 10:42 PM CEST, Ihor Solodrai wrote:
> On 2026-08-21 4:35 p.m., Kumar Kartikeya Dwivedi wrote:
>> The arena allocation kfuncs still identify pointer arguments with
>> KF_ARENA_ARG2. These flags cover only the first two parameters and
>> duplicate the __arena suffix mechanism used by other kfuncs.
>
> This is a little petty, but the paragraph mischaracterizes what
> happened :) It's not like the flags duplicate an existing mechanism
> for an unknown/dumb reason. There was no __arena and it was the only
> mechanism until very recently.
>
> Rephrase please?
>

Sure, will reword.

>>
>> Annotate the optional allocation address with __arena__nullable. Mark the
>> free and reserve addresses with __arena so a valid address whose low 32
>> bits are zero is rebased unconditionally instead of becoming NULL.
>>
>> The JIT now passes kernel arena addresses to these kfuncs. Translate them
>> back to the lower-32-bit user addresses expected by the existing arena
>> helpers by subtracting kern_vm_start. This preserves allocation-anywhere,
>> freeing the first page of a 4 GiB arena, and reservation at address zero.
>>
>> Drop KF_ARENA_ARG1 and KF_ARENA_ARG2 from the kernel interface and remove
>> the flags from the arena kfunc sets. KF_ARENA_RET remains responsible for
>> annotating the allocation return value.
>>
>> Keep the affected selftests synchronized with the conversion. Associate
>> an arena before the iterator map-pointer failures so they still reach the
>> intended diagnostics, account for the extra nullable branch in JIT labels,
>> and treat 1ULL << 32 as the same allocation-anywhere request as NULL after
>> the required 32-bit truncation.
>
> It's been brought to my attention a few times [1], that we (the linux
> contributors) would strongly prefer the commit messages to explain
> *why* the change is being made, instead of *what*.
>
> And the llms tend to do the exact opposite.
>
> This applies to other patches in the series as well, particularly the
> cover letter.
>
> [1]
> https://lore.kernel.org/bpf/20260730212613.GJamvBdRJ5H98hTWS8@fat_crate.local/
>

I'll rewrite the commit log. I mostly just sent this out more as an RFC (except
we pw kicks RFCs out of CI queue), so it's rough in several places.

>>
>> Signed-off-by: Kumar Kartikeya Dwivedi <memxor@gmail.com>
>> ---
>>   include/linux/btf.h                           |  2 -
>>   kernel/bpf/arena.c                            | 40 ++++++++++++++-----
>>   .../selftests/bpf/progs/arena_kfunc_jit.c     | 16 ++++----
>>   .../selftests/bpf/progs/verifier_arena.c      |  6 +++
>>   .../bpf/progs/verifier_arena_large.c          |  4 +-
>>   5 files changed, 46 insertions(+), 22 deletions(-)
>>
>> diff --git a/include/linux/btf.h b/include/linux/btf.h
>> index 89d5a5c4f117..65e5f11dc27e 100644
>> --- a/include/linux/btf.h
>> +++ b/include/linux/btf.h
>> @@ -76,8 +76,6 @@
>>   #define KF_RCU_PROTECTED (1 << 11) /* kfunc should be protected by rcu cs when they are invoked */
>>   #define KF_FASTCALL     (1 << 12) /* kfunc supports bpf_fastcall protocol */
>>   #define KF_ARENA_RET    (1 << 13) /* kfunc returns an arena pointer */
>> -#define KF_ARENA_ARG1   (1 << 14) /* kfunc takes an arena pointer as its first argument */
>> -#define KF_ARENA_ARG2   (1 << 15) /* kfunc takes an arena pointer as its second argument */
>>   #define KF_IMPLICIT_ARGS (1 << 16) /* kfunc has implicit arguments supplied by the verifier */
>>   #define KF_SPINLOCK_SAFE (1 << 17) /* kfunc is allowed inside bpf_spin_lock-ed region */
>>
>> diff --git a/kernel/bpf/arena.c b/kernel/bpf/arena.c
>> index 7b6847200b43..6c34a0d34b3f 100644
>> --- a/kernel/bpf/arena.c
>> +++ b/kernel/bpf/arena.c
>> @@ -1044,18 +1044,28 @@ static void arena_free_irq(struct irq_work *iw)
>>   	schedule_work(&arena->free_work);
>>   }
>>
>> +static long arena_kaddr_to_uaddr(struct bpf_arena *arena, const void *addr)
>> +{
>> +	if (!addr)
>> +		return 0;
>> +
>> +	return (long)addr - bpf_arena_get_kern_vm_start(arena);
>> +}
>> +
>>   __bpf_kfunc_start_defs();
>>
>> -__bpf_kfunc void *bpf_arena_alloc_pages(void *p__map, void *addr__ign, u32 page_cnt,
>> -					int node_id, u64 flags)
>> +__bpf_kfunc void *bpf_arena_alloc_pages(void *p__map, void *addr__arena__nullable,
>> +					u32 page_cnt, int node_id, u64 flags)
>>   {
>>   	struct bpf_map *map = p__map;
>>   	struct bpf_arena *arena = container_of(map, struct bpf_arena, map);
>> +	long addr;
>>
>>   	if (map->map_type != BPF_MAP_TYPE_ARENA || flags || !page_cnt)
>>   		return NULL;
>>
>> -	return (void *)arena_alloc_pages(arena, (long)addr__ign, page_cnt, node_id, true);
>> +	addr = arena_kaddr_to_uaddr(arena, addr__arena__nullable);
>> +	return (void *)arena_alloc_pages(arena, addr, page_cnt, node_id, true);
>>   }
>>
>>   void *bpf_arena_alloc_pages_non_sleepable(void *p__map, void *addr__ign, u32 page_cnt,
>> @@ -1082,14 +1092,20 @@ void *bpf_arena_alloc_pages_sleepable(void *p__map, void *addr__ign, u32 page_cn
>>   	return (void *)arena_alloc_pages(arena, (long)addr__ign, page_cnt, node_id, true);
>>   }
>>
>> -__bpf_kfunc void bpf_arena_free_pages(void *p__map, void *ptr__ign, u32 page_cnt)
>> +/*
>> + * A valid arena address can have zero low 32 bits, so ptr must be rebased
>> + * unconditionally instead of being treated as nullable.
>> + */
>> +__bpf_kfunc void bpf_arena_free_pages(void *p__map, void *ptr__arena, u32 page_cnt)
>>   {
>>   	struct bpf_map *map = p__map;
>>   	struct bpf_arena *arena = container_of(map, struct bpf_arena, map);
>> +	long ptr;
>>
>> -	if (map->map_type != BPF_MAP_TYPE_ARENA || !page_cnt || !ptr__ign)
>> +	if (map->map_type != BPF_MAP_TYPE_ARENA || !page_cnt)
>>   		return;
>> -	arena_free_pages(arena, (long)ptr__ign, page_cnt, true);
>> +	ptr = arena_kaddr_to_uaddr(arena, ptr__arena);
>> +	arena_free_pages(arena, ptr, page_cnt, true);
>>   }
>>
>>   void bpf_arena_free_pages_non_sleepable(void *p__map, void *ptr__ign, u32 page_cnt)
>> @@ -1102,10 +1118,11 @@ void bpf_arena_free_pages_non_sleepable(void *p__map, void *ptr__ign, u32 page_c
>>   	arena_free_pages(arena, (long)ptr__ign, page_cnt, false);
>>   }
>>
>> -__bpf_kfunc int bpf_arena_reserve_pages(void *p__map, void *ptr__ign, u32 page_cnt)
>> +__bpf_kfunc int bpf_arena_reserve_pages(void *p__map, void *ptr__arena, u32 page_cnt)
>>   {
>>   	struct bpf_map *map = p__map;
>>   	struct bpf_arena *arena = container_of(map, struct bpf_arena, map);
>> +	long ptr;
>>
>>   	if (map->map_type != BPF_MAP_TYPE_ARENA)
>>   		return -EINVAL;
>> @@ -1113,14 +1130,15 @@ __bpf_kfunc int bpf_arena_reserve_pages(void *p__map, void *ptr__ign, u32 page_c
>>   	if (!page_cnt)
>>   		return 0;
>>
>> -	return arena_reserve_pages(arena, (long)ptr__ign, page_cnt);
>> +	ptr = arena_kaddr_to_uaddr(arena, ptr__arena);
>> +	return arena_reserve_pages(arena, ptr, page_cnt);
>
> This patch does a couple unrelated things clumped together.
>
> There is a kfunc arena arg identification mechanism change: flag to
> suffix. And there is behavioral change: rebasing the pointer etc.
>
> I think it'd be easier to review and would lead to a cleaner git
> history if these were separated. In particular, I'd expect the flag
> deprecation itself to not require any changes in the jit tests.
>

Yep, makes sense. Will split into separate commits.

>>   }
>>   __bpf_kfunc_end_defs();
>>
>>   BTF_KFUNCS_START(arena_kfuncs)
>> -BTF_ID_FLAGS(func, bpf_arena_alloc_pages, KF_ARENA_RET | KF_ARENA_ARG2 | KF_SPINLOCK_SAFE)
>> -BTF_ID_FLAGS(func, bpf_arena_free_pages, KF_ARENA_ARG2 | KF_SPINLOCK_SAFE)
>> -BTF_ID_FLAGS(func, bpf_arena_reserve_pages, KF_ARENA_ARG2 | KF_SPINLOCK_SAFE)
>> +BTF_ID_FLAGS(func, bpf_arena_alloc_pages, KF_ARENA_RET | KF_SPINLOCK_SAFE)
>> +BTF_ID_FLAGS(func, bpf_arena_free_pages, KF_SPINLOCK_SAFE)
>> +BTF_ID_FLAGS(func, bpf_arena_reserve_pages, KF_SPINLOCK_SAFE)
>>   BTF_KFUNCS_END(arena_kfuncs)
>>
>>   static const struct btf_kfunc_id_set common_kfunc_set = {
>> diff --git a/tools/testing/selftests/bpf/progs/arena_kfunc_jit.c b/tools/testing/selftests/bpf/progs/arena_kfunc_jit.c
>> index b5a01cbc33a7..c9af35c683b3 100644
>> --- a/tools/testing/selftests/bpf/progs/arena_kfunc_jit.c
>> +++ b/tools/testing/selftests/bpf/progs/arena_kfunc_jit.c
>> @@ -49,15 +49,15 @@ __arch_x86_64
>>   __jited("...")
>>   __jited("	movl	%edi, %edi")
>>   __jited("	testl	%edi, %edi")
>> -__jited("	je	L0")
>> +__jited("	je	L1")
>>   __jited("	addq	%r12, %rdi")
>> -__jited("L0:	callq	{{.*}}")
>> +__jited("L1:	callq	{{.*}}")
>>   __arch_arm64
>>   __jited("...")
>>   __jited("	mov	w0, w0")
>> -__jited("	cbz	w0, L0")
>> +__jited("	cbz	w0, L1")
>>   __jited("	add	x0, x28, w0, uxtw")
>> -__jited("L0:	{{.*}}")
>> +__jited("L1:	{{.*}}")
>>   __success
>>   int arena_arg_jit_nullable(void *ctx)
>>   {
>> @@ -79,9 +79,9 @@ __jited("	movl	%ecx, %ecx")
>>   __jited("	addq	%r12, %rcx")
>>   __jited("	movl	%r8d, %r8d")
>>   __jited("	testl	%r8d, %r8d")
>> -__jited("	je	L0")
>> +__jited("	je	L1")
>>   __jited("	addq	%r12, %r8")
>> -__jited("L0:	callq	{{.*}}")
>> +__jited("L1:	callq	{{.*}}")
>>   __arch_arm64
>>   __jited("...")
>>   __jited("	add	x0, x28, w0, uxtw")
>> @@ -89,9 +89,9 @@ __jited("	add	x1, x28, w1, uxtw")
>>   __jited("	add	x2, x28, w2, uxtw")
>>   __jited("	add	x3, x28, w3, uxtw")
>>   __jited("	mov	w4, w4")
>> -__jited("	cbz	w4, L0")
>> +__jited("	cbz	w4, L1")
>>   __jited("	add	x4, x28, w4, uxtw")
>> -__jited("L0:	{{.*}}")
>> +__jited("L1:	{{.*}}")
>>   __success
>>   int arena_arg_jit_args5(void *ctx)
>>   {
>> diff --git a/tools/testing/selftests/bpf/progs/verifier_arena.c b/tools/testing/selftests/bpf/progs/verifier_arena.c
>> index 815f342eb4b0..d76490e059f9 100644
>> --- a/tools/testing/selftests/bpf/progs/verifier_arena.c
>> +++ b/tools/testing/selftests/bpf/progs/verifier_arena.c
>> @@ -445,6 +445,8 @@ int iter_maps1(struct bpf_iter__bpf_map *ctx)
>>
>>   	if (!map)
>>   		return 0;
>> +	/* Associate an arena before testing the generic map-pointer path. */
>> +	bpf_arena_reserve_pages(&arena, NULL, 0);
>>   	bpf_arena_alloc_pages(map, NULL, map->max_entries, 0, 0);
>>   	return 0;
>>   }
>> @@ -455,6 +457,8 @@ int iter_maps2(struct bpf_iter__bpf_map *ctx)
>>   {
>>   	struct seq_file *seq = ctx->meta->seq;
>>
>> +	/* Associate an arena before testing the generic map-pointer path. */
>> +	bpf_arena_reserve_pages(&arena, NULL, 0);
>>   	bpf_arena_alloc_pages((void *)seq, NULL, 1, 0, 0);
>>   	return 0;
>>   }
>> @@ -467,6 +471,8 @@ int iter_maps3(struct bpf_iter__bpf_map *ctx)
>>
>>   	if (!map)
>>   		return 0;
>> +	/* Associate an arena before testing the generic map-pointer path. */
>> +	bpf_arena_reserve_pages(&arena, NULL, 0);
>>   	bpf_arena_alloc_pages(map->inner_map_meta, NULL, map->max_entries, 0, 0);
>>   	return 0;
>>   }
>> diff --git a/tools/testing/selftests/bpf/progs/verifier_arena_large.c b/tools/testing/selftests/bpf/progs/verifier_arena_large.c
>> index 6ab8730d4878..f6515e0e9b17 100644
>> --- a/tools/testing/selftests/bpf/progs/verifier_arena_large.c
>> +++ b/tools/testing/selftests/bpf/progs/verifier_arena_large.c
>> @@ -49,8 +49,10 @@ int big_alloc1(void *ctx)
>>
>>   	no_page = bpf_arena_alloc_pages(&arena, (void __arena *)ARENA_SIZE,
>>   					1, NUMA_NO_NODE, 0);
>> -	if (no_page)
>> +	/* Only the low 32 bits contribute, so this is equivalent to NULL. */
>> +	if (!no_page)
>>   		return 3;
>> +	bpf_arena_free_pages(&arena, (void __arena *)no_page, 1);
>>   	if (*page1 != 1)
>>   		return 4;
>>   	if (*page2 != 2)


  reply	other threads:[~2026-08-28  5:07 UTC|newest]

Thread overview: 43+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-08-21 23:34 [PATCH bpf-next v1 00/14] Retire KF_ARENA_ARG kfunc flags Kumar Kartikeya Dwivedi
2026-08-21 23:34 ` [PATCH bpf-next v1 01/14] bpf: Split arena kfunc and struct_ops JIT capabilities Kumar Kartikeya Dwivedi
2026-08-22  0:46   ` bot+bpf-ci
2026-08-24 22:28   ` Eduard Zingerman
2026-08-24 22:37     ` Kumar Kartikeya Dwivedi
2026-08-26 19:52     ` Ihor Solodrai
2026-08-21 23:34 ` [PATCH bpf-next v1 02/14] bpf, riscv: Fix stack-passed arguments for indirect trampolines Kumar Kartikeya Dwivedi
2026-08-24  6:21   ` Pu Lehui
2026-08-21 23:34 ` [PATCH bpf-next v1 03/14] bpf, riscv: JIT arena kfunc argument rebasing Kumar Kartikeya Dwivedi
2026-08-24  6:36   ` Pu Lehui
2026-08-21 23:34 ` [PATCH bpf-next v1 04/14] bpf, riscv: Convert struct_ops arena arguments in the trampoline Kumar Kartikeya Dwivedi
2026-08-21 23:44   ` sashiko-bot
2026-08-24  6:38   ` Pu Lehui
2026-08-21 23:34 ` [PATCH bpf-next v1 05/14] bpf, s390: JIT arena kfunc argument rebasing Kumar Kartikeya Dwivedi
2026-08-21 23:35 ` [PATCH bpf-next v1 06/14] bpf, s390: Convert struct_ops arena arguments Kumar Kartikeya Dwivedi
2026-08-22  0:46   ` bot+bpf-ci
2026-08-21 23:35 ` [PATCH bpf-next v1 07/14] bpf, loongarch: Fix stack arguments for indirect trampolines Kumar Kartikeya Dwivedi
2026-08-22  0:46   ` bot+bpf-ci
     [not found]   ` <a5d4c26c-6735-8af1-1d3f-fe7f1898b285@loongson.cn>
2026-08-28  4:55     ` Kumar Kartikeya Dwivedi
2026-08-28  8:19       ` Tiezhu Yang
2026-08-21 23:35 ` [PATCH bpf-next v1 08/14] bpf, loongarch: JIT arena kfunc argument rebasing Kumar Kartikeya Dwivedi
2026-08-21 23:46   ` sashiko-bot
2026-08-21 23:35 ` [PATCH bpf-next v1 09/14] bpf, loongarch: Convert struct_ops arena arguments in trampolines Kumar Kartikeya Dwivedi
2026-08-21 23:51   ` sashiko-bot
2026-08-21 23:35 ` [PATCH bpf-next v1 10/14] bpf, powerpc: JIT arena kfunc argument rebasing Kumar Kartikeya Dwivedi
2026-08-22  0:46   ` bot+bpf-ci
2026-08-21 23:35 ` [PATCH bpf-next v1 11/14] bpf: Replace arena kfunc argument flags with suffixes Kumar Kartikeya Dwivedi
2026-08-21 23:58   ` sashiko-bot
2026-08-22  0:46   ` bot+bpf-ci
2026-08-24 22:15   ` Eduard Zingerman
2026-08-24 22:52     ` Kumar Kartikeya Dwivedi
2026-08-26 20:42   ` Ihor Solodrai
2026-08-28  5:07     ` Kumar Kartikeya Dwivedi [this message]
2026-08-21 23:35 ` [PATCH bpf-next v1 12/14] resolve_btfids: Drop KF_ARENA_ARG flag support Kumar Kartikeya Dwivedi
2026-08-22  0:46   ` bot+bpf-ci
2026-08-24 22:25   ` Eduard Zingerman
2026-08-24 22:53     ` Kumar Kartikeya Dwivedi
2026-08-26 20:47   ` Ihor Solodrai
2026-08-21 23:35 ` [PATCH bpf-next v1 13/14] selftests/bpf: Exercise arena arguments on every capable JIT Kumar Kartikeya Dwivedi
2026-08-22  0:46   ` bot+bpf-ci
2026-08-26 20:50   ` Ihor Solodrai
2026-08-28  5:00     ` Kumar Kartikeya Dwivedi
2026-08-21 23:35 ` [PATCH bpf-next v1 14/14] docs/bpf: Document split arena argument JIT capabilities Kumar Kartikeya Dwivedi

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=DL0BERKE6VTQ.2QHCO1DI0MX90@gmail.com \
    --to=memxor@gmail.com \
    --cc=andrii@kernel.org \
    --cc=ast@kernel.org \
    --cc=bpf@vger.kernel.org \
    --cc=daniel@iogearbox.net \
    --cc=eddyz87@gmail.com \
    --cc=emil@etsalapatis.com \
    --cc=ihor.solodrai@linux.dev \
    --cc=kernel-team@meta.com \
    --cc=kkd@meta.com \
    /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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox