Re: [PATCH bpf-next v1 04/14] selftests/bpf: Add kfunc set test to resolve_btfids

Ihor Solodrai <[email protected]>
Newsgroups gmane.linux.kbuild.devel,gmane.linux.kernel.bpf
Message-ID <[email protected]>
On 6/16/26 12:07 AM, Emil Tsalapatis wrote:
> On Mon Jun 1, 2026 at 6:17 PM EDT, 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.
>>
>> Signed-off-by: Ihor Solodrai <[email protected]>
> 
> Reviewed-by: Emil Tsalapatis <[email protected]>
> 
> One nit below.
> 
>> ---
>>  .../selftests/bpf/prog_tests/resolve_btfids.c | 56 +++++++++++++++++++
>>  tools/testing/selftests/bpf/progs/btf_data.c  | 10 ++++
>>  2 files changed, 66 insertions(+)
>>
>> diff --git a/tools/testing/selftests/bpf/prog_tests/resolve_btfids.c b/tools/testing/selftests/bpf/prog_tests/resolve_btfids.c
>> index d0e51979d455..f6fd79b9dd23 100644
>> --- a/tools/testing/selftests/bpf/prog_tests/resolve_btfids.c
>> +++ b/tools/testing/selftests/bpf/prog_tests/resolve_btfids.c
>> @@ -10,6 +10,10 @@
>>  #include <linux/btf_ids.h>
>>  #include "test_progs.h"
>>  
>> +#ifndef KF_FASTCALL
>> +#define KF_FASTCALL (1 << 12)
>> +#endif
>> +
>>  struct symbol {
>>  	const char	*name;
>>  	int		 type;
>> @@ -26,6 +30,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"
>> @@ -77,7 +92,13 @@ 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
>> +
>>  static int
>>  __resolve_symbol(struct btf *btf, int type_id)
>>  {
>> @@ -108,6 +129,18 @@ __resolve_symbol(struct btf *btf, int type_id)
>>  			test_symbols[i].id = type_id;
>>  	}
>>  
>> +	if (BTF_INFO_KIND(type->info) == BTF_KIND_FUNC) {
>> +		str = btf__name_by_offset(btf, type->name_off);
>> +		if (str) {
> 
> This can be rewritten to collapse the nesting:
> if (BTF_INFO_KIND(type->info) != BTF_KIND_FUNC) 
> 	return 0;
> 
> str = btf__name_by_offset(btf, type->name_off);
> if (!str)
> 	return 0;
> 
> <the rest>
> 

Hi Emil, thank you for the reviews.

I'm going to drop this string check following Andrii's suggestion, so
this condition will be removed.

Good nit though.

>> +			for (i = 0; i < ARRAY_SIZE(kfunc_symbols); i++) {
>> +				if (kfunc_symbols[i].id >= 0)
>> +					continue;
>> +				if (!strcmp(str, kfunc_symbols[i].name))
>> +					kfunc_symbols[i].id = type_id;
>> +			}
>> +		}
>> +	}
>> +
>>  	return 0;
>>  }
>>  
>> @@ -162,6 +195,29 @@ void test_resolve_btfids(void)
>>  			ASSERT_LE(test_set.ids[i - 1], test_set.ids[i], "sort_check");
>>  	}
>>  
>> +	/* Check BTF_KFUNCS_START(test_kfunc_set) */
>> +	ASSERT_EQ(test_kfunc_set.flags, BTF_SET8_KFUNCS, "kfunc_set_flags");
>> +	ASSERT_EQ(test_kfunc_set.cnt, ARRAY_SIZE(kfunc_symbols), "kfunc_set_cnt");
>> +
>> +	for (i = 0; i < test_kfunc_set.cnt; i++) {
>> +		bool found = false;
>> +
>> +		for (j = 0; j < ARRAY_SIZE(kfunc_symbols); j++) {
>> +			if (kfunc_symbols[j].id != (s32)test_kfunc_set.pairs[i].id)
>> +				continue;
>> +			found = true;
>> +			ASSERT_EQ(test_kfunc_set.pairs[i].flags,
>> +				  kfunc_symbols[j].flags, "kfunc_flags_check");
>> +			break;
>> +		}
>> +
>> +		ASSERT_TRUE(found, "kfunc_id_found");
>> +
>> +		if (i > 0)
>> +			ASSERT_LE(test_kfunc_set.pairs[i - 1].id,
>> +				  test_kfunc_set.pairs[i].id, "kfunc_sort_check");
>> +	}
>> +
>>  out:
>>  	btf__free(btf);
>>  }
>> diff --git a/tools/testing/selftests/bpf/progs/btf_data.c b/tools/testing/selftests/bpf/progs/btf_data.c
>> index baa525275bde..8587658012c3 100644
>> --- a/tools/testing/selftests/bpf/progs/btf_data.c
>> +++ b/tools/testing/selftests/bpf/progs/btf_data.c
>> @@ -48,3 +48,13 @@ int func(struct root_struct *root)
>>  {
>>  	return 0;
>>  }
>> +
>> +int kfunc_a(struct root_struct *root)
>> +{
>> +	return 0;
>> +}
>> +
>> +int kfunc_b(struct root_struct *root)
>> +{
>> +	return 0;
>> +}
>
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.