diff options
Diffstat (limited to 'kernel/trace/trace_functions_graph.c')
-rw-r--r-- | kernel/trace/trace_functions_graph.c | 22 |
1 files changed, 13 insertions, 9 deletions
diff --git a/kernel/trace/trace_functions_graph.c b/kernel/trace/trace_functions_graph.c index 02d4081a7f5a..4f0d72ae6362 100644 --- a/kernel/trace/trace_functions_graph.c +++ b/kernel/trace/trace_functions_graph.c | |||
@@ -261,7 +261,13 @@ ftrace_pop_return_trace(struct ftrace_graph_ret *trace, unsigned long *ret, | |||
261 | trace->func = current->ret_stack[index].func; | 261 | trace->func = current->ret_stack[index].func; |
262 | trace->calltime = current->ret_stack[index].calltime; | 262 | trace->calltime = current->ret_stack[index].calltime; |
263 | trace->overrun = atomic_read(¤t->trace_overrun); | 263 | trace->overrun = atomic_read(¤t->trace_overrun); |
264 | trace->depth = current->curr_ret_depth; | 264 | trace->depth = current->curr_ret_depth--; |
265 | /* | ||
266 | * We still want to trace interrupts coming in if | ||
267 | * max_depth is set to 1. Make sure the decrement is | ||
268 | * seen before ftrace_graph_return. | ||
269 | */ | ||
270 | barrier(); | ||
265 | } | 271 | } |
266 | 272 | ||
267 | /* | 273 | /* |
@@ -275,9 +281,14 @@ unsigned long ftrace_return_to_handler(unsigned long frame_pointer) | |||
275 | 281 | ||
276 | ftrace_pop_return_trace(&trace, &ret, frame_pointer); | 282 | ftrace_pop_return_trace(&trace, &ret, frame_pointer); |
277 | trace.rettime = trace_clock_local(); | 283 | trace.rettime = trace_clock_local(); |
284 | ftrace_graph_return(&trace); | ||
285 | /* | ||
286 | * The ftrace_graph_return() may still access the current | ||
287 | * ret_stack structure, we need to make sure the update of | ||
288 | * curr_ret_stack is after that. | ||
289 | */ | ||
278 | barrier(); | 290 | barrier(); |
279 | current->curr_ret_stack--; | 291 | current->curr_ret_stack--; |
280 | current->curr_ret_depth--; | ||
281 | /* | 292 | /* |
282 | * The curr_ret_stack can be less than -1 only if it was | 293 | * The curr_ret_stack can be less than -1 only if it was |
283 | * filtered out and it's about to return from the function. | 294 | * filtered out and it's about to return from the function. |
@@ -288,13 +299,6 @@ unsigned long ftrace_return_to_handler(unsigned long frame_pointer) | |||
288 | return ret; | 299 | return ret; |
289 | } | 300 | } |
290 | 301 | ||
291 | /* | ||
292 | * The trace should run after decrementing the ret counter | ||
293 | * in case an interrupt were to come in. We don't want to | ||
294 | * lose the interrupt if max_depth is set. | ||
295 | */ | ||
296 | ftrace_graph_return(&trace); | ||
297 | |||
298 | if (unlikely(!ret)) { | 302 | if (unlikely(!ret)) { |
299 | ftrace_graph_stop(); | 303 | ftrace_graph_stop(); |
300 | WARN_ON(1); | 304 | WARN_ON(1); |