mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2025-01-27 00:04:47 +08:00
bpf: get type information with BTF_ID_LIST
Get ready to remove bpf_struct_ops_init() in the future. By using BTF_ID_LIST, it is possible to gather type information while building instead of runtime. Signed-off-by: Kui-Feng Lee <thinker.li@gmail.com> Link: https://lore.kernel.org/r/20240119225005.668602-3-thinker.li@gmail.com Signed-off-by: Martin KaFai Lau <martin.lau@kernel.org>
This commit is contained in:
parent
3b1f89e747
commit
9567839538
@ -108,7 +108,12 @@ const struct bpf_prog_ops bpf_struct_ops_prog_ops = {
|
||||
#endif
|
||||
};
|
||||
|
||||
static const struct btf_type *module_type;
|
||||
BTF_ID_LIST(st_ops_ids)
|
||||
BTF_ID(struct, module)
|
||||
|
||||
enum {
|
||||
IDX_MODULE_ID,
|
||||
};
|
||||
|
||||
static void bpf_struct_ops_init_one(struct bpf_struct_ops *st_ops,
|
||||
struct btf *btf,
|
||||
@ -197,7 +202,6 @@ static void bpf_struct_ops_init_one(struct bpf_struct_ops *st_ops,
|
||||
void bpf_struct_ops_init(struct btf *btf, struct bpf_verifier_log *log)
|
||||
{
|
||||
struct bpf_struct_ops *st_ops;
|
||||
s32 module_id;
|
||||
u32 i;
|
||||
|
||||
/* Ensure BTF type is emitted for "struct bpf_struct_ops_##_name" */
|
||||
@ -205,13 +209,6 @@ void bpf_struct_ops_init(struct btf *btf, struct bpf_verifier_log *log)
|
||||
#include "bpf_struct_ops_types.h"
|
||||
#undef BPF_STRUCT_OPS_TYPE
|
||||
|
||||
module_id = btf_find_by_name_kind(btf, "module", BTF_KIND_STRUCT);
|
||||
if (module_id < 0) {
|
||||
pr_warn("Cannot find struct module in %s\n", btf_get_name(btf));
|
||||
return;
|
||||
}
|
||||
module_type = btf_type_by_id(btf, module_id);
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(bpf_struct_ops); i++) {
|
||||
st_ops = bpf_struct_ops[i];
|
||||
bpf_struct_ops_init_one(st_ops, btf, log);
|
||||
@ -387,6 +384,7 @@ static long bpf_struct_ops_map_update_elem(struct bpf_map *map, void *key,
|
||||
struct bpf_struct_ops_map *st_map = (struct bpf_struct_ops_map *)map;
|
||||
const struct bpf_struct_ops *st_ops = st_map->st_ops;
|
||||
struct bpf_struct_ops_value *uvalue, *kvalue;
|
||||
const struct btf_type *module_type;
|
||||
const struct btf_member *member;
|
||||
const struct btf_type *t = st_ops->type;
|
||||
struct bpf_tramp_links *tlinks;
|
||||
@ -434,6 +432,7 @@ static long bpf_struct_ops_map_update_elem(struct bpf_map *map, void *key,
|
||||
image = st_map->image;
|
||||
image_end = st_map->image + PAGE_SIZE;
|
||||
|
||||
module_type = btf_type_by_id(btf_vmlinux, st_ops_ids[IDX_MODULE_ID]);
|
||||
for_each_member(i, t, member) {
|
||||
const struct btf_type *mtype, *ptype;
|
||||
struct bpf_prog *prog;
|
||||
|
Loading…
Reference in New Issue
Block a user