• Andrii Nakryiko's avatar
    selftest/bpf: Add BPF triggering benchmark · c5d420c3
    Andrii Nakryiko authored
    It is sometimes desirable to be able to trigger BPF program from user-space
    with minimal overhead. sys_enter would seem to be a good candidate, yet in
    a lot of cases there will be a lot of noise from syscalls triggered by other
    processes on the system. So while searching for low-overhead alternative, I've
    stumbled upon getpgid() syscall, which seems to be specific enough to not
    suffer from accidental syscall by other apps.
    
    This set of benchmarks compares tp, raw_tp w/ filtering by syscall ID, kprobe,
    fentry and fmod_ret with returning error (so that syscall would not be
    executed), to determine the lowest-overhead way. Here are results on my
    machine (using benchs/run_bench_trigger.sh script):
    
      base      :    9.200 ± 0.319M/s
      tp        :    6.690 ± 0.125M/s
      rawtp     :    8.571 ± 0.214M/s
      kprobe    :    6.431 ± 0.048M/s
      fentry    :    8.955 ± 0.241M/s
      fmodret   :    8.903 ± 0.135M/s
    
    So it seems like fmodret doesn't give much benefit for such lightweight
    syscall. Raw tracepoint is pretty decent despite additional filtering logic,
    but it will be called for any other syscall in the system, which rules it out.
    Fentry, though, seems to be adding the least amoung of overhead and achieves
    97.3% of performance of baseline no-BPF-attached syscall.
    
    Using getpgid() seems to be preferable to set_task_comm() approach from
    test_overhead, as it's about 2.35x faster in a baseline performance.
    Signed-off-by: default avatarAndrii Nakryiko <andriin@fb.com>
    Signed-off-by: default avatarAlexei Starovoitov <ast@kernel.org>
    Acked-by: default avatarJohn Fastabend <john.fastabend@gmail.com>
    Acked-by: default avatarYonghong Song <yhs@fb.com>
    Link: https://lore.kernel.org/bpf/20200512192445.2351848-5-andriin@fb.com
    c5d420c3
trigger_bench.c 869 Bytes