• Andrii Nakryiko's avatar
    selftests/bpf: Extend uprobe/uretprobe triggering benchmarks · 8f79870e
    Andrii Nakryiko authored
    Settle on three "flavors" of uprobe/uretprobe, installed on different
    kinds of instruction: nop, push, and ret. All three are testing
    different internal code paths emulating or single-stepping instructions,
    so are interesting to compare and benchmark separately.
    
    To ensure `push rbp` instruction we ensure that uprobe_target_push() is
    not a leaf function by calling (global __weak) noop function and
    returning something afterwards (if we don't do that, compiler will just
    do a tail call optimization).
    
    Also, we need to make sure that compiler isn't skipping frame pointer
    generation, so let's add `-fno-omit-frame-pointers` to Makefile.
    
    Just to give an idea of where we currently stand in terms of relative
    performance of different uprobe/uretprobe cases vs a cheap syscall
    (getpgid()) baseline, here are results from my local machine:
    
    $ benchs/run_bench_uprobes.sh
    base           :    1.561 ± 0.020M/s
    uprobe-nop     :    0.947 ± 0.007M/s
    uprobe-push    :    0.951 ± 0.004M/s
    uprobe-ret     :    0.443 ± 0.007M/s
    uretprobe-nop  :    0.471 ± 0.013M/s
    uretprobe-push :    0.483 ± 0.004M/s
    uretprobe-ret  :    0.306 ± 0.007M/s
    Signed-off-by: default avatarAndrii Nakryiko <andrii@kernel.org>
    Signed-off-by: default avatarDaniel Borkmann <daniel@iogearbox.net>
    Link: https://lore.kernel.org/bpf/20240301214551.1686095-1-andrii@kernel.org
    8f79870e
run_bench_uprobes.sh 213 Bytes