bpf: get type information with BTF_ID_LIST
authorKui-Feng Lee <thinker.li@gmail.com>
Fri, 19 Jan 2024 22:49:53 +0000 (14:49 -0800)
committerMartin KaFai Lau <martin.lau@kernel.org>
Wed, 24 Jan 2024 00:37:43 +0000 (16:37 -0800)
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>
kernel/bpf/bpf_struct_ops.c

index 96cba76f4ac3afc0887102cced1957ea1eeabe48..5b3ebcb435d04e1e32a0947aa21d1f70e749d533 100644 (file)
@@ -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;