• Andrii Nakryiko's avatar
    libbpf: Teach bpf_link_create() to fallback to bpf_raw_tracepoint_open() · 8462e0b4
    Andrii Nakryiko authored
    Teach bpf_link_create() to fallback to bpf_raw_tracepoint_open() on
    older kernels for programs that are attachable through
    BPF_RAW_TRACEPOINT_OPEN. This makes bpf_link_create() more unified and
    convenient interface for creating bpf_link-based attachments.
    
    With this approach end users can just use bpf_link_create() for
    tp_btf/fentry/fexit/fmod_ret/lsm program attachments without needing to
    care about kernel support, as libbpf will handle this transparently. On
    the other hand, as newer features (like BPF cookie) are added to
    LINK_CREATE interface, they will be readily usable though the same
    bpf_link_create() API without any major refactoring from user's
    standpoint.
    
    bpf_program__attach_btf_id() is now using bpf_link_create() internally
    as well and will take advantaged of this unified interface when BPF
    cookie is added for fentry/fexit.
    
    Doing proactive feature detection of LINK_CREATE support for
    fentry/tp_btf/etc is quite involved. It requires parsing vmlinux BTF,
    determining some stable and guaranteed to be in all kernels versions
    target BTF type (either raw tracepoint or fentry target function),
    actually attaching this program and thus potentially affecting the
    performance of the host kernel briefly, etc. So instead we are taking
    much simpler "lazy" approach of falling back to
    bpf_raw_tracepoint_open() call only if initial LINK_CREATE command
    fails. For modern kernels this will mean zero added overhead, while
    older kernels will incur minimal overhead with a single fast-failing
    LINK_CREATE call.
    Signed-off-by: default avatarAndrii Nakryiko <andrii@kernel.org>
    Signed-off-by: default avatarDaniel Borkmann <daniel@iogearbox.net>
    Reviewed-by: default avatarKui-Feng Lee <kuifeng@fb.com>
    Link: https://lore.kernel.org/bpf/20220421033945.3602803-3-andrii@kernel.org
    8462e0b4
libbpf.c 332 KB