[PATCH v2 00/27] function_graph: Allow multiple users for function graph tracing

From: Steven Rostedt
Date: Sat Jun 01 2024 - 23:37:50 EST



This is a continuation of the function graph multi user code.
I wrote a proof of concept back in 2019 of this code[1] and
Masami started cleaning it up. I started from Masami's work v10
that can be found here:

https://lore.kernel.org/linux-trace-kernel/171509088006.162236.7227326999861366050.stgit@devnote2/

This is *only* the code that allows multiple users of function
graph tracing. This is not the fprobe work that Masami is working
to add on top of it. As Masami took my proof of concept, there
was still several things I disliked about that code. Instead of
having Masami clean it up even more, I decided to take over on just
my code and change it up a bit.

Changes since v1: https://lore.kernel.org/linux-trace-kernel/20240525023652.903909489@xxxxxxxxxxx/

- Added ftrace helpers to allow an ftrace_ops to be a subop of a
managing ftrace_op. That is, the managing ftrace_op will enable
functions based off of the filters of the subops beneath it.
This could be extended for kprobes and fprobes, as the managing
ops does the multiplexing for the subops. This allows for only
adding a single callback to ftrace but have multiple ops that
represent many users.

- At the end, I added static branch which also speeds up the
code quite a bit.

Masami Hiramatsu (Google) (3):
function_graph: Handle tail calls for stack unwinding
function_graph: Use a simple LRU for fgraph_array index number
ftrace: Add multiple fgraph storage selftest

Steven Rostedt (Google) (8):
ftrace: Allow subops filtering to be modified
function_graph: Add pid tracing back to function graph tracer
function_graph: Use for_each_set_bit() in __ftrace_return_to_handler()
function_graph: Use bitmask to loop on fgraph entry
function_graph: Use static_call and branch to optimize entry function
function_graph: Use static_call and branch to optimize return function
selftests/ftrace: Add function_graph tracer to func-filter-pid test
selftests/ftrace: Add fgraph-multi.tc test

Steven Rostedt (VMware) (16):
function_graph: Convert ret_stack to a series of longs
fgraph: Use BUILD_BUG_ON() to make sure we have structures divisible by long
function_graph: Add an array structure that will allow multiple callbacks
function_graph: Allow multiple users to attach to function graph
function_graph: Remove logic around ftrace_graph_entry and return
ftrace/function_graph: Pass fgraph_ops to function graph callbacks
ftrace: Allow function_graph tracer to be enabled in instances
ftrace: Allow ftrace startup flags to exist without dynamic ftrace
ftrace: Add subops logic to allow one ops to manage many
function_graph: Have the instances use their own ftrace_ops for filtering
function_graph: Add "task variables" per task for fgraph_ops
function_graph: Move set_graph_function tests to shadow stack global var
function_graph: Move graph depth stored data to shadow stack global var
function_graph: Move graph notrace bit to shadow stack global var
function_graph: Implement fgraph_reserve_data() and fgraph_retrieve_data()
function_graph: Add selftest for passing local variables

----
include/linux/ftrace.h | 43 +-
include/linux/sched.h | 2 +-
include/linux/trace_recursion.h | 39 -
kernel/trace/fgraph.c | 1044 ++++++++++++++++----
kernel/trace/ftrace.c | 482 ++++++++-
kernel/trace/ftrace_internal.h | 5 +-
kernel/trace/trace.h | 94 +-
kernel/trace/trace_functions.c | 8 +
kernel/trace/trace_functions_graph.c | 96 +-
kernel/trace/trace_irqsoff.c | 10 +-
kernel/trace/trace_sched_wakeup.c | 10 +-
kernel/trace/trace_selftest.c | 259 ++++-
.../selftests/ftrace/test.d/ftrace/fgraph-multi.tc | 103 ++
.../ftrace/test.d/ftrace/func-filter-pid.tc | 27 +-
14 files changed, 1916 insertions(+), 306 deletions(-)
create mode 100644 tools/testing/selftests/ftrace/test.d/ftrace/fgraph-multi.tc