Re: [PATCH dwarves] btf_encoder: Infer arena kfunc arguments from suffixes
Ihor Solodrai <[email protected]> Tue, 4 Aug 2026 15:13:25 -0700
| Newsgroups | org.kernel.vger.bpf,org.kernel.vger.dwarves |
|---|---|
| Message-ID | <[email protected]> |
On 8/4/26 3:05 PM, Eduard Zingerman wrote:
> On Tue, 2026-08-04 at 14:55 -0700, Ihor Solodrai wrote:
>> On 8/4/26 2:34 PM, Eduard Zingerman wrote:
>>> On Tue, 2026-08-04 at 14:19 -0700, Ihor Solodrai wrote:
>>>> On 8/4/26 1:22 PM, Eduard Zingerman wrote:
>>>>> On Tue, 2026-08-04 at 21:27 +0200, Kumar Kartikeya Dwivedi wrote:
>>>>>> On Tue Aug 4, 2026 at 8:43 PM CEST, Ihor Solodrai wrote:
>>>>>>> On 8/3/26 5:55 AM, Kumar Kartikeya Dwivedi wrote:
>>>>>>>> [...]
>>>>>>
>>>>
>>>> What am I missing?
>>>
>>> At the moment we have two consumers:
>>> - Planned sched_ext related kfuncs that need kernel space pointers.
>>> - Existing kfuncs with KF_ARENA_ARG:
>>> - bpf_arena_alloc_pages
>>> - bpf_arena_free_pages
>>> - bpf_arena_reserve_pages
>>> They, take a user space address. Looking at the code is appears that
>>> all three can be changed to handle kernel space address.
>>> On the other hand, neither of these *needs* the passed pointer to be
>>> converted to a kernel side arena pointer. So that would be just some
>>> useless work.
>>>
>>> So there are two valid use cases.
>>
>> I think having more than one way of how to pass an arena pointer to
>> the kernel will create more confusion than bring value.
>
> That might be the case.
>
>> It seems to me the existing bpf_arena_* kfuncs accept user space
>> address for historical reasons (we just tried something that worked),
>> not by design exactly.
>
> What makes you think so?
The fact that sched_ext needs to use a different way, which is why
this thread exists. But you may be right that these are just two
different use-cases, and each does what makes sense for it.
>
>> btw, Eduard, I get very confused by how you say "user space".. you
>> mean the 32bit value representing the BPF arena pointer, right?
>
> Nope:
>
> static long compute_pgoff(struct bpf_arena *arena, long uaddr)
> {
> return (u32)(uaddr - (u32)arena->user_vm_start) >> PAGE_SHIFT;
> }
>
> static int arena_reserve_pages(struct bpf_arena *arena, long uaddr, u32 page_cnt)
> {
> ...
> if (uaddr & ~PAGE_MASK)
> return 0;
>
> pgoff = compute_pgoff(arena, uaddr);
> if (pgoff + page_cnt > page_cnt_max)
> return -EINVAL;
> ...
> }
>
> __bpf_kfunc int bpf_arena_reserve_pages(void *p__map, void *ptr__ign, u32 page_cnt)
> {
> ...
> return arena_reserve_pages(arena, (long)ptr__ign, page_cnt);
> }
>
> ptr__ign/uaddr is a 64-bit user space address.
I see, thanks for the explanation.
>
>>
>> Anyways, I think we should converge on the approach to arena pointers
>> handling before landing anything.
>>
>> Let's use __arena suffix as annotation mechanism, fine. But
>> I really wouldn't like to end up with N annotations for each
>> permutation of (non-)nullable and kern/user...
>>
>> I'll submit the resolve_btfids patches asap to not block on that.
>>
>>
>>>
>>> ...