> On Dec 18, 2024, at 4:17 PM, Alexei Starovoitov <alexei.starovoitov@xxxxxxxxx> wrote: [...] >>> This part is not necessary. >>> _locked() shouldn't be exposed and it should be an error >>> if bpf prog attempts to use invalid kfunc. >> >> I was implementing this in different way than the solution you and Kumar >> suggested. Instead of updating this in add_kfunc_call, check_kfunc_call, >> and fixup_kfunc_call, remap_kfunc_locked_func_id happens before >> add_kfunc_call. Then, for the rest of the process, the verifier handles >> _locked version and not _locked version as two different kfuncs. This is >> why we need the _locked version in bpf_fs_kfunc_set_ids. I personally >> think this approach is a lot cleaner. > > I see. Blind rewrite in add_kfunc_call() looks simpler, > but allowing progs call _locked() version directly is not clean. Agreed. > > See specialize_kfunc() as an existing approach that does polymorphism. > > _locked() doesn't need to be __bpf_kfunc annotated. > It can be just like bpf_dynptr_from_skb_rdonly. I am thinking about a more modular approach. Instead of pushing the polymorphism logic to verifer.c, we can have each btf_kfunc_id_set handle the remap of its kfuncs. Specifically, we can extend btf_kfunc_id_set as: typedef u32 (*btf_kfunc_remap_t)(const struct bpf_prog *prog, u32 kfunc_id); struct btf_kfunc_id_set { struct module *owner; struct btf_id_set8 *set; /* hidden_set contains kfuncs that are not marked as kfunc in * vmlinux.h. These kfuncs are usually a variation of a kfunc * in @set. */ struct btf_id_set8 *hidden_set; btf_kfunc_filter_t filter; /* @remap method matches kfuncs in @set to proper version in * @hidden_set. */ btf_kfunc_remap_t remap; }; In this case, not_locked version of kfuncs will be added to @set; while _locked kfuncs will be added to @hidden_set. @hidden_set will not be exposed in vmlinux.h. Then the new remap method is used to map not_locked kfuncs to _locked kfuncs for inode-locked context. We can also move bpf_dynptr_from_skb_rdonly to this model, and simplify specialize_kfunc(). I will send patch for this version for review. Thanks, Song