• Andrii Nakryiko's avatar
    bpf: Implement minimal BPF perf link · b89fbfbb
    Andrii Nakryiko authored
    Introduce a new type of BPF link - BPF perf link. This brings perf_event-based
    BPF program attachments (perf_event, tracepoints, kprobes, and uprobes) into
    the common BPF link infrastructure, allowing to list all active perf_event
    based attachments, auto-detaching BPF program from perf_event when link's FD
    is closed, get generic BPF link fdinfo/get_info functionality.
    
    BPF_LINK_CREATE command expects perf_event's FD as target_fd. No extra flags
    are currently supported.
    
    Force-detaching and atomic BPF program updates are not yet implemented, but
    with perf_event-based BPF links we now have common framework for this without
    the need to extend ioctl()-based perf_event interface.
    
    One interesting consideration is a new value for bpf_attach_type, which
    BPF_LINK_CREATE command expects. Generally, it's either 1-to-1 mapping from
    bpf_attach_type to bpf_prog_type, or many-to-1 mapping from a subset of
    bpf_attach_types to one bpf_prog_type (e.g., see BPF_PROG_TYPE_SK_SKB or
    BPF_PROG_TYPE_CGROUP_SOCK). In this case, though, we have three different
    program types (KPROBE, TRACEPOINT, PERF_EVENT) using the same perf_event-based
    mechanism, so it's many bpf_prog_types to one bpf_attach_type. I chose to
    define a single BPF_PERF_EVENT attach type for all of them and adjust
    link_create()'s logic for checking correspondence between attach type and
    program type.
    
    The alternative would be to define three new attach types (e.g., BPF_KPROBE,
    BPF_TRACEPOINT, and BPF_PERF_EVENT), but that seemed like unnecessary overkill
    and BPF_KPROBE will cause naming conflicts with BPF_KPROBE() macro, defined by
    libbpf. I chose to not do this to avoid unnecessary proliferation of
    bpf_attach_type enum values and not have to deal with naming conflicts.
    Signed-off-by: default avatarAndrii Nakryiko <andrii@kernel.org>
    Signed-off-by: default avatarDaniel Borkmann <daniel@iogearbox.net>
    Acked-by: default avatarYonghong Song <yhs@fb.com>
    Acked-by: default avatarPeter Zijlstra (Intel) <peterz@infradead.org>
    Link: https://lore.kernel.org/bpf/20210815070609.987780-5-andrii@kernel.org
    b89fbfbb
syscall.c 113 KB