aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSteven Rostedt (VMware) <rostedt@goodmis.org>2017-04-20 11:59:18 -0400
committerSteven Rostedt (VMware) <rostedt@goodmis.org>2017-04-20 22:06:49 -0400
commitdcc19d28091a86d5baf78e3fbb32e3fc3de524be (patch)
tree1b0675f001e161897b22acf17f1a10b53343a476
parent2290f2c589285d0031e3b7445afff8949f3fdbb6 (diff)
tracing/ftrace: Allow for instances to trigger their own stacktrace probes
Have the stacktrace function trigger probe trigger stack traces within the instance that they were added to in the set_ftrace_filter. ># cd /sys/kernel/debug/tracing ># mkdir instances/foo ># cd instances/foo ># echo schedule:stacktrace:1 > set_ftrace_filter ># cat trace # tracer: nop # # entries-in-buffer/entries-written: 1/1 #P:4 # # _-----=> irqs-off # / _----=> need-resched # | / _---=> hardirq/softirq # || / _--=> preempt-depth # ||| / delay # TASK-PID CPU# |||| TIMESTAMP FUNCTION # | | | |||| | | <idle>-0 [001] .N.2 202.585010: <stack trace> => => schedule => schedule_preempt_disabled => do_idle => cpu_startup_entry => start_secondary => verify_cpu Signed-off-by: Steven Rostedt (VMware) <rostedt@goodmis.org>
-rw-r--r--kernel/trace/trace_functions.c17
1 files changed, 14 insertions, 3 deletions
diff --git a/kernel/trace/trace_functions.c b/kernel/trace/trace_functions.c
index 8c30ca733a5c..a3bddbfd0874 100644
--- a/kernel/trace/trace_functions.c
+++ b/kernel/trace/trace_functions.c
@@ -375,12 +375,23 @@ ftrace_traceoff(unsigned long ip, unsigned long parent_ip,
375 */ 375 */
376#define STACK_SKIP 4 376#define STACK_SKIP 4
377 377
378static __always_inline void trace_stack(struct trace_array *tr)
379{
380 unsigned long flags;
381 int pc;
382
383 local_save_flags(flags);
384 pc = preempt_count();
385
386 __trace_stack(tr, flags, STACK_SKIP, pc);
387}
388
378static void 389static void
379ftrace_stacktrace(unsigned long ip, unsigned long parent_ip, 390ftrace_stacktrace(unsigned long ip, unsigned long parent_ip,
380 struct trace_array *tr, struct ftrace_probe_ops *ops, 391 struct trace_array *tr, struct ftrace_probe_ops *ops,
381 void *data) 392 void *data)
382{ 393{
383 trace_dump_stack(STACK_SKIP); 394 trace_stack(tr);
384} 395}
385 396
386static void 397static void
@@ -398,7 +409,7 @@ ftrace_stacktrace_count(unsigned long ip, unsigned long parent_ip,
398 409
399 /* unlimited? */ 410 /* unlimited? */
400 if (!mapper) { 411 if (!mapper) {
401 trace_dump_stack(STACK_SKIP); 412 trace_stack(tr);
402 return; 413 return;
403 } 414 }
404 415
@@ -417,7 +428,7 @@ ftrace_stacktrace_count(unsigned long ip, unsigned long parent_ip,
417 new_count = old_count - 1; 428 new_count = old_count - 1;
418 new_count = cmpxchg(count, old_count, new_count); 429 new_count = cmpxchg(count, old_count, new_count);
419 if (new_count == old_count) 430 if (new_count == old_count)
420 trace_dump_stack(STACK_SKIP); 431 trace_stack(tr);
421 432
422 if (!tracing_is_on()) 433 if (!tracing_is_on())
423 return; 434 return;