kernel_optimize_test/kernel/trace
Steven Rostedt 03889384ce tracing: Add trace_dump_stack()
I've been asked a few times about how to find out what is calling
some location in the kernel. One way is to use dynamic function tracing
and implement the func_stack_trace. But this only finds out who is
calling a particular function. It does not tell you who is calling
that function and entering a specific if conditional.

I have myself implemented a quick version of trace_dump_stack() for
this purpose a few times, and just needed it now. This is when I realized
that this would be a good tool to have in the kernel like trace_printk().

Using trace_dump_stack() is similar to dump_stack() except that it
writes to the trace buffer instead and can be used in critical locations.

For example:

@@ -5485,8 +5485,12 @@ need_resched_nonpreemptible:
 	if (prev->state && !(preempt_count() & PREEMPT_ACTIVE)) {
 		if (unlikely(signal_pending_state(prev->state, prev)))
 			prev->state = TASK_RUNNING;
-		else
+		else {
 			deactivate_task(rq, prev, 1);
+			trace_printk("Deactivating task %s:%d\n",
+				     prev->comm, prev->pid);
+			trace_dump_stack();
+		}
 		switch_count = &prev->nvcsw;
 	}

Produces:

           <...>-3249  [001]   296.105269: schedule: Deactivating task ntpd:3249
           <...>-3249  [001]   296.105270: <stack trace>
 => schedule
 => schedule_hrtimeout_range
 => poll_schedule_timeout
 => do_select
 => core_sys_select
 => sys_select
 => system_call_fastpath

Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
2009-12-11 10:38:47 -05:00
..
blktrace.c Add a tracepoint for block request remapping 2009-10-01 21:19:34 +02:00
ftrace.c Merge branch 'tracing-core-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip 2009-12-05 09:53:36 -08:00
Kconfig Merge branch 'tracing/hw-breakpoints' into perf/core 2009-11-21 14:07:23 +01:00
kmemtrace.c kmemtrace: Fix up tracer registration 2009-10-01 11:53:44 +02:00
Makefile Merge branch 'tracing/hw-breakpoints' into perf/core 2009-11-21 14:07:23 +01:00
power-traces.c tracing, perf: Convert the power tracer into an event tracer 2009-09-19 11:42:12 +02:00
ring_buffer_benchmark.c ring-buffer-benchmark: Add parameters to set produce/consumer priorities 2009-11-25 14:14:15 -05:00
ring_buffer.c ring-buffer: Move resize integrity check under reader lock 2009-12-10 23:20:52 -05:00
trace_boot.c
trace_branch.c tracing: user local buffer variable for trace branch tracer 2009-10-07 21:53:41 -04:00
trace_clock.c tracing: do not disable interrupts for trace_clock_local 2009-11-11 23:38:33 -05:00
trace_entries.h hw-breakpoints: Rewrite the hw-breakpoints layer on top of perf events 2009-11-08 15:34:42 +01:00
trace_event_profile.c tracing: Use the perf recursion protection from trace event 2009-11-22 09:03:42 +01:00
trace_events_filter.c tracing/filters: Fix to make system filter work 2009-10-29 08:53:20 +01:00
trace_events.c Merge branch 'perf/core' into perf/probes 2009-10-23 08:23:20 +02:00
trace_export.c Merge branch 'perf-core-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip 2009-12-05 15:30:21 -08:00
trace_functions_graph.c tracing: Fix function graph trace_pipe to properly display failed entries 2009-12-09 14:09:06 -05:00
trace_functions.c
trace_hw_branches.c tracing: fix warning on kernel/trace/trace_branch.c andtrace_hw_branches.c 2009-10-07 21:52:03 -04:00
trace_irqsoff.c
trace_kprobe.c trace_kprobes: Fix a memory leak bug and check kstrdup() return value 2009-12-01 08:19:59 +01:00
trace_ksym.c tracing: Fix wrong usage of strstrip in trace_ksyms 2009-12-11 00:01:36 +01:00
trace_mmiotrace.c
trace_nop.c
trace_output.c tracing: Add full state to trace_seq 2009-12-09 14:05:49 -05:00
trace_output.h
trace_printk.c tracing: Remove markers 2009-09-18 21:22:08 +02:00
trace_sched_switch.c
trace_sched_wakeup.c
trace_selftest_dynamic.c
trace_selftest.c ksym_tracer: Remove KSYM_SELFTEST_ENTRY 2009-11-08 16:21:01 +01:00
trace_stack.c sysctl: remove "struct file *" argument of ->proc_handler 2009-09-24 07:21:04 -07:00
trace_stat.c
trace_stat.h
trace_syscalls.c trace_syscalls: Remove unused syscall_name_to_nr() 2009-12-01 17:33:31 +01:00
trace_sysprof.c
trace_workqueue.c
trace.c tracing: Add trace_dump_stack() 2009-12-11 10:38:47 -05:00
trace.h tracing: Add pipe_close interface 2009-12-07 12:01:35 -05:00