• Steven Rostedt (Red Hat)'s avatar
    ftrace: Fix function_profiler and function tracer together · 5f151b24
    Steven Rostedt (Red Hat) authored
    The latest rewrite of ftrace removed the separate ftrace_ops of
    the function tracer and the function graph tracer and had them
    share the same ftrace_ops. This simplified the accounting by removing
    the multiple layers of functions called, where the global_ops func
    would call a special list that would iterate over the other ops that
    were registered within it (like function and function graph), which
    itself was registered to the ftrace ops list of all functions
    currently active. If that sounds confusing, the code that implemented
    it was also confusing and its removal is a good thing.
    
    The problem with this change was that it assumed that the function
    and function graph tracer can never be used at the same time.
    This is mostly true, but there is an exception. That is when the
    function profiler uses the function graph tracer to profile.
    The function profiler can be activated the same time as the function
    tracer, and this breaks the assumption and the result is that ftrace
    will crash (it detects the error and shuts itself down, it does not
    cause a kernel oops).
    
    To solve this issue, a previous change allowed the hash tables
    for the functions traced by a ftrace_ops to be a pointer and let
    multiple ftrace_ops share the same hash. This allows the function
    and function_graph tracer to have separate ftrace_ops, but still
    share the hash, which is what is done.
    
    Now the function and function graph tracers have separate ftrace_ops
    again, and the function tracer can be run while the function_profile
    is active.
    
    Cc: stable@vger.kernel.org # 3.16 (apply after 3.17-rc4 is out)
    Signed-off-by: default avatarSteven Rostedt <rostedt@goodmis.org>
    5f151b24
ftrace.c 125 KB