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 <and...@kernel.org> > --- > 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 > + memset(&info, 0, sizeof(info)); use len in memset > + 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; > +} [...]