On Thu, 2024-08-15 at 16:41 -0700, Martin KaFai Lau wrote: [...] > > SEC("struct_ops/test_epilogue") > > __naked int test_epilogue(void) > > { > > asm volatile ( > > "r0 = 0;" > > I also want to test a struct_ops prog making kfunc call, e.g. the > BPF_PROG(test_epilogue_kfunc) in this patch. I have never tried this in asm, so > a n00b question. Do you know if there is an example how to call kfunc? Here is an example: progs/verifier_ref_tracking.c, specifically take a look at acquire_release_user_key_reference(). The main trick is to have __kfunc_btf_root() with dummy calls, so that there are BTF signatures for kfuncs included in the object file. > > "exit;" > > ::: __clobber_all); > > } > > > > SEC(".struct_ops.link") > > struct bpf_testmod_st_ops st_ops = { > > .test_epilogue = (void *)test_epilogue, > > }; > > > > (Complete example is in the attachment). > > test_loader based tests can also trigger program execution via __retval() macro. > > The only (minor) shortcoming that I see, is that test_loader would > > load/unload st_ops map multiple times because of the following > > interaction: > > - test_loader assumes that each bpf program defines a test; > > - test_loader re-creates all maps before each test; > > - libbpf struct_ops autocreate logic marks all programs referenced > > from struct_ops map as autoloaded. > > If I understand correctly, there are redundant works but still work? Yes. > Potentially the test_loader can check all the loaded struct_ops progs of a > st_ops map at once which is an optimization. Yes, I should look into this. > Re: __retval(), the struct_ops progs is triggered by a SEC("syscall") prog. > Before calling this syscall prog, the st_ops map needs to be attached first. I > think the attach part is missing also? or there is a way? I think libbpf handles the attachment automatically, I'll double check and reply.