linux/kernel/trace
Steven Rostedt cc51a0fca6 tracing: Add stack trace to irqsoff tracer
The irqsoff and friends tracers help in finding causes of latency in the
kernel. The also work with the function tracer to show what was happening
when interrupts or preemption are disabled. But the function tracer has
a bit of an overhead and can cause exagerated readings.

Currently, when tracing with /proc/sys/kernel/ftrace_enabled = 0, where the
function tracer is disabled, the information that is provided can end up
being useless. For example, a 2 and a half millisecond latency only showed:

 # tracer: preemptirqsoff
 #
 # preemptirqsoff latency trace v1.1.5 on 2.6.32
 # --------------------------------------------------------------------
 # latency: 2463 us, #4/4, CPU#2 | (M:preempt VP:0, KP:0, SP:0 HP:0 #P:4)
 #    -----------------
 #    | task: -4242 (uid:0 nice:0 policy:0 rt_prio:0)
 #    -----------------
 #  => started at: _spin_lock_irqsave
 #  => ended at:   remove_wait_queue
 #
 #
 #                  _------=> CPU#
 #                 / _-----=> irqs-off
 #                | / _----=> need-resched
 #                || / _---=> hardirq/softirq
 #                ||| / _--=> preempt-depth
 #                |||| /_--=> lock-depth
 #                |||||/     delay
 #  cmd     pid   |||||| time  |   caller
 #     \   /      ||||||   \   |   /
 hackbenc-4242    2d....    0us!: trace_hardirqs_off <-_spin_lock_irqsave
 hackbenc-4242    2...1. 2463us+: _spin_unlock_irqrestore <-remove_wait_queue
 hackbenc-4242    2...1. 2466us : trace_preempt_on <-remove_wait_queue

The above lets us know that hackbench with pid 2463 grabbed a spin lock
somewhere and enabled preemption at remove_wait_queue. This helps a little
but where this actually happened is not informative.

This patch adds the stack dump to the end of the irqsoff tracer. This provides
the following output:

 hackbenc-4242    2d....    0us!: trace_hardirqs_off <-_spin_lock_irqsave
 hackbenc-4242    2...1. 2463us+: _spin_unlock_irqrestore <-remove_wait_queue
 hackbenc-4242    2...1. 2466us : trace_preempt_on <-remove_wait_queue
 hackbenc-4242    2...1. 2467us : <stack trace>
  => sub_preempt_count
  => _spin_unlock_irqrestore
  => remove_wait_queue
  => free_poll_entry
  => poll_freewait
  => do_sys_poll
  => sys_poll
  => system_call_fastpath

Now we see that the culprit of this latency was the free_poll_entry code.

Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
2009-12-11 13:19:51 -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.c ring-buffer: Move resize integrity check under reader lock 2009-12-10 23:20:52 -05:00
ring_buffer_benchmark.c ring-buffer-benchmark: Add parameters to set produce/consumer priorities 2009-11-25 14:14:15 -05:00
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
trace_boot.c tracing: add filter event logic to special, mmiotrace and boot tracers 2009-09-12 23:34:04 -04:00
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.c Merge branch 'perf/core' into perf/probes 2009-10-23 08:23:20 +02:00
trace_events_filter.c tracing/filters: Fix to make system filter work 2009-10-29 08:53:20 +01: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.c tracing: switch function prints from %pf to %ps 2009-09-17 15:53:40 -04: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_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 tracing: Add stack trace to irqsoff tracer 2009-12-11 13:19:51 -05:00
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 tracing: add filter event logic to special, mmiotrace and boot tracers 2009-09-12 23:34:04 -04:00
trace_nop.c
trace_output.c tracing: Add full state to trace_seq 2009-12-09 14:05:49 -05:00
trace_output.h tracing: consolidate code between trace_output.c and trace_function_graph.c 2009-09-11 14:24:13 -04:00
trace_printk.c tracing: Remove markers 2009-09-18 21:22:08 +02:00
trace_sched_switch.c tracing: pass around ring buffer instead of tracer 2009-09-04 18:59:39 -04:00
trace_sched_wakeup.c tracing: do not update tracing_max_latency when tracer is stopped 2009-09-12 21:45:17 -04:00
trace_selftest.c ksym_tracer: Remove KSYM_SELFTEST_ENTRY 2009-11-08 16:21:01 +01:00
trace_selftest_dynamic.c
trace_stack.c sysctl: remove "struct file *" argument of ->proc_handler 2009-09-24 07:21:04 -07:00
trace_stat.c trace_stat: Fix missing entry in stat file 2009-08-17 11:25:09 +02:00
trace_stat.h tracing/stat: Add stat_release() callback 2009-07-10 12:14:05 +02:00
trace_syscalls.c trace_syscalls: Remove unused syscall_name_to_nr() 2009-12-01 17:33:31 +01:00
trace_sysprof.c Merge branch 'timers-for-linus-migration' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip 2009-06-15 10:06:19 -07:00
trace_workqueue.c tracing/workqueues: Add refcnt to struct cpu_workqueue_stats 2009-07-10 12:14:07 +02:00