On Tue, 2024-02-27 at 17:18 +0100, Benjamin Tissoires wrote: [...]
Hmm, I must still be missing a piece of the puzzle: if I declare bpf_timer_set_sleepable_cb() to take a third "aux" argument, given that it is declared as kfunc, I also must declare it in my bpf program, or I get the following:
# libbpf: extern (func ksym) 'bpf_timer_set_sleepable_cb': func_proto [264] incompatible with vmlinux [18151]
And if I declare it, then I don't know what to pass, given that this is purely added by the verifier:
43: (85) call bpf_timer_set_sleepable_cb#18152 arg#2 pointer type STRUCT bpf_prog_aux must point to scalar, or struct with scalar
Right, something has to be done about number of arguments and we don't have a convenient mechanism for this afaik.
The simplest way would be to have two kfuncs: - one with 2 arguments, used form bpf program; - another with 3 arguments, used at runtime; - replace former by latter during rewrite.
Maybe I should teach the verifier that this kfunc only takes 2 arguments, and the third one is virtual, but that also means that when the kfunc definitions are to be included in vmlinux.h, they would also have this special case.
It might be a somewhat generic mechanism, e.g. btf_decl_tag("hidden") for kfunc parameter.
imho, having two kfuncs is less hacky.
(I just tried with a blank u64 instead of the struct bpf_prog_aux*, but it crashes with KASAN complaining).
For my understanding: - you added a 3rd param (void *) to kfunc; - passed it as zero in BPF program; - applied the above rewrite, so that r3 equals to prog->aux; - and now KASAN complains, right?
Could you please provide more details on what exactly it complains about?