Skip to content

function_graph: Rewrite to allow multiple users

Steven Rostedt lkml 3 versions – In review

Get series with b4
b4 am [email protected]

Versions newest first · linked by author and title

  1. v3 Latest16 patches 3 repliesIn review
  2. v2 RFC14 patches 16 repliesSuperseded
  3. v1 RFC14 patches 38 repliesSuperseded

Patches in v3 No applies recorded yet

#Subject and filesSizeRepliesApplied
1/16function_graph: Convert ret_stack to a series of longsinclude/linux/sched.h kernel/trace/fgraph.c+71 -553 replies
2/16fgraph: Use BUILD_BUG_ON() to make sure we have structures divisible by longkernel/trace/fgraph.c+6 -30 replies
3/16fgraph: Have the current->ret_stack go down not upkernel/trace/fgraph.c+20 -190 replies
4/16function_graph: Add an array structure that will allow multiple callbackskernel/trace/fgraph.c+82 -330 replies
5/16function_graph: Allow multiple users to attach to function graphinclude/linux/ftrace.h kernel/trace/fgraph.c+283 -530 replies
6/16function_graph: Remove logic around ftrace_graph_entry and returnkernel/trace/fgraph.c kernel/trace/ftrace.c kernel/trace/ftrace_internal.h+19 -560 replies
7/16ftrace/function_graph: Pass fgraph_ops to function graph callbacksinclude/linux/ftrace.h kernel/trace/fgraph.c kernel/trace/ftrace.c +5 more+39 -230 replies
8/16ftrace: Allow function_graph tracer to be enabled in instancesinclude/linux/ftrace.h kernel/trace/ftrace.c kernel/trace/trace.h +3 more+62 -260 replies
9/16ftrace: Allow ftrace startup flags exist without dynamic ftraceinclude/linux/ftrace.h+9 -90 replies
10/16function_graph: Have the instances use their own ftrace_ops for filteringinclude/linux/ftrace.h kernel/trace/fgraph.c kernel/trace/ftrace.c +3 more+59 -370 replies
11/16function_graph: Add "task variables" per task for fgraph_opsinclude/linux/ftrace.h kernel/trace/fgraph.c+73 -10 replies
12/16function_graph: Move set_graph_function tests to shadow stack global varkernel/trace/trace.h kernel/trace/trace_functions_graph.c kernel/trace/trace_irqsoff.c +1 more+29 -220 replies
13/16function_graph: Move graph depth stored data to shadow stack global varkernel/trace/trace.h+32 -310 replies
14/16function_graph: Move graph notrace bit to shadow stack global varkernel/trace/trace.h kernel/trace/trace_functions_graph.c+15 -110 replies
15/16function_graph: Implement fgraph_reserve_data() and fgraph_retrieve_data()include/linux/ftrace.h kernel/trace/fgraph.c+220 -360 replies
16/16function_graph: Add selftest for passing local variableskernel/trace/trace_selftest.c+310 -00 replies

Reviews trailers per patch

No Reviewed-by, Acked-by or Tested-by trailers for v3 yet.

Read the v3 thread

Cover letter [PATCH 00/16 v3] function_graph: Rewrite to allow multiple users

The background for this is explained in the V1 version found here:

http://lkml.kernel.org/r/[email protected]

The TL;DR; is this:

The function graph tracer required a rewrite, mainly because it can only allow one callback registered at a time. The main motivation for this change is to allow kretprobes to use the code of function graph tracer, which should allow all archs that have function graph tracing to also have kretprobes with no extra work.

Masami told me that one requirement was to allow the function entry callback to store data on the shadow stack that can be retrieved by the the function return callback. I added this, as well as a per-task variable (used by one of the function graph users).

The two functions to allow the storing of data on the stack and retrieval of it are:

void *fgraph_reserve_data(int size_in_bytes)

Allows the entry function to reserve up to 4 words of data on the shadow stack. On success, a pointer to the contents is returned. This may be only called once per entry function.

void *fgraph_retrieve_data(void)

Allows the return function to retrieve the reserved data that was allocated by the entry function.

Changes since v2:

http://lkml.kernel.org/r/[email protected]

As a request from Peter Zijlstra, I changed the direction of the stack from growing up, to growing down. It passes some smoke tests, but I will need to run a lot more tests on it. But I decide to post this series anyway.

Also changed, was using BULID_BUG_ON() instead of the align tricks, And also used round_up() to remove another align trick.

I found a bug it patch 4 that was fixed in patch 5, but I fixed it in patch 4 to keep it bisectable.

Added a few more comments, and also added more boot up self tests to test more of the passing of data around.

The git repo can be found here:

git://git.kernel.org/pub/scm/linux/kernel/git/rostedt/linux-trace.git
ftrace/fgraph-multi-stackdown

Head SHA1: 7e25deae405b75aaaa7d5d98fcafdd79c34f87cb

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
fgraph: Have the current->ret_stack go down not up
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 exist without dynamic ftrace
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               |  37 +-
 include/linux/sched.h                |   2 +-
 kernel/trace/fgraph.c                | 870 ++++++++++++++++++++++++++++-------
 kernel/trace/ftrace.c                |  13 +-
 kernel/trace/ftrace_internal.h       |   2 -
 kernel/trace/trace.h                 | 132 +++---
 kernel/trace/trace_functions.c       |   7 +
 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        | 317 ++++++++++++-
 11 files changed, 1205 insertions(+), 291 deletions(-)