]> git.proxmox.com Git - mirror_ubuntu-jammy-kernel.git/commitdiff
libbpf: Add generic BTF type shallow copy API
authorAndrii Nakryiko <andrii@kernel.org>
Thu, 18 Mar 2021 19:40:29 +0000 (12:40 -0700)
committerAlexei Starovoitov <ast@kernel.org>
Thu, 18 Mar 2021 23:14:22 +0000 (16:14 -0700)
Add btf__add_type() API that performs shallow copy of a given BTF type from
the source BTF into the destination BTF. All the information and type IDs are
preserved, but all the strings encountered are added into the destination BTF
and corresponding offsets are rewritten. BTF type IDs are assumed to be
correct or such that will be (somehow) modified afterwards.

Signed-off-by: Andrii Nakryiko <andrii@kernel.org>
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
Link: https://lore.kernel.org/bpf/20210318194036.3521577-6-andrii@kernel.org
tools/lib/bpf/btf.c
tools/lib/bpf/btf.h
tools/lib/bpf/libbpf.map

index fe087592ad35c6acbd284ebb1a53121f262c0fd7..d30e67e7e1e5bde098fca02df25a996876870bff 100644 (file)
@@ -1629,6 +1629,54 @@ static int btf_commit_type(struct btf *btf, int data_sz)
        return btf->start_id + btf->nr_types - 1;
 }
 
+struct btf_pipe {
+       const struct btf *src;
+       struct btf *dst;
+};
+
+static int btf_rewrite_str(__u32 *str_off, void *ctx)
+{
+       struct btf_pipe *p = ctx;
+       int off;
+
+       if (!*str_off) /* nothing to do for empty strings */
+               return 0;
+
+       off = btf__add_str(p->dst, btf__str_by_offset(p->src, *str_off));
+       if (off < 0)
+               return off;
+
+       *str_off = off;
+       return 0;
+}
+
+int btf__add_type(struct btf *btf, const struct btf *src_btf, const struct btf_type *src_type)
+{
+       struct btf_pipe p = { .src = src_btf, .dst = btf };
+       struct btf_type *t;
+       int sz, err;
+
+       sz = btf_type_size(src_type);
+       if (sz < 0)
+               return sz;
+
+       /* deconstruct BTF, if necessary, and invalidate raw_data */
+       if (btf_ensure_modifiable(btf))
+               return -ENOMEM;
+
+       t = btf_add_type_mem(btf, sz);
+       if (!t)
+               return -ENOMEM;
+
+       memcpy(t, src_type, sz);
+
+       err = btf_type_visit_str_offs(t, btf_rewrite_str, &p);
+       if (err)
+               return err;
+
+       return btf_commit_type(btf, sz);
+}
+
 /*
  * Append new BTF_KIND_INT type with:
  *   - *name* - non-empty, non-NULL type name;
index 029a9cfc8c2d835f8c52030dd3e7947fa38b2216..3b0b17ba94a18d9cafb7959f80b04f3b3eaf3f57 100644 (file)
@@ -93,6 +93,8 @@ LIBBPF_API struct btf *libbpf_find_kernel_btf(void);
 
 LIBBPF_API int btf__find_str(struct btf *btf, const char *s);
 LIBBPF_API int btf__add_str(struct btf *btf, const char *s);
+LIBBPF_API int btf__add_type(struct btf *btf, const struct btf *src_btf,
+                            const struct btf_type *src_type);
 
 LIBBPF_API int btf__add_int(struct btf *btf, const char *name, size_t byte_sz, int encoding);
 LIBBPF_API int btf__add_float(struct btf *btf, const char *name, size_t byte_sz);
index ec898f464ab90d1ab8ca7106bab6a90078e27804..d31d8c968097e5f1c4d0df48cfb65a079010e28f 100644 (file)
@@ -354,4 +354,5 @@ LIBBPF_0.3.0 {
 LIBBPF_0.4.0 {
        global:
                btf__add_float;
+               btf__add_type;
 } LIBBPF_0.3.0;