libbpf: Teach bpf_link_create() to fallback to bpf_raw_tracepoint_open()
authorAndrii Nakryiko <andrii@kernel.org>
Thu, 21 Apr 2022 03:39:44 +0000 (20:39 -0700)
committerDaniel Borkmann <daniel@iogearbox.net>
Fri, 22 Apr 2022 22:37:02 +0000 (00:37 +0200)
commit8462e0b46fe2d4c56d0a7de705228e3bf1da03d9
tree9f61258de7c4be5beef7fbbb0f799f792d4dc995
parentdf86ca0d2f0fa6be525a25b0b3d836d361f85754
libbpf: Teach bpf_link_create() to fallback to bpf_raw_tracepoint_open()

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: Andrii Nakryiko <andrii@kernel.org>
Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
Reviewed-by: Kui-Feng Lee <kuifeng@fb.com>
Link: https://lore.kernel.org/bpf/20220421033945.3602803-3-andrii@kernel.org
tools/lib/bpf/bpf.c
tools/lib/bpf/libbpf.c