bpf: Switch btf_parse_vmlinux to btf_find_by_name_kind
authorAndrey Ignatov <rdna@fb.com>
Fri, 19 Jun 2020 21:11:41 +0000 (14:11 -0700)
committerDaniel Borkmann <daniel@iogearbox.net>
Mon, 22 Jun 2020 20:22:58 +0000 (22:22 +0200)
btf_parse_vmlinux() implements manual search for struct bpf_ctx_convert
since at the time of implementing btf_find_by_name_kind() was not
available.

Later btf_find_by_name_kind() was introduced in 27ae7997a661 ("bpf:
Introduce BPF_PROG_TYPE_STRUCT_OPS"). It provides similar search
functionality and can be leveraged in btf_parse_vmlinux(). Do it.

Signed-off-by: Andrey Ignatov <rdna@fb.com>
Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
Acked-by: Andrii Nakryiko <andriin@fb.com>
Acked-by: John Fastabend <john.fastabend@gmail.com>
Acked-by: Martin KaFai Lau <kafai@fb.com>
Link: https://lore.kernel.org/bpf/6e12d5c3e8a3d552925913ef73a695dd1bb27800.1592600985.git.rdna@fb.com
kernel/bpf/btf.c

index 58c9af1d480820332a332685790027cdc99fcc52..3eb804618a532de0ef0748143db51ab65d32e29b 100644 (file)
@@ -3591,7 +3591,7 @@ struct btf *btf_parse_vmlinux(void)
        struct btf_verifier_env *env = NULL;
        struct bpf_verifier_log *log;
        struct btf *btf = NULL;
-       int err, i;
+       int err, btf_id;
 
        env = kzalloc(sizeof(*env), GFP_KERNEL | __GFP_NOWARN);
        if (!env)
@@ -3625,24 +3625,13 @@ struct btf *btf_parse_vmlinux(void)
                goto errout;
 
        /* find struct bpf_ctx_convert for type checking later */
-       for (i = 1; i <= btf->nr_types; i++) {
-               const struct btf_type *t;
-               const char *tname;
-
-               t = btf_type_by_id(btf, i);
-               if (!__btf_type_is_struct(t))
-                       continue;
-               tname = __btf_name_by_offset(btf, t->name_off);
-               if (!strcmp(tname, "bpf_ctx_convert")) {
-                       /* btf_parse_vmlinux() runs under bpf_verifier_lock */
-                       bpf_ctx_convert.t = t;
-                       break;
-               }
-       }
-       if (i > btf->nr_types) {
-               err = -ENOENT;
+       btf_id = btf_find_by_name_kind(btf, "bpf_ctx_convert", BTF_KIND_STRUCT);
+       if (btf_id < 0) {
+               err = btf_id;
                goto errout;
        }
+       /* btf_parse_vmlinux() runs under bpf_verifier_lock */
+       bpf_ctx_convert.t = btf_type_by_id(btf, btf_id);
 
        bpf_struct_ops_init(btf, log);