* [PATCH bpf-next v1 0/2] Add resolve_btfids support for __arena kfunc suffix
@ 2026-08-09 8:51 Kumar Kartikeya Dwivedi
2026-08-09 8:51 ` [PATCH bpf-next v1 1/2] resolve_btfids: Emit arena attributes from kfunc parameter suffixes Kumar Kartikeya Dwivedi
2026-08-09 8:51 ` [PATCH bpf-next v1 2/2] selftests/bpf: Test resolve_btfids arena argument suffixes Kumar Kartikeya Dwivedi
0 siblings, 2 replies; 7+ messages in thread
From: Kumar Kartikeya Dwivedi @ 2026-08-09 8:51 UTC (permalink / raw)
To: bpf
Cc: Alexei Starovoitov, Andrii Nakryiko, Daniel Borkmann,
Eduard Zingerman, Emil Tsalapatis, Tejun Heo, Ihor Solodrai, kkd,
kernel-team
Use __arena/__arena__nullable suffixes to emit address_space(1)
annotations on kfunc definitions in vmlinux.h. See commits for details.
Kumar Kartikeya Dwivedi (2):
resolve_btfids: Emit arena attributes from kfunc parameter suffixes
selftests/bpf: Test resolve_btfids arena argument suffixes
tools/bpf/resolve_btfids/main.c | 62 ++++++++++++++++---
.../selftests/bpf/prog_tests/resolve_btfids.c | 35 ++++++-----
tools/testing/selftests/bpf/progs/btf_data.c | 9 +++
3 files changed, 82 insertions(+), 24 deletions(-)
base-commit: d114bb98936770c501c958bf2bc5fb6b7c0bad7b
--
2.53.0-Meta
^ permalink raw reply [flat|nested] 7+ messages in thread
* [PATCH bpf-next v1 1/2] resolve_btfids: Emit arena attributes from kfunc parameter suffixes
2026-08-09 8:51 [PATCH bpf-next v1 0/2] Add resolve_btfids support for __arena kfunc suffix Kumar Kartikeya Dwivedi
@ 2026-08-09 8:51 ` Kumar Kartikeya Dwivedi
2026-08-09 10:10 ` bot+bpf-ci
2026-08-09 8:51 ` [PATCH bpf-next v1 2/2] selftests/bpf: Test resolve_btfids arena argument suffixes Kumar Kartikeya Dwivedi
1 sibling, 1 reply; 7+ messages in thread
From: Kumar Kartikeya Dwivedi @ 2026-08-09 8:51 UTC (permalink / raw)
To: bpf
Cc: Alexei Starovoitov, Andrii Nakryiko, Daniel Borkmann,
Eduard Zingerman, Emil Tsalapatis, Tejun Heo, Ihor Solodrai, kkd,
kernel-team
Kfunc declarations can identify arena arguments through parameter name
suffixes without repeating KF_ARENA_ARG flags in their BTF ID sets.
resolve_btfids currently misses those arguments when synthesizing the
address_space(1) attributes used by generated vmlinux.h files.
Teach the arena prototype rewrite to recognize __arena and
__arena__nullable directly on each parameter. Keep KF_ARENA_ARG1 and
KF_ARENA_ARG2 handling for explicitly flagged kfuncs, while allowing
suffixes on any argument without synthesizing kfunc flags.
Signed-off-by: Kumar Kartikeya Dwivedi <memxor@gmail.com>
---
tools/bpf/resolve_btfids/main.c | 62 ++++++++++++++++++++++++++++-----
1 file changed, 54 insertions(+), 8 deletions(-)
diff --git a/tools/bpf/resolve_btfids/main.c b/tools/bpf/resolve_btfids/main.c
index d2e4176339da..3c88ea192f7b 100644
--- a/tools/bpf/resolve_btfids/main.c
+++ b/tools/bpf/resolve_btfids/main.c
@@ -65,7 +65,8 @@
*
* - emits a "bpf_kfunc" decl tag, and "bpf_fastcall" when KF_FASTCALL is set;
* - wraps the return value and/or arguments flagged KF_ARENA_RET,
- * KF_ARENA_ARG1 or KF_ARENA_ARG2 with the "address_space(1)" type attribute;
+ * KF_ARENA_ARG1 or KF_ARENA_ARG2, or identified by an arena parameter
+ * suffix, with the "address_space(1)" type attribute;
* - rewrites the prototype of KF_IMPLICIT_ARGS kfuncs.
*
* These kfunc annotations were historically produced by pahole.
@@ -182,6 +183,8 @@ struct object {
#define KF_IMPLICIT_ARGS (1 << 16)
#define KF_IMPL_SUFFIX "_impl"
#define TYPE_ATTR_ARENA "address_space(1)"
+#define PARAM_SUFFIX_ARENA "__arena"
+#define PARAM_SUFFIX_ARENA_NULLABLE "__arena__nullable"
struct kfunc {
struct rb_node rb_node;
@@ -1067,6 +1070,22 @@ static int collect_decl_tags(struct btf2btf_context *ctx)
return 0;
}
+static bool param_name_has_suffix(const char *name, const char *suffix)
+{
+ size_t name_len = strlen(name);
+ size_t suffix_len = strlen(suffix);
+
+ return name_len >= suffix_len && !strcmp(name + name_len - suffix_len, suffix);
+}
+
+static bool is_arena_param(const struct btf *btf, const struct btf_param *param)
+{
+ const char *name = btf__name_by_offset(btf, param->name_off);
+
+ return param_name_has_suffix(name, PARAM_SUFFIX_ARENA) ||
+ param_name_has_suffix(name, PARAM_SUFFIX_ARENA_NULLABLE);
+}
+
static int collect_kfuncs(struct object *obj, struct btf2btf_context *ctx)
{
Elf_Data *idlist = obj->efile.idlist;
@@ -1299,8 +1318,12 @@ static int process_kfunc_with_implicit_args(struct btf2btf_context *ctx, struct
return 0;
}
-static bool is_arena_arg(struct kfunc *kfunc, u32 idx)
+static bool is_arena_arg(const struct btf *btf, const struct kfunc *kfunc,
+ const struct btf_param *param, u32 idx)
{
+ if (is_arena_param(btf, param))
+ return true;
+
switch (idx) {
case 0:
return kfunc->flags & KF_ARENA_ARG1;
@@ -1311,6 +1334,30 @@ static bool is_arena_arg(struct kfunc *kfunc, u32 idx)
}
}
+static bool kfunc_has_arena_arg(const struct btf *btf, const struct kfunc *kfunc)
+{
+ const struct btf_type *func, *proto;
+ const struct btf_param *params;
+ u32 nr_params;
+
+ func = btf__type_by_id(btf, kfunc->btf_id);
+ if (!func || !btf_is_func(func))
+ return false;
+
+ proto = btf__type_by_id(btf, func->type);
+ if (!proto || !btf_is_func_proto(proto))
+ return false;
+
+ params = btf_params(proto);
+ nr_params = btf_vlen(proto);
+ for (u32 i = 0; i < nr_params; i++) {
+ if (is_arena_arg(btf, kfunc, ¶ms[i], i))
+ return true;
+ }
+
+ return false;
+}
+
static s32 arena_tag_ptr(struct btf *btf, u32 ptr_id, struct kfunc *kfunc)
{
const struct btf_type *ptr = btf__type_by_id(btf, ptr_id);
@@ -1383,11 +1430,10 @@ static s32 add_arena_tagged_proto(struct btf *btf, struct kfunc *kfunc)
}
for (i = 0; i < nr_params; i++) {
- if (!is_arena_arg(kfunc, i))
- continue;
-
t = btf__type_by_id(btf, new_proto_id);
params = btf_params(t);
+ if (!is_arena_arg(btf, kfunc, ¶ms[i], i))
+ continue;
id = arena_tag_ptr(btf, params[i].type, kfunc);
if (id < 0)
@@ -1403,7 +1449,7 @@ static s32 add_arena_tagged_proto(struct btf *btf, struct kfunc *kfunc)
return new_proto_id;
}
-static int process_kfunc_with_arena_flags(struct btf2btf_context *ctx,
+static int process_kfunc_with_arena_attrs(struct btf2btf_context *ctx,
struct kfunc *kfunc)
{
struct btf_type *t;
@@ -1463,8 +1509,8 @@ static int btf2btf(struct object *obj)
goto out;
}
- if (kfunc->flags & (KF_ARENA_RET | KF_ARENA_ARG1 | KF_ARENA_ARG2)) {
- err = process_kfunc_with_arena_flags(&ctx, kfunc);
+ if ((kfunc->flags & KF_ARENA_RET) || kfunc_has_arena_arg(ctx.btf, kfunc)) {
+ err = process_kfunc_with_arena_attrs(&ctx, kfunc);
if (err)
goto out;
}
--
2.53.0-Meta
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH bpf-next v1 2/2] selftests/bpf: Test resolve_btfids arena argument suffixes
2026-08-09 8:51 [PATCH bpf-next v1 0/2] Add resolve_btfids support for __arena kfunc suffix Kumar Kartikeya Dwivedi
2026-08-09 8:51 ` [PATCH bpf-next v1 1/2] resolve_btfids: Emit arena attributes from kfunc parameter suffixes Kumar Kartikeya Dwivedi
@ 2026-08-09 8:51 ` Kumar Kartikeya Dwivedi
2026-08-09 9:57 ` bot+bpf-ci
1 sibling, 1 reply; 7+ messages in thread
From: Kumar Kartikeya Dwivedi @ 2026-08-09 8:51 UTC (permalink / raw)
To: bpf
Cc: Alexei Starovoitov, Andrii Nakryiko, Daniel Borkmann,
Eduard Zingerman, Emil Tsalapatis, Tejun Heo, Ihor Solodrai, kkd,
kernel-team
Add a suffix-only kfunc declaration with arena annotations on all five
arguments. Verify that resolve_btfids emits address_space(1) type tags
for every position without KF_ARENA_ARG flags in the BTF ID sets.
Represent expected arena arguments as a per-parameter bitmap so the
test covers suffixes beyond the two positions expressible by flags.
Signed-off-by: Kumar Kartikeya Dwivedi <memxor@gmail.com>
---
.../selftests/bpf/prog_tests/resolve_btfids.c | 35 ++++++++++---------
tools/testing/selftests/bpf/progs/btf_data.c | 9 +++++
2 files changed, 28 insertions(+), 16 deletions(-)
diff --git a/tools/testing/selftests/bpf/prog_tests/resolve_btfids.c b/tools/testing/selftests/bpf/prog_tests/resolve_btfids.c
index 732cfed35e1c..9bd84fe32b89 100644
--- a/tools/testing/selftests/bpf/prog_tests/resolve_btfids.c
+++ b/tools/testing/selftests/bpf/prog_tests/resolve_btfids.c
@@ -15,6 +15,7 @@
#define DECL_TAG_FASTCALL "bpf_fastcall"
#define DECL_TAG_KFUNC "bpf_kfunc"
#define TYPE_ATTR_ARENA "address_space(1)"
+#define ARENA_ARG(n) (1U << (n))
#ifndef KF_FASTCALL
#define KF_FASTCALL (1 << 12)
@@ -49,13 +50,18 @@ struct kfunc_symbol {
const char *name;
s32 id;
u32 flags;
+ u32 arena_args;
+ bool arena_ret;
};
static struct kfunc_symbol kfunc_symbols[] = {
- { "kfunc_a", -1, 0 },
- { "kfunc_b", -1, KF_FASTCALL },
- { "kfunc_c", -1, KF_ARENA_RET | KF_ARENA_ARG1 | KF_ARENA_ARG2 },
- { "kfunc_d", -1, KF_ARENA_ARG2 },
+ { "kfunc_a", -1, 0, 0, false },
+ { "kfunc_b", -1, KF_FASTCALL, 0, false },
+ { "kfunc_c", -1, KF_ARENA_RET | KF_ARENA_ARG1 | KF_ARENA_ARG2,
+ ARENA_ARG(0) | ARENA_ARG(1), true },
+ { "kfunc_d", -1, KF_ARENA_ARG2, ARENA_ARG(1), false },
+ { "kfunc_e", -1, 0, ARENA_ARG(0) | ARENA_ARG(1) | ARENA_ARG(2) |
+ ARENA_ARG(3) | ARENA_ARG(4), false },
};
/* Align the .BTF_ids section to 4 bytes */
@@ -105,6 +111,7 @@ BTF_ID_FLAGS(func, kfunc_a)
BTF_ID_FLAGS(func, kfunc_b, KF_FASTCALL)
BTF_ID_FLAGS(func, kfunc_c, KF_ARENA_RET | KF_ARENA_ARG1 | KF_ARENA_ARG2)
BTF_ID_FLAGS(func, kfunc_d, KF_ARENA_ARG2)
+BTF_ID_FLAGS(func, kfunc_e)
BTF_KFUNCS_END(test_kfunc_set)
/*
@@ -112,6 +119,7 @@ BTF_KFUNCS_END(test_kfunc_set)
* actually sort at least one of the two sets.
*/
BTF_KFUNCS_START(test_kfunc_set_rev)
+BTF_ID_FLAGS(func, kfunc_e)
BTF_ID_FLAGS(func, kfunc_d, KF_ARENA_ARG2)
BTF_ID_FLAGS(func, kfunc_c, KF_ARENA_RET | KF_ARENA_ARG1 | KF_ARENA_ARG2)
BTF_ID_FLAGS(func, kfunc_b, KF_FASTCALL)
@@ -301,15 +309,15 @@ void test_resolve_btfids(void)
}
/*
- * Check resolve_btfids wrapped exactly the arena-flagged return/args
- * with the address_space(1) type attribute, and left other
+ * Check resolve_btfids wrapped exactly the arena-flagged or suffixed
+ * return/args with the address_space(1) type attribute, and left other
* pointers/returns untouched.
*/
for (i = 0; i < ARRAY_SIZE(kfunc_symbols); i++) {
const struct btf_type *fn, *proto;
const struct btf_param *params;
const char *name = kfunc_symbols[i].name;
- u32 fl = kfunc_symbols[i].flags;
+ u32 arena_args = kfunc_symbols[i].arena_args;
__u32 nr;
fn = btf__type_by_id(btf, kfunc_symbols[i].id);
@@ -322,15 +330,10 @@ void test_resolve_btfids(void)
nr = btf_vlen(proto);
ASSERT_EQ(is_arena_tagged_ptr(btf, proto->type),
- !!(fl & KF_ARENA_RET), name);
- if (nr > 0) {
- ASSERT_EQ(is_arena_tagged_ptr(btf, params[0].type),
- !!(fl & KF_ARENA_ARG1), name);
- }
- if (nr > 1) {
- ASSERT_EQ(is_arena_tagged_ptr(btf, params[1].type),
- !!(fl & KF_ARENA_ARG2), name);
- }
+ kfunc_symbols[i].arena_ret, name);
+ for (j = 0; j < nr; j++)
+ ASSERT_EQ(is_arena_tagged_ptr(btf, params[j].type),
+ !!(arena_args & ARENA_ARG(j)), name);
}
out:
diff --git a/tools/testing/selftests/bpf/progs/btf_data.c b/tools/testing/selftests/bpf/progs/btf_data.c
index ec34f7a6e038..ea41c9801432 100644
--- a/tools/testing/selftests/bpf/progs/btf_data.c
+++ b/tools/testing/selftests/bpf/progs/btf_data.c
@@ -68,3 +68,12 @@ int kfunc_d(struct root_struct *a, struct root_struct *b)
{
return 0;
}
+
+int kfunc_e(struct root_struct *a__arena,
+ struct root_struct *b__arena__nullable,
+ struct root_struct *c__arena,
+ struct root_struct *d__arena__nullable,
+ struct root_struct *e__arena)
+{
+ return 0;
+}
--
2.53.0-Meta
^ permalink raw reply related [flat|nested] 7+ messages in thread
* Re: [PATCH bpf-next v1 2/2] selftests/bpf: Test resolve_btfids arena argument suffixes
2026-08-09 8:51 ` [PATCH bpf-next v1 2/2] selftests/bpf: Test resolve_btfids arena argument suffixes Kumar Kartikeya Dwivedi
@ 2026-08-09 9:57 ` bot+bpf-ci
2026-08-09 14:07 ` Kumar Kartikeya Dwivedi
0 siblings, 1 reply; 7+ messages in thread
From: bot+bpf-ci @ 2026-08-09 9:57 UTC (permalink / raw)
To: memxor, bpf
Cc: ast, andrii, daniel, eddyz87, emil, tj, ihor.solodrai, kkd,
kernel-team, ast, andrii, daniel, martin.lau, eddyz87,
yonghong.song, clm, ihor.solodrai
[-- Attachment #1: Type: text/plain, Size: 2599 bytes --]
> diff --git a/tools/testing/selftests/bpf/prog_tests/resolve_btfids.c b/tools/testing/selftests/bpf/prog_tests/resolve_btfids.c
> index 732cfed35e1c..9bd84fe32b89 100644
> --- a/tools/testing/selftests/bpf/prog_tests/resolve_btfids.c
> +++ b/tools/testing/selftests/bpf/prog_tests/resolve_btfids.c
> @@ -15,6 +15,7 @@
> #define DECL_TAG_FASTCALL "bpf_fastcall"
> #define DECL_TAG_KFUNC "bpf_kfunc"
> #define TYPE_ATTR_ARENA "address_space(1)"
> +#define ARENA_ARG(n) (1U << (n))
This isn't a bug, but ARENA_ARG(n) is zero-based while the KF_ARENA_ARGn
flags it sits next to are one-based, so the same argument is spelled two
different ways inside a single table row.
For example, '{ "kfunc_d", -1, KF_ARENA_ARG2, ARENA_ARG(1), false }'
means KF_ARENA_ARG2 and ARENA_ARG(1) refer to the same parameter.
Would a name like ARENA_ARG_IDX(n), or a short comment noting that
ARENA_ARG(0) corresponds to KF_ARENA_ARG1, help keep the two columns
from drifting?
[ ... ]
> @@ -49,13 +50,18 @@ struct kfunc_symbol {
> const char *name;
> s32 id;
> u32 flags;
> + u32 arena_args;
> + bool arena_ret;
> };
>
> static struct kfunc_symbol kfunc_symbols[] = {
> - { "kfunc_a", -1, 0 },
> - { "kfunc_b", -1, KF_FASTCALL },
> - { "kfunc_c", -1, KF_ARENA_RET | KF_ARENA_ARG1 | KF_ARENA_ARG2 },
> - { "kfunc_d", -1, KF_ARENA_ARG2 },
> + { "kfunc_a", -1, 0, 0, false },
> + { "kfunc_b", -1, KF_FASTCALL, 0, false },
> + { "kfunc_c", -1, KF_ARENA_RET | KF_ARENA_ARG1 | KF_ARENA_ARG2,
> + ARENA_ARG(0) | ARENA_ARG(1), true },
> + { "kfunc_d", -1, KF_ARENA_ARG2, ARENA_ARG(1), false },
> + { "kfunc_e", -1, 0, ARENA_ARG(0) | ARENA_ARG(1) | ARENA_ARG(2) |
> + ARENA_ARG(3) | ARENA_ARG(4), false },
> };
This isn't a bug, but the new arena_ret field duplicates information
that the existing flags field already carries.
resolve_btfids only ever arena-tags a return value from KF_ARENA_RET:
tools/bpf/resolve_btfids/main.c:add_arena_tagged_proto() {
...
if (kfunc->flags & KF_ARENA_RET)
/* tag return */
...
}
There is no return-position suffix mechanism, so arena_ret is exactly
!!(flags & KF_ARENA_RET) for every row and the old expression it
replaced was already correct.
Since only KF_ARENA_RET drives return tagging, could the return
assertion keep using !!(flags & KF_ARENA_RET) instead of the new
arena_ret field?
[ ... ]
---
AI reviewed your patch. Please fix the bug or email reply why it's not a bug.
See: https://github.com/kernel-patches/vmtest/blob/master/ci/claude/README.md
CI run summary: https://github.com/kernel-patches/bpf/actions/runs/31305217088
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH bpf-next v1 1/2] resolve_btfids: Emit arena attributes from kfunc parameter suffixes
2026-08-09 8:51 ` [PATCH bpf-next v1 1/2] resolve_btfids: Emit arena attributes from kfunc parameter suffixes Kumar Kartikeya Dwivedi
@ 2026-08-09 10:10 ` bot+bpf-ci
2026-08-09 14:08 ` Kumar Kartikeya Dwivedi
0 siblings, 1 reply; 7+ messages in thread
From: bot+bpf-ci @ 2026-08-09 10:10 UTC (permalink / raw)
To: memxor, bpf
Cc: ast, andrii, daniel, eddyz87, emil, tj, ihor.solodrai, kkd,
kernel-team, ast, andrii, daniel, martin.lau, eddyz87,
yonghong.song, clm, ihor.solodrai
[-- Attachment #1: Type: text/plain, Size: 2373 bytes --]
> diff --git a/tools/bpf/resolve_btfids/main.c b/tools/bpf/resolve_btfids/main.c
> index d2e4176339da..3c88ea192f7b 100644
> --- a/tools/bpf/resolve_btfids/main.c
> +++ b/tools/bpf/resolve_btfids/main.c
[ ... ]
> @@ -1067,6 +1070,22 @@ static int collect_decl_tags(struct btf2btf_context *ctx)
> return 0;
> }
>
> +static bool param_name_has_suffix(const char *name, const char *suffix)
> +{
> + size_t name_len = strlen(name);
> + size_t suffix_len = strlen(suffix);
> +
> + return name_len >= suffix_len && !strcmp(name + name_len - suffix_len, suffix);
> +}
Should this be `name_len > suffix_len` instead of `name_len >= suffix_len`?
The kernel's btf_param_match_suffix() in kernel/bpf/btf.c rejects a parameter
whose name is exactly equal to the suffix:
kernel/bpf/btf.c:btf_param_match_suffix() {
...
len = strlen(param_name);
if (len <= suffix_len)
return false;
param_name += len - suffix_len;
return !strncmp(param_name, suffix, suffix_len);
}
That `len <= suffix_len` early return is what both is_kfunc_arg_arena() in
kernel/bpf/verifier.c and btf_func_model_flags() in kernel/bpf/btf.c rely on.
The same helper is also used by kernel/bpf/bpf_struct_ops.c for arena suffix
matching.
With the current implementation, a parameter named exactly "__arena" would be
treated as an arena pointer by resolve_btfids (causing address_space(1) to be
emitted in vmlinux.h), but would be treated as an ordinary kernel pointer by
the verifier's is_kfunc_arg_arena().
No in-tree kfunc currently uses a parameter named exactly "__arena" or
"__arena__nullable" (checked kernel/bpf/arena.c, test_kmods/bpf_testmod.c,
and btf_data.c), and the selftests added by commit 52b915d08490 only use
names like "a__arena", so this would be a latent inconsistency rather than a
currently-firing failure.
> +
> +static bool is_arena_param(const struct btf *btf, const struct btf_param *param)
> +{
> + const char *name = btf__name_by_offset(btf, param->name_off);
> +
> + return param_name_has_suffix(name, PARAM_SUFFIX_ARENA) ||
> + param_name_has_suffix(name, PARAM_SUFFIX_ARENA_NULLABLE);
> +}
[ ... ]
---
AI reviewed your patch. Please fix the bug or email reply why it's not a bug.
See: https://github.com/kernel-patches/vmtest/blob/master/ci/claude/README.md
CI run summary: https://github.com/kernel-patches/bpf/actions/runs/31305217088
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH bpf-next v1 2/2] selftests/bpf: Test resolve_btfids arena argument suffixes
2026-08-09 9:57 ` bot+bpf-ci
@ 2026-08-09 14:07 ` Kumar Kartikeya Dwivedi
0 siblings, 0 replies; 7+ messages in thread
From: Kumar Kartikeya Dwivedi @ 2026-08-09 14:07 UTC (permalink / raw)
To: bot+bpf-ci, bpf
Cc: ast, andrii, daniel, eddyz87, emil, tj, ihor.solodrai, kkd,
kernel-team, martin.lau, yonghong.song, clm
On Sun Aug 9, 2026 at 11:57 AM CEST, bot+bpf-ci wrote:
>> diff --git a/tools/testing/selftests/bpf/prog_tests/resolve_btfids.c b/tools/testing/selftests/bpf/prog_tests/resolve_btfids.c
>> index 732cfed35e1c..9bd84fe32b89 100644
>> --- a/tools/testing/selftests/bpf/prog_tests/resolve_btfids.c
>> +++ b/tools/testing/selftests/bpf/prog_tests/resolve_btfids.c
>> @@ -15,6 +15,7 @@
>> #define DECL_TAG_FASTCALL "bpf_fastcall"
>> #define DECL_TAG_KFUNC "bpf_kfunc"
>> #define TYPE_ATTR_ARENA "address_space(1)"
>> +#define ARENA_ARG(n) (1U << (n))
>
> This isn't a bug, but ARENA_ARG(n) is zero-based while the KF_ARENA_ARGn
> flags it sits next to are one-based, so the same argument is spelled two
> different ways inside a single table row.
>
> For example, '{ "kfunc_d", -1, KF_ARENA_ARG2, ARENA_ARG(1), false }'
> means KF_ARENA_ARG2 and ARENA_ARG(1) refer to the same parameter.
>
> Would a name like ARENA_ARG_IDX(n), or a short comment noting that
> ARENA_ARG(0) corresponds to KF_ARENA_ARG1, help keep the two columns
> from drifting?
>
I think it's ok, we might drop the other flag soon anyhow.
> [ ... ]
>
>> @@ -49,13 +50,18 @@ struct kfunc_symbol {
>> const char *name;
>> s32 id;
>> u32 flags;
>> + u32 arena_args;
>> + bool arena_ret;
>> };
>>
>> static struct kfunc_symbol kfunc_symbols[] = {
>> - { "kfunc_a", -1, 0 },
>> - { "kfunc_b", -1, KF_FASTCALL },
>> - { "kfunc_c", -1, KF_ARENA_RET | KF_ARENA_ARG1 | KF_ARENA_ARG2 },
>> - { "kfunc_d", -1, KF_ARENA_ARG2 },
>> + { "kfunc_a", -1, 0, 0, false },
>> + { "kfunc_b", -1, KF_FASTCALL, 0, false },
>> + { "kfunc_c", -1, KF_ARENA_RET | KF_ARENA_ARG1 | KF_ARENA_ARG2,
>> + ARENA_ARG(0) | ARENA_ARG(1), true },
>> + { "kfunc_d", -1, KF_ARENA_ARG2, ARENA_ARG(1), false },
>> + { "kfunc_e", -1, 0, ARENA_ARG(0) | ARENA_ARG(1) | ARENA_ARG(2) |
>> + ARENA_ARG(3) | ARENA_ARG(4), false },
>> };
>
> This isn't a bug, but the new arena_ret field duplicates information
> that the existing flags field already carries.
>
> resolve_btfids only ever arena-tags a return value from KF_ARENA_RET:
>
> tools/bpf/resolve_btfids/main.c:add_arena_tagged_proto() {
> ...
> if (kfunc->flags & KF_ARENA_RET)
> /* tag return */
> ...
> }
>
> There is no return-position suffix mechanism, so arena_ret is exactly
> !!(flags & KF_ARENA_RET) for every row and the old expression it
> replaced was already correct.
>
> Since only KF_ARENA_RET drives return tagging, could the return
> assertion keep using !!(flags & KF_ARENA_RET) instead of the new
> arena_ret field?
>
I found this more clear, but am fine with reworking in any direction.
> [ ... ]
>
>
> ---
> AI reviewed your patch. Please fix the bug or email reply why it's not a bug.
> See: https://github.com/kernel-patches/vmtest/blob/master/ci/claude/README.md
>
> CI run summary: https://github.com/kernel-patches/bpf/actions/runs/31305217088
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH bpf-next v1 1/2] resolve_btfids: Emit arena attributes from kfunc parameter suffixes
2026-08-09 10:10 ` bot+bpf-ci
@ 2026-08-09 14:08 ` Kumar Kartikeya Dwivedi
0 siblings, 0 replies; 7+ messages in thread
From: Kumar Kartikeya Dwivedi @ 2026-08-09 14:08 UTC (permalink / raw)
To: bot+bpf-ci, bpf
Cc: ast, andrii, daniel, eddyz87, emil, tj, ihor.solodrai, kkd,
kernel-team, martin.lau, yonghong.song, clm
On Sun Aug 9, 2026 at 12:10 PM CEST, bot+bpf-ci wrote:
>> diff --git a/tools/bpf/resolve_btfids/main.c b/tools/bpf/resolve_btfids/main.c
>> index d2e4176339da..3c88ea192f7b 100644
>> --- a/tools/bpf/resolve_btfids/main.c
>> +++ b/tools/bpf/resolve_btfids/main.c
>
> [ ... ]
>
>> @@ -1067,6 +1070,22 @@ static int collect_decl_tags(struct btf2btf_context *ctx)
>> return 0;
>> }
>>
>> +static bool param_name_has_suffix(const char *name, const char *suffix)
>> +{
>> + size_t name_len = strlen(name);
>> + size_t suffix_len = strlen(suffix);
>> +
>> + return name_len >= suffix_len && !strcmp(name + name_len - suffix_len, suffix);
>> +}
>
> Should this be `name_len > suffix_len` instead of `name_len >= suffix_len`?
>
> The kernel's btf_param_match_suffix() in kernel/bpf/btf.c rejects a parameter
> whose name is exactly equal to the suffix:
>
> kernel/bpf/btf.c:btf_param_match_suffix() {
> ...
> len = strlen(param_name);
> if (len <= suffix_len)
> return false;
> param_name += len - suffix_len;
> return !strncmp(param_name, suffix, suffix_len);
> }
>
> That `len <= suffix_len` early return is what both is_kfunc_arg_arena() in
> kernel/bpf/verifier.c and btf_func_model_flags() in kernel/bpf/btf.c rely on.
> The same helper is also used by kernel/bpf/bpf_struct_ops.c for arena suffix
> matching.
>
> With the current implementation, a parameter named exactly "__arena" would be
> treated as an arena pointer by resolve_btfids (causing address_space(1) to be
> emitted in vmlinux.h), but would be treated as an ordinary kernel pointer by
> the verifier's is_kfunc_arg_arena().
>
> No in-tree kfunc currently uses a parameter named exactly "__arena" or
> "__arena__nullable" (checked kernel/bpf/arena.c, test_kmods/bpf_testmod.c,
> and btf_data.c), and the selftests added by commit 52b915d08490 only use
> names like "a__arena", so this would be a latent inconsistency rather than a
> currently-firing failure.
>
I think it's fine, won't matter in practice.
>> +
>> +static bool is_arena_param(const struct btf *btf, const struct btf_param *param)
>> +{
>> + const char *name = btf__name_by_offset(btf, param->name_off);
>> +
>> + return param_name_has_suffix(name, PARAM_SUFFIX_ARENA) ||
>> + param_name_has_suffix(name, PARAM_SUFFIX_ARENA_NULLABLE);
>> +}
>
> [ ... ]
>
>
> ---
> AI reviewed your patch. Please fix the bug or email reply why it's not a bug.
> See: https://github.com/kernel-patches/vmtest/blob/master/ci/claude/README.md
>
> CI run summary: https://github.com/kernel-patches/bpf/actions/runs/31305217088
^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2026-08-09 14:08 UTC | newest]
Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-08-09 8:51 [PATCH bpf-next v1 0/2] Add resolve_btfids support for __arena kfunc suffix Kumar Kartikeya Dwivedi
2026-08-09 8:51 ` [PATCH bpf-next v1 1/2] resolve_btfids: Emit arena attributes from kfunc parameter suffixes Kumar Kartikeya Dwivedi
2026-08-09 10:10 ` bot+bpf-ci
2026-08-09 14:08 ` Kumar Kartikeya Dwivedi
2026-08-09 8:51 ` [PATCH bpf-next v1 2/2] selftests/bpf: Test resolve_btfids arena argument suffixes Kumar Kartikeya Dwivedi
2026-08-09 9:57 ` bot+bpf-ci
2026-08-09 14:07 ` Kumar Kartikeya Dwivedi
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.