diff options
author | Steven Rostedt (VMware) <rostedt@goodmis.org> | 2018-11-18 17:19:26 -0500 |
---|---|---|
committer | Steven Rostedt (VMware) <rostedt@goodmis.org> | 2018-11-27 20:29:52 -0500 |
commit | f1f5b14afd7cce39e6a9b25c685e1ea34c231096 (patch) | |
tree | 30542e3187f519e0f56f258764123e577f654dfa | |
parent | 07f7175b43827640d1e69c9eded89aa089a234b4 (diff) |
ARM: function_graph: Simplify with function_graph_enter()
The function_graph_enter() function does the work of calling the function
graph hook function and the management of the shadow stack, simplifying the
work done in the architecture dependent prepare_ftrace_return().
Have ARM use the new code, and remove the shadow stack management as well as
having to set up the trace structure.
This is needed to prepare for a fix of a design bug on how the curr_ret_stack
is used.
Cc: Russell King <linux@armlinux.org.uk>
Cc: linux-arm-kernel@lists.infradead.org
Cc: stable@kernel.org
Fixes: 03274a3ffb449 ("tracing/fgraph: Adjust fgraph depth before calling trace return callback")
Reviewed-by: Masami Hiramatsu <mhiramat@kernel.org>
Signed-off-by: Steven Rostedt (VMware) <rostedt@goodmis.org>
-rw-r--r-- | arch/arm/kernel/ftrace.c | 17 |
1 files changed, 1 insertions, 16 deletions
diff --git a/arch/arm/kernel/ftrace.c b/arch/arm/kernel/ftrace.c index 0142fcfcc3d3..bda949fd84e8 100644 --- a/arch/arm/kernel/ftrace.c +++ b/arch/arm/kernel/ftrace.c | |||
@@ -183,9 +183,7 @@ void prepare_ftrace_return(unsigned long *parent, unsigned long self_addr, | |||
183 | unsigned long frame_pointer) | 183 | unsigned long frame_pointer) |
184 | { | 184 | { |
185 | unsigned long return_hooker = (unsigned long) &return_to_handler; | 185 | unsigned long return_hooker = (unsigned long) &return_to_handler; |
186 | struct ftrace_graph_ent trace; | ||
187 | unsigned long old; | 186 | unsigned long old; |
188 | int err; | ||
189 | 187 | ||
190 | if (unlikely(atomic_read(¤t->tracing_graph_pause))) | 188 | if (unlikely(atomic_read(¤t->tracing_graph_pause))) |
191 | return; | 189 | return; |
@@ -193,21 +191,8 @@ void prepare_ftrace_return(unsigned long *parent, unsigned long self_addr, | |||
193 | old = *parent; | 191 | old = *parent; |
194 | *parent = return_hooker; | 192 | *parent = return_hooker; |
195 | 193 | ||
196 | trace.func = self_addr; | 194 | if (function_graph_enter(old, self_addr, frame_pointer, NULL)) |
197 | trace.depth = current->curr_ret_stack + 1; | ||
198 | |||
199 | /* Only trace if the calling function expects to */ | ||
200 | if (!ftrace_graph_entry(&trace)) { | ||
201 | *parent = old; | 195 | *parent = old; |
202 | return; | ||
203 | } | ||
204 | |||
205 | err = ftrace_push_return_trace(old, self_addr, &trace.depth, | ||
206 | frame_pointer, NULL); | ||
207 | if (err == -EBUSY) { | ||
208 | *parent = old; | ||
209 | return; | ||
210 | } | ||
211 | } | 196 | } |
212 | 197 | ||
213 | #ifdef CONFIG_DYNAMIC_FTRACE | 198 | #ifdef CONFIG_DYNAMIC_FTRACE |