]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
resolve_btfids: Factor out load_btf()
authorIhor Solodrai <ihor.solodrai@linux.dev>
Fri, 19 Dec 2025 18:13:15 +0000 (10:13 -0800)
committerAndrii Nakryiko <andrii@kernel.org>
Fri, 19 Dec 2025 18:55:40 +0000 (10:55 -0800)
Increase the lifetime of parsed BTF in resolve_btfids by factoring
load_btf() routine out of symbols_resolve() and storing the base_btf
and btf pointers in the struct object.

Signed-off-by: Ihor Solodrai <ihor.solodrai@linux.dev>
Signed-off-by: Andrii Nakryiko <andrii@kernel.org>
Tested-by: Alan Maguire <alan.maguire@oracle.com>
Acked-by: Eduard Zingerman <eddyz87@gmail.com>
Link: https://lore.kernel.org/bpf/20251219181321.1283664-3-ihor.solodrai@linux.dev
tools/bpf/resolve_btfids/main.c

index 164f0c941f047aad425f3ba1cd9401271f88fbf5..b4caae1170dd9282700ad1d1b4f58f912732bc7a 100644 (file)
@@ -116,6 +116,9 @@ struct object {
        const char *btf_path;
        const char *base_btf_path;
 
+       struct btf *btf;
+       struct btf *base_btf;
+
        struct {
                int              fd;
                Elf             *elf;
@@ -529,16 +532,10 @@ static int symbols_collect(struct object *obj)
        return 0;
 }
 
-static int symbols_resolve(struct object *obj)
+static int load_btf(struct object *obj)
 {
-       int nr_typedefs = obj->nr_typedefs;
-       int nr_structs  = obj->nr_structs;
-       int nr_unions   = obj->nr_unions;
-       int nr_funcs    = obj->nr_funcs;
-       struct btf *base_btf = NULL;
-       int err, type_id;
-       struct btf *btf;
-       __u32 nr_types;
+       struct btf *base_btf = NULL, *btf = NULL;
+       int err;
 
        if (obj->base_btf_path) {
                base_btf = btf__parse(obj->base_btf_path, NULL);
@@ -546,7 +543,7 @@ static int symbols_resolve(struct object *obj)
                if (err) {
                        pr_err("FAILED: load base BTF from %s: %s\n",
                               obj->base_btf_path, strerror(-err));
-                       return -1;
+                       goto out_err;
                }
        }
 
@@ -555,9 +552,30 @@ static int symbols_resolve(struct object *obj)
        if (err) {
                pr_err("FAILED: load BTF from %s: %s\n",
                        obj->btf_path ?: obj->path, strerror(-err));
-               goto out;
+               goto out_err;
        }
 
+       obj->base_btf = base_btf;
+       obj->btf = btf;
+
+       return 0;
+
+out_err:
+       btf__free(base_btf);
+       btf__free(btf);
+       return err;
+}
+
+static int symbols_resolve(struct object *obj)
+{
+       int nr_typedefs = obj->nr_typedefs;
+       int nr_structs  = obj->nr_structs;
+       int nr_unions   = obj->nr_unions;
+       int nr_funcs    = obj->nr_funcs;
+       struct btf *btf = obj->btf;
+       int err, type_id;
+       __u32 nr_types;
+
        err = -1;
        nr_types = btf__type_cnt(btf);
 
@@ -615,8 +633,6 @@ static int symbols_resolve(struct object *obj)
 
        err = 0;
 out:
-       btf__free(base_btf);
-       btf__free(btf);
        return err;
 }
 
@@ -824,6 +840,9 @@ int main(int argc, const char **argv)
        if (symbols_collect(&obj))
                goto out;
 
+       if (load_btf(&obj))
+               goto out;
+
        if (symbols_resolve(&obj))
                goto out;
 
@@ -833,6 +852,8 @@ int main(int argc, const char **argv)
        if (!(fatal_warnings && warnings))
                err = 0;
 out:
+       btf__free(obj.base_btf);
+       btf__free(obj.btf);
        if (obj.efile.elf) {
                elf_end(obj.efile.elf);
                close(obj.efile.fd);