aboutsummaryrefslogtreecommitdiffstats
path: root/kernel/trace/trace_functions_graph.c
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/trace/trace_functions_graph.c')
-rw-r--r--kernel/trace/trace_functions_graph.c22
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(&current->trace_overrun); 263 trace->overrun = atomic_read(&current->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);