• Jiri Olsa's avatar
    perf tools: Rework prologue generation code · b168852e
    Jiri Olsa authored
    Some functions we use for bpf prologue generation are going to be
    deprecated. This change reworks current code not to use them.
    
    We need to replace following functions/struct:
       bpf_program__set_prep
       bpf_program__nth_fd
       struct bpf_prog_prep_result
    
    Currently we use bpf_program__set_prep to hook perf callback before
    program is loaded and provide new instructions with the prologue.
    
    We replace this function/ality by taking instructions for specific
    program, attaching prologue to them and load such new ebpf programs
    with prologue using separate bpf_prog_load calls (outside libbpf
    load machinery).
    
    Before we can take and use program instructions, we need libbpf to
    actually load it. This way we get the final shape of its instructions
    with all relocations and verifier adjustments).
    
    There's one glitch though.. perf kprobe program already assumes
    generated prologue code with proper values in argument registers,
    so loading such program directly will fail in the verifier.
    
    That's where the fallback pre-load handler fits in and prepends
    the initialization code to the program. Once such program is loaded
    we take its instructions, cut off the initialization code and prepend
    the prologue.
    
    I know.. sorry ;-)
    
    To have access to the program when loading this patch adds support to
    register 'fallback' section handler to take care of perf kprobe programs.
    The fallback means that it handles any section definition besides the
    ones that libbpf handles.
    
    The handler serves two purposes:
      - allows perf programs to have special arguments in section name
      - allows perf to use pre-load callback where we can attach init
        code (zeroing all argument registers) to each perf program
    Suggested-by: default avatarAndrii Nakryiko <andrii@kernel.org>
    Signed-off-by: default avatarJiri Olsa <jolsa@kernel.org>
    Signed-off-by: default avatarAndrii Nakryiko <andrii@kernel.org>
    Tested-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
    Acked-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
    Link: https://lore.kernel.org/bpf/20220616202214.70359-2-jolsa@kernel.org
    b168852e
bpf-loader.c 47.9 KB