tracing/ftrace: Allow for instances to trigger their own stacktrace probes
authorSteven Rostedt (VMware) <rostedt@goodmis.org>
Thu, 20 Apr 2017 15:59:18 +0000 (11:59 -0400)
committerSteven Rostedt (VMware) <rostedt@goodmis.org>
Fri, 21 Apr 2017 02:06:49 +0000 (22:06 -0400)
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>
kernel/trace/trace_functions.c

index 8c30ca733a5c84d460b26e7f7f0780be123467db..a3bddbfd0874a26bcdbc84b3b4713cb206a0998b 100644 (file)
@@ -375,12 +375,23 @@ ftrace_traceoff(unsigned long ip, unsigned long parent_ip,
  */
 #define STACK_SKIP 4
 
+static __always_inline void trace_stack(struct trace_array *tr)
+{
+       unsigned long flags;
+       int pc;
+
+       local_save_flags(flags);
+       pc = preempt_count();
+
+       __trace_stack(tr, flags, STACK_SKIP, pc);
+}
+
 static void
 ftrace_stacktrace(unsigned long ip, unsigned long parent_ip,
                  struct trace_array *tr, struct ftrace_probe_ops *ops,
                  void *data)
 {
-       trace_dump_stack(STACK_SKIP);
+       trace_stack(tr);
 }
 
 static void
@@ -398,7 +409,7 @@ ftrace_stacktrace_count(unsigned long ip, unsigned long parent_ip,
 
        /* unlimited? */
        if (!mapper) {
-               trace_dump_stack(STACK_SKIP);
+               trace_stack(tr);
                return;
        }
 
@@ -417,7 +428,7 @@ ftrace_stacktrace_count(unsigned long ip, unsigned long parent_ip,
                new_count = old_count - 1;
                new_count = cmpxchg(count, old_count, new_count);
                if (new_count == old_count)
-                       trace_dump_stack(STACK_SKIP);
+                       trace_stack(tr);
 
                if (!tracing_is_on())
                        return;