On Thu, Nov 19, 2020 at 4:55 PM Maciej Fijalkowski <maciej.fijalkowski@xxxxxxxxx> wrote: > > On Thu, Nov 19, 2020 at 03:22:42PM -0800, Andrii Nakryiko wrote: > > Teach libbpf to search for candidate types for CO-RE relocations across kernel > > modules BTFs, in addition to vmlinux BTF. If at least one candidate type is > > found in vmlinux BTF, kernel module BTFs are not iterated. If vmlinux BTF has > > no matching candidates, then find all kernel module BTFs and search for all > > matching candidates across all of them. > > > > Kernel's support for module BTFs are inferred from the support for BTF name > > pointer in BPF UAPI. > > > > Signed-off-by: Andrii Nakryiko <andrii@xxxxxxxxxx> > > --- > > tools/lib/bpf/libbpf.c | 185 ++++++++++++++++++++++++++++++++++++++--- > > 1 file changed, 172 insertions(+), 13 deletions(-) > > > > [...] > > > +static int probe_module_btf(void) > > +{ > > + static const char strs[] = "\0int"; > > + __u32 types[] = { > > + /* int */ > > + BTF_TYPE_INT_ENC(1, BTF_INT_SIGNED, 0, 32, 4), > > + }; > > + struct bpf_btf_info info; > > + __u32 len = sizeof(info); > > + char name[16]; > > + int fd, err; > > + > > + fd = libbpf__load_raw_btf((char *)types, sizeof(types), strs, sizeof(strs)); > > + if (fd < 0) > > + return 0; /* BTF not supported at all */ > > + > > + len = sizeof(info); > > nit: reinit of len > oops, right, I'll remove it > > + memset(&info, 0, sizeof(info)); > > use len in memset why? > > > + info.name = ptr_to_u64(name); > > + info.name_len = sizeof(name); > > + > > + /* check that BPF_OBJ_GET_INFO_BY_FD supports specifying name pointer; > > + * kernel's module BTF support coincides with support for > > + * name/name_len fields in struct bpf_btf_info. > > + */ > > + err = bpf_obj_get_info_by_fd(fd, &info, &len); > > + close(fd); > > + return !err; > > +} > > [...]