diff options
author | Steven Rostedt <srostedt@redhat.com> | 2008-05-12 15:20:42 -0400 |
---|---|---|
committer | Thomas Gleixner <tglx@linutronix.de> | 2008-05-23 14:32:36 -0400 |
commit | 352ad25aa4a189c667cb2af333948d34692a2d27 (patch) | |
tree | 83a11c626b3818711d3b88061964c9ea603f7b68 /include/linux/ftrace.h | |
parent | 35e8e302e5d6e32675df2fc1dd3a53dfa6630dc1 (diff) |
ftrace: tracer for scheduler wakeup latency
This patch adds the tracer that tracks the wakeup latency of the
highest priority waking task.
"wakeup" is added to /debugfs/tracing/available_tracers
Also added to /debugfs/tracing
tracing_max_latency
holds the current max latency for the wakeup
wakeup_thresh
if set to other than zero, a log will be recorded
for every wakeup that takes longer than the number
entered in here (usecs for all counters)
(deletes previous trace)
Examples:
(with ftrace_enabled = 0)
============
preemption latency trace v1.1.5 on 2.6.24-rc8
Signed-off-by: Ingo Molnar <mingo@elte.hu>
--------------------------------------------------------------------
latency: 26 us, #2/2, CPU#1 | (M:rt VP:0, KP:0, SP:0 HP:0 #P:2)
-----------------
| task: migration/0-3 (uid:0 nice:-5 policy:1 rt_prio:99)
-----------------
_------=> CPU#
/ _-----=> irqs-off
| / _----=> need-resched
|| / _---=> hardirq/softirq
||| / _--=> preempt-depth
|||| /
||||| delay
cmd pid ||||| time | caller
\ / ||||| \ | /
quilt-8551 0d..3 0us+: wake_up_process+0x15/0x17 <ffffffff80233e80> (sched_exec+0xc9/0x100 <ffffffff80235343>)
quilt-8551 0d..4 26us : sched_switch_callback+0x73/0x81 <ffffffff80338d2f> (schedule+0x483/0x6d5 <ffffffff8048b3ee>)
vim:ft=help
============
(with ftrace_enabled = 1)
============
preemption latency trace v1.1.5 on 2.6.24-rc8
--------------------------------------------------------------------
latency: 36 us, #45/45, CPU#0 | (M:rt VP:0, KP:0, SP:0 HP:0 #P:2)
-----------------
| task: migration/1-5 (uid:0 nice:-5 policy:1 rt_prio:99)
-----------------
_------=> CPU#
/ _-----=> irqs-off
| / _----=> need-resched
|| / _---=> hardirq/softirq
||| / _--=> preempt-depth
|||| /
||||| delay
cmd pid ||||| time | caller
\ / ||||| \ | /
bash-10653 1d..3 0us : wake_up_process+0x15/0x17 <ffffffff80233e80> (sched_exec+0xc9/0x100 <ffffffff80235343>)
bash-10653 1d..3 1us : try_to_wake_up+0x271/0x2e7 <ffffffff80233dcf> (sub_preempt_count+0xc/0x7a <ffffffff8023309e>)
bash-10653 1d..2 2us : try_to_wake_up+0x296/0x2e7 <ffffffff80233df4> (update_rq_clock+0x9/0x20 <ffffffff802303f3>)
bash-10653 1d..2 2us : update_rq_clock+0x1e/0x20 <ffffffff80230408> (__update_rq_clock+0xc/0x90 <ffffffff80230366>)
bash-10653 1d..2 3us : __update_rq_clock+0x1b/0x90 <ffffffff80230375> (sched_clock+0x9/0x29 <ffffffff80214529>)
bash-10653 1d..2 4us : try_to_wake_up+0x2a6/0x2e7 <ffffffff80233e04> (activate_task+0xc/0x3f <ffffffff8022ffca>)
bash-10653 1d..2 4us : activate_task+0x2d/0x3f <ffffffff8022ffeb> (enqueue_task+0xe/0x66 <ffffffff8022ff66>)
bash-10653 1d..2 5us : enqueue_task+0x5b/0x66 <ffffffff8022ffb3> (enqueue_task_rt+0x9/0x3c <ffffffff80233351>)
bash-10653 1d..2 6us : try_to_wake_up+0x2ba/0x2e7 <ffffffff80233e18> (check_preempt_wakeup+0x12/0x99 <ffffffff80234f84>)
[...]
bash-10653 1d..5 33us : tracing_record_cmdline+0xcf/0xd4 <ffffffff80338aad> (_spin_unlock+0x9/0x33 <ffffffff8048d3ec>)
bash-10653 1d..5 34us : _spin_unlock+0x19/0x33 <ffffffff8048d3fc> (sub_preempt_count+0xc/0x7a <ffffffff8023309e>)
bash-10653 1d..4 35us : wakeup_sched_switch+0x65/0x2ff <ffffffff80339f66> (_spin_lock_irqsave+0xc/0xa9 <ffffffff8048d08b>)
bash-10653 1d..4 35us : _spin_lock_irqsave+0x19/0xa9 <ffffffff8048d098> (add_preempt_count+0xe/0x77 <ffffffff8023311a>)
bash-10653 1d..4 36us : sched_switch_callback+0x73/0x81 <ffffffff80338d2f> (schedule+0x483/0x6d5 <ffffffff8048b3ee>)
vim:ft=help
============
The [...] was added here to not waste your email box space.
Signed-off-by: Steven Rostedt <srostedt@redhat.com>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Diffstat (limited to 'include/linux/ftrace.h')
-rw-r--r-- | include/linux/ftrace.h | 23 |
1 files changed, 19 insertions, 4 deletions
diff --git a/include/linux/ftrace.h b/include/linux/ftrace.h index b96ef14c249a..db8a5e7abe41 100644 --- a/include/linux/ftrace.h +++ b/include/linux/ftrace.h | |||
@@ -5,10 +5,6 @@ | |||
5 | 5 | ||
6 | #include <linux/linkage.h> | 6 | #include <linux/linkage.h> |
7 | 7 | ||
8 | #define CALLER_ADDR0 ((unsigned long)__builtin_return_address(0)) | ||
9 | #define CALLER_ADDR1 ((unsigned long)__builtin_return_address(1)) | ||
10 | #define CALLER_ADDR2 ((unsigned long)__builtin_return_address(2)) | ||
11 | |||
12 | typedef void (*ftrace_func_t)(unsigned long ip, unsigned long parent_ip); | 8 | typedef void (*ftrace_func_t)(unsigned long ip, unsigned long parent_ip); |
13 | 9 | ||
14 | struct ftrace_ops { | 10 | struct ftrace_ops { |
@@ -35,4 +31,23 @@ extern void mcount(void); | |||
35 | # define unregister_ftrace_function(ops) do { } while (0) | 31 | # define unregister_ftrace_function(ops) do { } while (0) |
36 | # define clear_ftrace_function(ops) do { } while (0) | 32 | # define clear_ftrace_function(ops) do { } while (0) |
37 | #endif /* CONFIG_FTRACE */ | 33 | #endif /* CONFIG_FTRACE */ |
34 | |||
35 | |||
36 | #ifdef CONFIG_FRAME_POINTER | ||
37 | /* TODO: need to fix this for ARM */ | ||
38 | # define CALLER_ADDR0 ((unsigned long)__builtin_return_address(0)) | ||
39 | # define CALLER_ADDR1 ((unsigned long)__builtin_return_address(1)) | ||
40 | # define CALLER_ADDR2 ((unsigned long)__builtin_return_address(2)) | ||
41 | # define CALLER_ADDR3 ((unsigned long)__builtin_return_address(3)) | ||
42 | # define CALLER_ADDR4 ((unsigned long)__builtin_return_address(4)) | ||
43 | # define CALLER_ADDR5 ((unsigned long)__builtin_return_address(5)) | ||
44 | #else | ||
45 | # define CALLER_ADDR0 ((unsigned long)__builtin_return_address(0)) | ||
46 | # define CALLER_ADDR1 0UL | ||
47 | # define CALLER_ADDR2 0UL | ||
48 | # define CALLER_ADDR3 0UL | ||
49 | # define CALLER_ADDR4 0UL | ||
50 | # define CALLER_ADDR5 0UL | ||
51 | #endif | ||
52 | |||
38 | #endif /* _LINUX_FTRACE_H */ | 53 | #endif /* _LINUX_FTRACE_H */ |