• Ilya Leoshkevich's avatar
    s390/ftrace: implement hotpatching · de5012b4
    Ilya Leoshkevich authored
    s390 allows hotpatching the mask of a conditional jump instruction.
    Make use of this feature in order to avoid the expensive stop_machine()
    call.
    
    The new trampolines are split in 3 stages:
    
    - A first stage is a 6-byte relative conditional long branch located at
      each function's entry point. Its offset always points to the second
      stage for the corresponding function, and its mask is either all 0s
      (ftrace off) or all 1s (ftrace on). The code for flipping the mask is
      borrowed from ftrace_{enable,disable}_ftrace_graph_caller. After
      flipping, ftrace_arch_code_modify_post_process() syncs with all the
      other CPUs by sending SIGPs.
    
    - Second stages for vmlinux are stored in a separate part of the .text
      section reserved by the linker script, and in dynamically allocated
      memory for modules. This prevents the icache pollution. The total
      size of second stages is about 1.5% of that of the kernel image.
    
      Putting second stages in the .bss section is possible and decreases
      the size of the non-compressed vmlinux, but splits the kernel 1:1
      mapping, which is a bad tradeoff.
    
      Each second stage contains a call to the third stage, a pointer to
      the part of the intercepted function right after the first stage, and
      a pointer to an interceptor function (e.g. ftrace_caller).
    
      Second stages are 8-byte aligned for the future direct calls
      implementation.
    
    - There are only two copies of the third stage: in the .text section
      for vmlinux and in dynamically allocated memory for modules. It can be
      an expoline, which is relatively large, so inlining it into each
      second stage is prohibitively expensive.
    
    As a result of this organization, phoronix-test-suite with ftrace off
    does not show any performance degradation.
    Suggested-by: default avatarSven Schnelle <svens@linux.ibm.com>
    Suggested-by: default avatarVasily Gorbik <gor@linux.ibm.com>
    Co-developed-by: default avatarHeiko Carstens <hca@linux.ibm.com>
    Signed-off-by: default avatarIlya Leoshkevich <iii@linux.ibm.com>
    Link: https://lore.kernel.org/r/20210728212546.128248-3-iii@linux.ibm.comSigned-off-by: default avatarHeiko Carstens <hca@linux.ibm.com>
    de5012b4
module.h 1.18 KB