diff options
author | Zhaolei <zhaolei@cn.fujitsu.com> | 2009-05-25 06:11:59 -0400 |
---|---|---|
committer | Frederic Weisbecker <fweisbec@gmail.com> | 2009-05-25 21:03:21 -0400 |
commit | b11c53e12f94a46b50bccc7a1a953d7ca1d54a31 (patch) | |
tree | a0d658e31ffd7f05834c6026874cd4120a35dd29 /kernel/trace/trace_events.c | |
parent | 29fcefba8a2f0fea11e2b721fe174a1832801284 (diff) |
ftrace: Add task_comm support for trace_event
If we enable a trace event alone without any tracer running (such as
function tracer, sched switch tracer, etc...) it can't output enough
task command information.
We need to use the tracing_{start/stop}_cmdline_record() helpers
which are designed to keep track of cmdlines for any tasks that
were scheduled during the tracing.
Before this patch:
# echo 1 > debugfs/tracing/events/sched/sched_switch/enable
# cat debugfs/tracing/trace
# tracer: nop
#
# TASK-PID CPU# TIMESTAMP FUNCTION
# | | | | |
<...>-2289 [000] 526276.724790: sched_switch: task bash:2289 [120] ==> sshd:2287 [120]
<...>-2287 [000] 526276.725231: sched_switch: task sshd:2287 [120] ==> bash:2289 [120]
<...>-2289 [000] 526276.725452: sched_switch: task bash:2289 [120] ==> sshd:2287 [120]
<...>-2287 [000] 526276.727181: sched_switch: task sshd:2287 [120] ==> swapper:0 [140]
<idle>-0 [000] 526277.032734: sched_switch: task swapper:0 [140] ==> events/0:5 [115]
<...>-5 [000] 526277.032782: sched_switch: task events/0:5 [115] ==> swapper:0 [140]
...
After this patch:
# tracer: nop
#
# TASK-PID CPU# TIMESTAMP FUNCTION
# | | | | |
bash-2269 [000] 527347.989229: sched_switch: task bash:2269 [120] ==> sshd:2267 [120]
sshd-2267 [000] 527347.990960: sched_switch: task sshd:2267 [120] ==> bash:2269 [120]
bash-2269 [000] 527347.991143: sched_switch: task bash:2269 [120] ==> sshd:2267 [120]
sshd-2267 [000] 527347.992959: sched_switch: task sshd:2267 [120] ==> swapper:0 [140]
<idle>-0 [000] 527348.531989: sched_switch: task swapper:0 [140] ==> events/0:5 [115]
events/0-5 [000] 527348.532115: sched_switch: task events/0:5 [115] ==> swapper:0 [140]
...
Changelog:
v1->v2: Update Kconfig to select CONTEXT_SWITCH_TRACER in
ENABLE_EVENT_TRACING
v2->v3: v2 can solve problem that was caused by config EVENT_TRACING
alone, but when CONFIG_FTRACE is off and CONFIG_TRACING is
selected by other config, compile fail happened again.
This version solves it.
[ Impact: fix incomplete output of event tracing ]
Signed-off-by: Zhao Lei <zhaolei@cn.fujitsu.com>
Cc: Tom Zanussi <tzanussi@gmail.com>
Cc: Steven Rostedt <rostedt@goodmis.org>
LKML-Reference: <4A14FDFE.2080402@cn.fujitsu.com>
Signed-off-by: Frederic Weisbecker <fweisbec@gmail.com>
Diffstat (limited to 'kernel/trace/trace_events.c')
-rw-r--r-- | kernel/trace/trace_events.c | 6 |
1 files changed, 6 insertions, 0 deletions
diff --git a/kernel/trace/trace_events.c b/kernel/trace/trace_events.c index 9e91c4ad7c8b..9b246eb01d5f 100644 --- a/kernel/trace/trace_events.c +++ b/kernel/trace/trace_events.c | |||
@@ -85,6 +85,7 @@ static void ftrace_clear_events(void) | |||
85 | 85 | ||
86 | if (call->enabled) { | 86 | if (call->enabled) { |
87 | call->enabled = 0; | 87 | call->enabled = 0; |
88 | tracing_stop_cmdline_record(); | ||
88 | call->unregfunc(); | 89 | call->unregfunc(); |
89 | } | 90 | } |
90 | } | 91 | } |
@@ -99,12 +100,14 @@ static void ftrace_event_enable_disable(struct ftrace_event_call *call, | |||
99 | case 0: | 100 | case 0: |
100 | if (call->enabled) { | 101 | if (call->enabled) { |
101 | call->enabled = 0; | 102 | call->enabled = 0; |
103 | tracing_stop_cmdline_record(); | ||
102 | call->unregfunc(); | 104 | call->unregfunc(); |
103 | } | 105 | } |
104 | break; | 106 | break; |
105 | case 1: | 107 | case 1: |
106 | if (!call->enabled) { | 108 | if (!call->enabled) { |
107 | call->enabled = 1; | 109 | call->enabled = 1; |
110 | tracing_start_cmdline_record(); | ||
108 | call->regfunc(); | 111 | call->regfunc(); |
109 | } | 112 | } |
110 | break; | 113 | break; |
@@ -1058,6 +1061,7 @@ static void trace_module_remove_events(struct module *mod) | |||
1058 | found = true; | 1061 | found = true; |
1059 | if (call->enabled) { | 1062 | if (call->enabled) { |
1060 | call->enabled = 0; | 1063 | call->enabled = 0; |
1064 | tracing_stop_cmdline_record(); | ||
1061 | call->unregfunc(); | 1065 | call->unregfunc(); |
1062 | } | 1066 | } |
1063 | if (call->event) | 1067 | if (call->event) |
@@ -1262,11 +1266,13 @@ static __init void event_trace_self_tests(void) | |||
1262 | } | 1266 | } |
1263 | 1267 | ||
1264 | call->enabled = 1; | 1268 | call->enabled = 1; |
1269 | tracing_start_cmdline_record(); | ||
1265 | call->regfunc(); | 1270 | call->regfunc(); |
1266 | 1271 | ||
1267 | event_test_stuff(); | 1272 | event_test_stuff(); |
1268 | 1273 | ||
1269 | call->unregfunc(); | 1274 | call->unregfunc(); |
1275 | tracing_stop_cmdline_record(); | ||
1270 | call->enabled = 0; | 1276 | call->enabled = 0; |
1271 | 1277 | ||
1272 | pr_cont("OK\n"); | 1278 | pr_cont("OK\n"); |