Re: [PATCH bpf-next v1 4/4] selftests/bpf: Add kfunc set test to resolve_btfids
Ihor Solodrai <[email protected]> Tue, 23 Jun 2026 17:59:13 -0700
| Newsgroups | gmane.linux.kernel.bpf,gmane.linux.kbuild.devel |
|---|---|
| Message-ID | <[email protected]> |
On 6/18/26 5:31 AM, Jiri Olsa wrote: > On Wed, Jun 17, 2026 at 02:06:19PM -0700, Ihor Solodrai wrote: >> Extend the resolve_btfids selftest to cover kfunc sets defined with >> BTF_KFUNCS_START/BTF_KFUNCS_END. >> >> The test verifies that resolve_btfids correctly processes BTF_ID_FLAGS, >> resolves function IDs, and checks the kfunc set is sorted. >> >> Reviewed-by: Emil Tsalapatis <[email protected]> >> Signed-off-by: Ihor Solodrai <[email protected]> >> --- >> .../selftests/bpf/prog_tests/resolve_btfids.c | 63 ++++++++++++++++--- >> tools/testing/selftests/bpf/progs/btf_data.c | 10 +++ >> 2 files changed, 66 insertions(+), 7 deletions(-) >> >> diff --git a/tools/testing/selftests/bpf/prog_tests/resolve_btfids.c b/tools/testing/selftests/bpf/prog_tests/resolve_btfids.c >> index 6bcadee50bb8..65ede3ac5845 100644 >> --- a/tools/testing/selftests/bpf/prog_tests/resolve_btfids.c >> +++ b/tools/testing/selftests/bpf/prog_tests/resolve_btfids.c >> @@ -12,6 +12,10 @@ >> >> #define BTF_DATA_FILE "resolve_btfids.test.o.BTF" >> >> +#ifndef KF_FASTCALL >> +#define KF_FASTCALL (1 << 12) >> +#endif >> + >> struct symbol { >> const char *name; >> int type; >> @@ -28,6 +32,17 @@ struct symbol test_symbols[] = { >> { "func", BTF_KIND_FUNC, -1 }, >> }; >> >> +struct kfunc_symbol { >> + const char *name; >> + s32 id; >> + u32 flags; >> +}; >> + >> +static struct kfunc_symbol kfunc_symbols[] = { >> + { "kfunc_a", -1, 0 }, >> + { "kfunc_b", -1, KF_FASTCALL }, >> +}; >> + >> /* Align the .BTF_ids section to 4 bytes */ >> asm ( >> ".pushsection " BTF_IDS_SECTION " ,\"a\"; \n" >> @@ -35,9 +50,9 @@ asm ( >> ".popsection; \n"); >> >> /* >> - * test_list_local and test_set are .local symbols placed in .BTF_ids by >> - * inline asm, and are read here directly by C name. To the compiler they >> - * are plain, default-visibility extern objects. >> + * test_list_local, test_set and test_kfunc_set are .local symbols placed >> + * in .BTF_ids by inline asm, and are read here directly by C name. To the >> + * compiler they are plain, default-visibility extern objects. >> * >> * When test_progs is linked as a position-independent executable (PIE), >> * taking the address of such an extern is routed through the GOT. The >> @@ -69,6 +84,11 @@ BTF_ID(struct, S) >> BTF_ID(union, U) >> BTF_ID(func, func) >> BTF_SET_END(test_set) >> + >> +BTF_KFUNCS_START(test_kfunc_set) >> +BTF_ID_FLAGS(func, kfunc_a) >> +BTF_ID_FLAGS(func, kfunc_b, KF_FASTCALL) >> +BTF_KFUNCS_END(test_kfunc_set) >> #pragma GCC visibility pop >> >> extern __u32 test_list_global[]; >> @@ -92,6 +112,8 @@ __resolve_symbol(struct btf *btf, int type_id) >> if (!ASSERT_OK_PTR(type, "btf__type_by_id")) >> return -1; >> >> + str = btf__name_by_offset(btf, type->name_off); > > should we assert str != NULL like below? Andrii commented earlier that there is no point in double checking strings returned by btf__name_by_offset(), we should always expect a valid string. Crashing is fine if it's not the case. The check below is removed. > > jirka > >> + >> for (i = 0; i < ARRAY_SIZE(test_symbols); i++) { >> if (test_symbols[i].id >= 0) >> continue; >> @@ -99,14 +121,20 @@ __resolve_symbol(struct btf *btf, int type_id) >> if (BTF_INFO_KIND(type->info) != test_symbols[i].type) >> continue; >> >> - str = btf__name_by_offset(btf, type->name_off); >> - if (!ASSERT_OK_PTR(str, "btf__name_by_offset")) >> - return -1; >> - >> if (!strcmp(str, test_symbols[i].name)) >> test_symbols[i].id = type_id; >> } >> > > SNIP