On Mon, Feb 26, 2024 at 5:04 PM Kui-Feng Lee <thinker.li@xxxxxxxxx> wrote: > > For a struct_ops map, btf_value_type_id is the type ID of it's struct > type. This value is required by bpftool to generate skeleton including > pointers of shadow types. The code generator gets the type ID from > bpf_map__btf_vaule_type_id() in order to get the type information of the > struct type of a map. > > Signed-off-by: Kui-Feng Lee <thinker.li@xxxxxxxxx> > --- > tools/lib/bpf/libbpf.c | 5 ++++- > 1 file changed, 4 insertions(+), 1 deletion(-) > > diff --git a/tools/lib/bpf/libbpf.c b/tools/lib/bpf/libbpf.c > index ef8fd20f33ca..465b50235a01 100644 > --- a/tools/lib/bpf/libbpf.c > +++ b/tools/lib/bpf/libbpf.c > @@ -1229,6 +1229,7 @@ static int init_struct_ops_maps(struct bpf_object *obj, const char *sec_name, > map->name = strdup(var_name); > if (!map->name) > return -ENOMEM; > + map->btf_value_type_id = type_id; > this part is good > map->def.type = BPF_MAP_TYPE_STRUCT_OPS; > map->def.key_size = sizeof(int); > @@ -4818,7 +4819,9 @@ static int bpf_object__create_map(struct bpf_object *obj, struct bpf_map *map, b > if (obj->btf && btf__fd(obj->btf) >= 0) { > create_attr.btf_fd = btf__fd(obj->btf); > create_attr.btf_key_type_id = map->btf_key_type_id; > - create_attr.btf_value_type_id = map->btf_value_type_id; > + create_attr.btf_value_type_id = > + def->type != BPF_MAP_TYPE_STRUCT_OPS ? > + map->btf_value_type_id : 0; but here I think it's cleaner to reset create_attr.btf_value_type_id to zero a bit lower, see that we have special logic for PERF_EVENT_ARRAY, CGROUP_ARRAY and a bunch more maps. Just add a case for BPF_MAP_TYPE_STRUCT_OPS that will clear create_attr.btf_value_type_id only (keeping btf_fd and map->btf_value_Type_id intact) > } > > if (bpf_map_type__is_map_in_map(def->type)) { > -- > 2.34.1 >