On Mon, Mar 4, 2024 at 2:52 PM Eduard Zingerman <eddyz87@xxxxxxxxx> wrote: > > E.g. allow the following struct_ops definitions: > > struct bpf_testmod_ops___v1 { int (*test)(void); }; > struct bpf_testmod_ops___v2 { int (*test)(void); }; > > SEC(".struct_ops.link") > struct bpf_testmod_ops___v1 a = { .test = ... } > SEC(".struct_ops.link") > struct bpf_testmod_ops___v2 b = { .test = ... } > > Where both bpf_testmod_ops__v1 and bpf_testmod_ops__v2 would be > resolved as 'struct bpf_testmod_ops' from kernel BTF. > > Acked-by: David Vernet <void@xxxxxxxxxxxxx> > Signed-off-by: Eduard Zingerman <eddyz87@xxxxxxxxx> > --- Acked-by: Andrii Nakryiko <andrii@xxxxxxxxxx> > tools/lib/bpf/libbpf.c | 6 +++++- > 1 file changed, 5 insertions(+), 1 deletion(-) > > diff --git a/tools/lib/bpf/libbpf.c b/tools/lib/bpf/libbpf.c > index 6c2979f1b471..e2a4c409980b 100644 > --- a/tools/lib/bpf/libbpf.c > +++ b/tools/lib/bpf/libbpf.c > @@ -948,7 +948,7 @@ static int find_btf_by_prefix_kind(const struct btf *btf, const char *prefix, > const char *name, __u32 kind); > > static int > -find_struct_ops_kern_types(struct bpf_object *obj, const char *tname, > +find_struct_ops_kern_types(struct bpf_object *obj, const char *tname_raw, > struct module_btf **mod_btf, > const struct btf_type **type, __u32 *type_id, > const struct btf_type **vtype, __u32 *vtype_id, > @@ -958,8 +958,12 @@ find_struct_ops_kern_types(struct bpf_object *obj, const char *tname, > const struct btf_member *kern_data_member; > struct btf *btf; > __s32 kern_vtype_id, kern_type_id; > + char tname[256]; > __u32 i; > > + snprintf(tname, sizeof(tname), "%.*s", > + (int)bpf_core_essential_name_len(tname_raw), tname_raw); > + > kern_type_id = find_ksym_btf_id(obj, tname, BTF_KIND_STRUCT, > &btf, mod_btf); > if (kern_type_id < 0) { > -- > 2.43.0 >