Message ID | 20231217081132.1025020-16-thinker.li@gmail.com (mailing list archive) |
---|---|
State | Not Applicable |
Delegated to: | BPF |
Headers | show |
Series | None | expand |
Sorry! Please skip this particular patch, which is a redundant of another patch in the same subject. I sent this out accidentally. On 12/17/23 00:11, thinker.li@gmail.com wrote: > From: Kui-Feng Lee <thinker.li@gmail.com> > > Include btf object id (btf_obj_id) in bpf_map_info so that tools (ex: > bpftools struct_ops dump) know the correct btf from the kernel to look up > type information of struct_ops types. > > Since struct_ops types can be defined and registered in a module. The > type information of a struct_ops type are defined in the btf of the > module defining it. The userspace tools need to know which btf is for > the module defining a struct_ops type. > > Signed-off-by: Kui-Feng Lee <thinker.li@gmail.com> > --- > include/linux/bpf.h | 1 + > include/uapi/linux/bpf.h | 2 +- > kernel/bpf/bpf_struct_ops.c | 7 +++++++ > kernel/bpf/syscall.c | 2 ++ > tools/include/uapi/linux/bpf.h | 2 +- > 5 files changed, 12 insertions(+), 2 deletions(-) > > diff --git a/include/linux/bpf.h b/include/linux/bpf.h > index 432f37c979ff..469d26d27e64 100644 > --- a/include/linux/bpf.h > +++ b/include/linux/bpf.h > @@ -1740,6 +1740,7 @@ struct bpf_dummy_ops { > int bpf_struct_ops_test_run(struct bpf_prog *prog, const union bpf_attr *kattr, > union bpf_attr __user *uattr); > #endif > +void bpf_map_struct_ops_info_fill(struct bpf_map_info *info, struct bpf_map *map); > #else > static inline const struct bpf_struct_ops_desc *bpf_struct_ops_find(u32 type_id) > { > diff --git a/include/uapi/linux/bpf.h b/include/uapi/linux/bpf.h > index e0545201b55f..7ab00babcccc 100644 > --- a/include/uapi/linux/bpf.h > +++ b/include/uapi/linux/bpf.h > @@ -6529,7 +6529,7 @@ struct bpf_map_info { > __u32 btf_id; > __u32 btf_key_type_id; > __u32 btf_value_type_id; > - __u32 :32; /* alignment pad */ > + __u32 btf_vmlinux_id; > __u64 map_extra; > } __attribute__((aligned(8))); > > diff --git a/kernel/bpf/bpf_struct_ops.c b/kernel/bpf/bpf_struct_ops.c > index 2b0c402740cc..679bcdf763ef 100644 > --- a/kernel/bpf/bpf_struct_ops.c > +++ b/kernel/bpf/bpf_struct_ops.c > @@ -947,3 +947,10 @@ int bpf_struct_ops_link_create(union bpf_attr *attr) > kfree(link); > return err; > } > + > +void bpf_map_struct_ops_info_fill(struct bpf_map_info *info, struct bpf_map *map) > +{ > + struct bpf_struct_ops_map *st_map = (struct bpf_struct_ops_map *)map; > + > + info->btf_vmlinux_id = btf_obj_id(st_map->btf); > +} > diff --git a/kernel/bpf/syscall.c b/kernel/bpf/syscall.c > index d63c1ed42412..54a97c269e7a 100644 > --- a/kernel/bpf/syscall.c > +++ b/kernel/bpf/syscall.c > @@ -4726,6 +4726,8 @@ static int bpf_map_get_info_by_fd(struct file *file, > info.btf_value_type_id = map->btf_value_type_id; > } > info.btf_vmlinux_value_type_id = map->btf_vmlinux_value_type_id; > + if (map->map_type == BPF_MAP_TYPE_STRUCT_OPS) > + bpf_map_struct_ops_info_fill(&info, map); > > if (bpf_map_is_offloaded(map)) { > err = bpf_map_offload_info_fill(&info, map); > diff --git a/tools/include/uapi/linux/bpf.h b/tools/include/uapi/linux/bpf.h > index e0545201b55f..7ab00babcccc 100644 > --- a/tools/include/uapi/linux/bpf.h > +++ b/tools/include/uapi/linux/bpf.h > @@ -6529,7 +6529,7 @@ struct bpf_map_info { > __u32 btf_id; > __u32 btf_key_type_id; > __u32 btf_value_type_id; > - __u32 :32; /* alignment pad */ > + __u32 btf_vmlinux_id; > __u64 map_extra; > } __attribute__((aligned(8))); >
diff --git a/include/linux/bpf.h b/include/linux/bpf.h index 432f37c979ff..469d26d27e64 100644 --- a/include/linux/bpf.h +++ b/include/linux/bpf.h @@ -1740,6 +1740,7 @@ struct bpf_dummy_ops { int bpf_struct_ops_test_run(struct bpf_prog *prog, const union bpf_attr *kattr, union bpf_attr __user *uattr); #endif +void bpf_map_struct_ops_info_fill(struct bpf_map_info *info, struct bpf_map *map); #else static inline const struct bpf_struct_ops_desc *bpf_struct_ops_find(u32 type_id) { diff --git a/include/uapi/linux/bpf.h b/include/uapi/linux/bpf.h index e0545201b55f..7ab00babcccc 100644 --- a/include/uapi/linux/bpf.h +++ b/include/uapi/linux/bpf.h @@ -6529,7 +6529,7 @@ struct bpf_map_info { __u32 btf_id; __u32 btf_key_type_id; __u32 btf_value_type_id; - __u32 :32; /* alignment pad */ + __u32 btf_vmlinux_id; __u64 map_extra; } __attribute__((aligned(8))); diff --git a/kernel/bpf/bpf_struct_ops.c b/kernel/bpf/bpf_struct_ops.c index 2b0c402740cc..679bcdf763ef 100644 --- a/kernel/bpf/bpf_struct_ops.c +++ b/kernel/bpf/bpf_struct_ops.c @@ -947,3 +947,10 @@ int bpf_struct_ops_link_create(union bpf_attr *attr) kfree(link); return err; } + +void bpf_map_struct_ops_info_fill(struct bpf_map_info *info, struct bpf_map *map) +{ + struct bpf_struct_ops_map *st_map = (struct bpf_struct_ops_map *)map; + + info->btf_vmlinux_id = btf_obj_id(st_map->btf); +} diff --git a/kernel/bpf/syscall.c b/kernel/bpf/syscall.c index d63c1ed42412..54a97c269e7a 100644 --- a/kernel/bpf/syscall.c +++ b/kernel/bpf/syscall.c @@ -4726,6 +4726,8 @@ static int bpf_map_get_info_by_fd(struct file *file, info.btf_value_type_id = map->btf_value_type_id; } info.btf_vmlinux_value_type_id = map->btf_vmlinux_value_type_id; + if (map->map_type == BPF_MAP_TYPE_STRUCT_OPS) + bpf_map_struct_ops_info_fill(&info, map); if (bpf_map_is_offloaded(map)) { err = bpf_map_offload_info_fill(&info, map); diff --git a/tools/include/uapi/linux/bpf.h b/tools/include/uapi/linux/bpf.h index e0545201b55f..7ab00babcccc 100644 --- a/tools/include/uapi/linux/bpf.h +++ b/tools/include/uapi/linux/bpf.h @@ -6529,7 +6529,7 @@ struct bpf_map_info { __u32 btf_id; __u32 btf_key_type_id; __u32 btf_value_type_id; - __u32 :32; /* alignment pad */ + __u32 btf_vmlinux_id; __u64 map_extra; } __attribute__((aligned(8)));