• Steven Rostedt (VMware)'s avatar
    function_graph: Allow multiple users to attach to function graph · 7aa1eaef
    Steven Rostedt (VMware) authored
    Allow for multiple users to attach to function graph tracer at the same
    time. Only 16 simultaneous users can attach to the tracer. This is because
    there's an array that stores the pointers to the attached fgraph_ops. When
    a function being traced is entered, each of the ftrace_ops entryfunc is
    called and if it returns non zero, its index into the array will be added
    to the shadow stack.
    
    On exit of the function being traced, the shadow stack will contain the
    indexes of the ftrace_ops on the array that want their retfunc to be
    called.
    
    Because a function may sleep for a long time (if a task sleeps itself),
    the return of the function may be literally days later. If the ftrace_ops
    is removed, its place on the array is replaced with a ftrace_ops that
    contains the stub functions and that will be called when the function
    finally returns.
    
    If another ftrace_ops is added that happens to get the same index into the
    array, its return function may be called. But that's actually the way
    things current work with the old function graph tracer. If one tracer is
    removed and another is added, the new one will get the return calls of the
    function traced by the previous one, thus this is not a regression. This
    can be fixed by adding a counter to each time the array item is updated and
    save that on the shadow stack as well, such that it won't be called if the
    index saved does not match the index on the array.
    
    Note, being able to filter functions when both are called is not completely
    handled yet, but that shouldn't be too hard to manage.
    
    Co-developed with Masami Hiramatsu:
    Link: https://lore.kernel.org/linux-trace-kernel/171509096221.162236.8806372072523195752.stgit@devnote2
    Link: https://lore.kernel.org/linux-trace-kernel/20240603190821.555493396@goodmis.org
    
    Cc: Mark Rutland <mark.rutland@arm.com>
    Cc: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
    Cc: Andrew Morton <akpm@linux-foundation.org>
    Cc: Alexei Starovoitov <alexei.starovoitov@gmail.com>
    Cc: Florent Revest <revest@chromium.org>
    Cc: Martin KaFai Lau <martin.lau@linux.dev>
    Cc: bpf <bpf@vger.kernel.org>
    Cc: Sven Schnelle <svens@linux.ibm.com>
    Cc: Alexei Starovoitov <ast@kernel.org>
    Cc: Jiri Olsa <jolsa@kernel.org>
    Cc: Arnaldo Carvalho de Melo <acme@kernel.org>
    Cc: Daniel Borkmann <daniel@iogearbox.net>
    Cc: Alan Maguire <alan.maguire@oracle.com>
    Cc: Peter Zijlstra <peterz@infradead.org>
    Cc: Thomas Gleixner <tglx@linutronix.de>
    Cc: Guo Ren <guoren@kernel.org>
    Reviewed-by: default avatarMasami Hiramatsu (Google) <mhiramat@kernel.org>
    Signed-off-by: default avatarSteven Rostedt (VMware) <rostedt@goodmis.org>
    Signed-off-by: default avatarMasami Hiramatsu (Google) <mhiramat@kernel.org>
    Signed-off-by: default avatarSteven Rostedt (Google) <rostedt@goodmis.org>
    7aa1eaef
fgraph.c 26.5 KB