Re: [RFC PATCH bpf-next v2 2/2] selftests/bpf: add tests for selective kmod BTF loading

Fuyu Zhao <[email protected]>
Newsgroups org.kernel.vger.bpf
Message-ID <[email protected]>

On 8/13/2026 12:22 PM, [email protected] wrote:
>> diff --git a/tools/testing/selftests/bpf/prog_tests/kmod_btfs.c b/tools/testing/selftests/bpf/prog_tests/kmod_btfs.c
>> new file mode 100644
>> index 0000000000000..d875fcce6681d
>> --- /dev/null
>> +++ b/tools/testing/selftests/bpf/prog_tests/kmod_btfs.c
>> @@ -0,0 +1,52 @@
> 
> [ ... ]
> 
>> +static void kmod_btfs_nonexist(void)
>> +{
>> +	struct kmod_btfs_nonexist *kmod_btfs_nonexist_skel;
>> +
>> +	kmod_btfs_nonexist_skel = kmod_btfs_nonexist__open_and_load();
>> +	ASSERT_NULL(kmod_btfs_nonexist_skel, "kmod_btfs_nonexist__open_and_load");
>> +}
> 
> On the path where this assertion unexpectedly fails (i.e. the skeleton
> loads when it should not), does the bpf_object leak?  There is no
> 'kmod_btfs_nonexist__destroy()' call before the function returns.
> 
> The other two subtests (kmod_btfs_pass and kmod_btfs_mix) call
> '__destroy()'.  Test_progs runs hundreds of subtests in one process,
> so leaked fds stay open for the rest of the run.  The usual pattern is:
> 
> 	if (!ASSERT_NULL(skel, "kmod_btfs_nonexist__open_and_load"))
> 		kmod_btfs_nonexist__destroy(skel);
> 
> Also, the ASSERT_NULL check accepts any load failure at all.  Without
> privileges, load_module_btfs() returns 0 early ('skipping module BTFs
> loading, missing privileges'), so '__open_and_load()' returns NULL and
> this subtest passes without exercising '.kmod_btfs' handling.  The same
> is true if vmlinux BTF is unavailable, ftrace cannot hook the target,
> or there is a typo in the SEC() name.
> 
> The positive baseline that rules those out lives in kmod_btfs_pass, but
> test_progs subtests are individually selectable:
> 
> 	./test_progs -t kmod_btfs/kmod_btfs_nonexist
> 
> so running this subtest alone gives green with no baseline.  Would it
> be clearer to check the error more precisely (find_kernel_btf_id()
> returns -ESRCH here), or load a known-good variant inside the same
> subtest?
> 

Thanks, good points. I'll fix the leak and make the test distinguish
the expected failure from unrelated load failures.

> [ ... ]
> 
>> diff --git a/tools/testing/selftests/bpf/progs/kmod_btfs_mix.c b/tools/testing/selftests/bpf/progs/kmod_btfs_mix.c
>> new file mode 100644
>> index 0000000000000..f445cf56ab161
>> --- /dev/null
>> +++ b/tools/testing/selftests/bpf/progs/kmod_btfs_mix.c
>> @@ -0,0 +1,15 @@
> 
> [ ... ]
> 
>> +/* mix of duplicated and unneeded modules */
>> +DEFINE_KMOD_BTFS(_needed_kmods) = { "bpf_testmod", "bpf_testmod", "bpf_test_no_cfi" };
> 
> Is 'bpf_test_no_cfi' loaded when this subtest runs?  Looking at
> test_progs.c, load_bpf_testmod() at lines 2083-2092 loads only
> bpf_testmod.ko.  The bpf_test_no_cfi.ko module is inserted and
> immediately removed by prog_tests/test_struct_ops_no_cfi.c via
> open()/finit_module()/delete_module().
> 
> That means the third entry has no module BTF in the system and exercises
> the same path as the 'module_nonexist' entry in kmod_btfs_nonexist.c:
> the name is simply never matched in load_module_btfs().
> 
> That leaves the interesting case untested: a module whose BTF is present
> but which the program does not need, which would prove libbpf actually
> skips it as the commit message advertises ('providing a mix of repeated
> and extra module names').  Would naming a module that is guaranteed
> loaded exercise that path?
> 

Thanks for pointing this out. I'll use a guaranteed loaded module to
test the unneeded module BTF case.

> 
> ---
> 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/31664172915
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.