On Mon, Oct 5, 2020 at 9:40 AM Luigi Rizzo <lrizzo@xxxxxxxxxx> wrote: > > bpf_program__set_attach_target() will always fail with fd=0 (attach to a > kernel symbol) because obj->btf_vmlinux is NULL and there is no way to > set it. > > Fix this by using libbpf_find_vmlinux_btf_id() > > (on a side note: it is unclear whether btf_vmlinux is meant to be > just temporary storage for use in bpf_object__load_xattr(), or > a property of bpf_object, in which case it could be initialuzed > opportunistically, and properly released in bpf_object__close() ). It's more of a former. vmlinux BTF shouldn't be needed past bpf_object's load phase, so there is no need to keep a few megabytes of memory laying around needlessly. > > Signed-off-by: Luigi Rizzo <lrizzo@xxxxxxxxxx> > --- > tools/lib/bpf/libbpf.c | 5 ++--- > 1 file changed, 2 insertions(+), 3 deletions(-) > > diff --git a/tools/lib/bpf/libbpf.c b/tools/lib/bpf/libbpf.c > index a4f55f8a460d..33bf102259dd 100644 > --- a/tools/lib/bpf/libbpf.c > +++ b/tools/lib/bpf/libbpf.c > @@ -10353,9 +10353,8 @@ int bpf_program__set_attach_target(struct bpf_program *prog, > btf_id = libbpf_find_prog_btf_id(attach_func_name, > attach_prog_fd); > else > - btf_id = __find_vmlinux_btf_id(prog->obj->btf_vmlinux, > - attach_func_name, > - prog->expected_attach_type); > + btf_id = libbpf_find_vmlinux_btf_id(attach_func_name, > + prog->expected_attach_type); It's a bit inefficient, if you need to do this for a few programs, but it's ok as a fix. We'll need to unify this internal vmlinux BTF caching at some point. Acked-by: Andrii Nakryiko <andriin@xxxxxx> > > if (btf_id < 0) > return btf_id; > -- > 2.28.0.806.g8561365e88-goog >