Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit dcc19d28 authored by Steven Rostedt (VMware)'s avatar Steven Rostedt (VMware)
Browse files

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: default avatarSteven Rostedt (VMware) <rostedt@goodmis.org>
parent 2290f2c5
Loading
Loading
Loading
Loading
+14 −3
Original line number Diff line number Diff line
@@ -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;