Skip to content

Commit

Permalink
libbpf: Add generic BTF type shallow copy API
Browse files Browse the repository at this point in the history
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 <[email protected]>
Signed-off-by: Alexei Starovoitov <[email protected]>
Link: https://lore.kernel.org/bpf/[email protected]
  • Loading branch information
anakryiko authored and Alexei Starovoitov committed Mar 18, 2021
1 parent 90d76d3 commit 9af44bc
Show file tree
Hide file tree
Showing 3 changed files with 51 additions and 0 deletions.
48 changes: 48 additions & 0 deletions tools/lib/bpf/btf.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
2 changes: 2 additions & 0 deletions tools/lib/bpf/btf.h
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
1 change: 1 addition & 0 deletions tools/lib/bpf/libbpf.map
Original file line number Diff line number Diff line change
Expand Up @@ -354,4 +354,5 @@ LIBBPF_0.3.0 {
LIBBPF_0.4.0 {
global:
btf__add_float;
btf__add_type;
} LIBBPF_0.3.0;

0 comments on commit 9af44bc

Please sign in to comment.