• Andrii Nakryiko's avatar
    libbpf: add perf buffer API · fb84b822
    Andrii Nakryiko authored
    BPF_MAP_TYPE_PERF_EVENT_ARRAY map is often used to send data from BPF program
    to user space for additional processing. libbpf already has very low-level API
    to read single CPU perf buffer, bpf_perf_event_read_simple(), but it's hard to
    use and requires a lot of code to set everything up. This patch adds
    perf_buffer abstraction on top of it, abstracting setting up and polling
    per-CPU logic into simple and convenient API, similar to what BCC provides.
    
    perf_buffer__new() sets up per-CPU ring buffers and updates corresponding BPF
    map entries. It accepts two user-provided callbacks: one for handling raw
    samples and one for get notifications of lost samples due to buffer overflow.
    
    perf_buffer__new_raw() is similar, but provides more control over how
    perf events are set up (by accepting user-provided perf_event_attr), how
    they are handled (perf_event_header pointer is passed directly to
    user-provided callback), and on which CPUs ring buffers are created
    (it's possible to provide a list of CPUs and corresponding map keys to
    update). This API allows advanced users fuller control.
    
    perf_buffer__poll() is used to fetch ring buffer data across all CPUs,
    utilizing epoll instance.
    
    perf_buffer__free() does corresponding clean up and unsets FDs from BPF map.
    
    All APIs are not thread-safe. User should ensure proper locking/coordination if
    used in multi-threaded set up.
    Signed-off-by: default avatarAndrii Nakryiko <andriin@fb.com>
    Acked-by: default avatarYonghong Song <yhs@fb.com>
    Signed-off-by: default avatarDaniel Borkmann <daniel@iogearbox.net>
    fb84b822
libbpf.c 120 KB