• Ilya Leoshkevich's avatar
    s390/bpf: Implement arch_prepare_bpf_trampoline() · 528eb2cb
    Ilya Leoshkevich authored
    arch_prepare_bpf_trampoline() is used for direct attachment of eBPF
    programs to various places, bypassing kprobes. It's responsible for
    calling a number of eBPF programs before, instead and/or after
    whatever they are attached to.
    
    Add a s390x implementation, paying attention to the following:
    
    - Reuse the existing JIT infrastructure, where possible.
    - Like the existing JIT, prefer making multiple passes instead of
      backpatching. Currently 2 passes is enough. If literal pool is
      introduced, this needs to be raised to 3. However, at the moment
      adding literal pool only makes the code larger. If branch
      shortening is introduced, the number of passes needs to be
      increased even further.
    - Support both regular and ftrace calling conventions, depending on
      the trampoline flags.
    - Use expolines for indirect calls.
    - Handle the mismatch between the eBPF and the s390x ABIs.
    - Sign-extend fmod_ret return values.
    
    invoke_bpf_prog() produces about 120 bytes; it might be possible to
    slightly optimize this, but reaching 50 bytes, like on x86_64, looks
    unrealistic: just loading cookie, __bpf_prog_enter, bpf_func, insnsi
    and __bpf_prog_exit as literals already takes at least 5 * 12 = 60
    bytes, and we can't use relative addressing for most of them.
    Therefore, lower BPF_MAX_TRAMP_LINKS on s390x.
    Signed-off-by: default avatarIlya Leoshkevich <iii@linux.ibm.com>
    Link: https://lore.kernel.org/r/20230129190501.1624747-5-iii@linux.ibm.comSigned-off-by: default avatarAlexei Starovoitov <ast@kernel.org>
    528eb2cb
bpf_jit_comp.c 65 KB