• Steven Rostedt's avatar
    ftrace: dynamic enabling/disabling of function calls · 3d083395
    Steven Rostedt authored
    This patch adds a feature to dynamically replace the ftrace code
    with the jmps to allow a kernel with ftrace configured to run
    as fast as it can without it configured.
    The way this works, is on bootup (if ftrace is enabled), a ftrace
    function is registered to record the instruction pointer of all
    places that call the function.
    Later, if there's still any code to patch, a kthread is awoken
    (rate limited to at most once a second) that performs a stop_machine,
    and replaces all the code that was called with a jmp over the call
    to ftrace. It only replaces what was found the previous time. Typically
    the system reaches equilibrium quickly after bootup and there's no code
    patching needed at all.
      call ftrace  /* 5 bytes */
    is replaced with
      jmp 3f  /* jmp is 2 bytes and we jump 3 forward */
    When we want to enable ftrace for function tracing, the IP recording
    is removed, and stop_machine is called again to replace all the locations
    of that were recorded back to the call of ftrace.  When it is disabled,
    we replace the code back to the jmp.
    Allocation is done by the kthread. If the ftrace recording function is
    called, and we don't have any record slots available, then we simply
    skip that call. Once a second a new page (if needed) is allocated for
    recording new ftrace function calls.  A large batch is allocated at
    boot up to get most of the calls there.
    Because we do this via stop_machine, we don't have to worry about another
    CPU executing a ftrace call as we modify it. But we do need to worry
    about NMI's so all functions that might be called via nmi must be
    annotated with notrace_nmi. When this code is configured in, the NMI code
    will not call notrace.
    Signed-off-by: default avatarSteven Rostedt <srostedt@redhat.com>
    Signed-off-by: default avatarIngo Molnar <mingo@elte.hu>
    Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>