diff options
author | Liam R. Howlett <Liam.Howlett@Oracle.com> | 2017-05-17 11:47:00 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2017-05-17 12:07:47 -0700 |
commit | 48078d2dac0a26f84f5f3ec704f24f7c832cce14 (patch) | |
tree | 694488c2b06e1fe346206a93ac4d1d4fba71bedb /arch/sparc | |
parent | deba804c90642c8ed0f15ac1083663976d578f54 (diff) | |
download | linux-48078d2dac0a26f84f5f3ec704f24f7c832cce14.tar.gz linux-48078d2dac0a26f84f5f3ec704f24f7c832cce14.tar.bz2 linux-48078d2dac0a26f84f5f3ec704f24f7c832cce14.zip |
sparc/ftrace: Fix ftrace graph time measurement
The ftrace function_graph time measurements of a given function is not
accurate according to those recorded by ftrace using the function
filters. This change pulls the x86_64 fix from 'commit 722b3c746953
("ftrace/graph: Trace function entry before updating index")' into the
sparc specific prepare_ftrace_return which stops ftrace from
counting interrupted tasks in the time measurement.
Example measurements for select_task_rq_fair running "hackbench 100
process 1000":
| tracing/trace_stat/function0 | function_graph
Before patch | 2.802 us | 4.255 us
After patch | 2.749 us | 3.094 us
Signed-off-by: Liam R. Howlett <Liam.Howlett@Oracle.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'arch/sparc')
-rw-r--r-- | arch/sparc/kernel/ftrace.c | 13 |
1 files changed, 6 insertions, 7 deletions
diff --git a/arch/sparc/kernel/ftrace.c b/arch/sparc/kernel/ftrace.c index 6bcff698069b..cec54dc4ab81 100644 --- a/arch/sparc/kernel/ftrace.c +++ b/arch/sparc/kernel/ftrace.c @@ -130,17 +130,16 @@ unsigned long prepare_ftrace_return(unsigned long parent, if (unlikely(atomic_read(¤t->tracing_graph_pause))) return parent + 8UL; - if (ftrace_push_return_trace(parent, self_addr, &trace.depth, - frame_pointer, NULL) == -EBUSY) - return parent + 8UL; - trace.func = self_addr; + trace.depth = current->curr_ret_stack + 1; /* Only trace if the calling function expects to */ - if (!ftrace_graph_entry(&trace)) { - current->curr_ret_stack--; + if (!ftrace_graph_entry(&trace)) + return parent + 8UL; + + if (ftrace_push_return_trace(parent, self_addr, &trace.depth, + frame_pointer, NULL) == -EBUSY) return parent + 8UL; - } return return_hooker; } |