• S
    ftrace/x86: Add dynamic allocated trampoline for ftrace_ops · f3bea491
    Steven Rostedt (Red Hat) 提交于
    The current method of handling multiple function callbacks is to register
    a list function callback that calls all the other callbacks based on
    their hash tables and compare it to the function that the callback was
    called on. But this is very inefficient.
    
    For example, if you are tracing all functions in the kernel and then
    add a kprobe to a function such that the kprobe uses ftrace, the
    mcount trampoline will switch from calling the function trace callback
    to calling the list callback that will iterate over all registered
    ftrace_ops (in this case, the function tracer and the kprobes callback).
    That means for every function being traced it checks the hash of the
    ftrace_ops for function tracing and kprobes, even though the kprobes
    is only set at a single function. The kprobes ftrace_ops is checked
    for every function being traced!
    
    Instead of calling the list function for functions that are only being
    traced by a single callback, we can call a dynamically allocated
    trampoline that calls the callback directly. The function graph tracer
    already uses a direct call trampoline when it is being traced by itself
    but it is not dynamically allocated. It's trampoline is static in the
    kernel core. The infrastructure that called the function graph trampoline
    can also be used to call a dynamically allocated one.
    
    For now, only ftrace_ops that are not dynamically allocated can have
    a trampoline. That is, users such as function tracer or stack tracer.
    kprobes and perf allocate their ftrace_ops, and until there's a safe
    way to free the trampoline, it can not be used. The dynamically allocated
    ftrace_ops may, although, use the trampoline if the kernel is not
    compiled with CONFIG_PREEMPT. But that will come later.
    Tested-by: NMasami Hiramatsu <masami.hiramatsu.pt@hitachi.com>
    Tested-by: NJiri Kosina <jkosina@suse.cz>
    Signed-off-by: NSteven Rostedt <rostedt@goodmis.org>
    f3bea491
ftrace.h 27.4 KB