فهرست منبع

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>
Zhaolei 16 سال پیش
والد
کامیت
b11c53e12f
2فایلهای تغییر یافته به همراه13 افزوده شده و 2 حذف شده
  1. 7 2
      kernel/trace/Kconfig
  2. 6 0
      kernel/trace/trace_events.c

+ 7 - 2
kernel/trace/Kconfig

@@ -49,6 +49,11 @@ config FTRACE_NMI_ENTER
        default y
        default y
 
 
 config EVENT_TRACING
 config EVENT_TRACING
+	select CONTEXT_SWITCH_TRACER
+	bool
+
+config CONTEXT_SWITCH_TRACER
+	select MARKERS
 	bool
 	bool
 
 
 config TRACING
 config TRACING
@@ -176,10 +181,10 @@ config SCHED_TRACER
 	  This tracer tracks the latency of the highest priority task
 	  This tracer tracks the latency of the highest priority task
 	  to be scheduled in, starting from the point it has woken up.
 	  to be scheduled in, starting from the point it has woken up.
 
 
-config CONTEXT_SWITCH_TRACER
+config ENABLE_CONTEXT_SWITCH_TRACER
 	bool "Trace process context switches"
 	bool "Trace process context switches"
 	select TRACING
 	select TRACING
-	select MARKERS
+	select CONTEXT_SWITCH_TRACER
 	help
 	help
 	  This tracer gets called from the context switch and records
 	  This tracer gets called from the context switch and records
 	  all switching of tasks.
 	  all switching of tasks.

+ 6 - 0
kernel/trace/trace_events.c

@@ -85,6 +85,7 @@ static void ftrace_clear_events(void)
 
 
 		if (call->enabled) {
 		if (call->enabled) {
 			call->enabled = 0;
 			call->enabled = 0;
+			tracing_stop_cmdline_record();
 			call->unregfunc();
 			call->unregfunc();
 		}
 		}
 	}
 	}
@@ -99,12 +100,14 @@ static void ftrace_event_enable_disable(struct ftrace_event_call *call,
 	case 0:
 	case 0:
 		if (call->enabled) {
 		if (call->enabled) {
 			call->enabled = 0;
 			call->enabled = 0;
+			tracing_stop_cmdline_record();
 			call->unregfunc();
 			call->unregfunc();
 		}
 		}
 		break;
 		break;
 	case 1:
 	case 1:
 		if (!call->enabled) {
 		if (!call->enabled) {
 			call->enabled = 1;
 			call->enabled = 1;
+			tracing_start_cmdline_record();
 			call->regfunc();
 			call->regfunc();
 		}
 		}
 		break;
 		break;
@@ -1058,6 +1061,7 @@ static void trace_module_remove_events(struct module *mod)
 			found = true;
 			found = true;
 			if (call->enabled) {
 			if (call->enabled) {
 				call->enabled = 0;
 				call->enabled = 0;
+				tracing_stop_cmdline_record();
 				call->unregfunc();
 				call->unregfunc();
 			}
 			}
 			if (call->event)
 			if (call->event)
@@ -1262,11 +1266,13 @@ static __init void event_trace_self_tests(void)
 		}
 		}
 
 
 		call->enabled = 1;
 		call->enabled = 1;
+		tracing_start_cmdline_record();
 		call->regfunc();
 		call->regfunc();
 
 
 		event_test_stuff();
 		event_test_stuff();
 
 
 		call->unregfunc();
 		call->unregfunc();
+		tracing_stop_cmdline_record();
 		call->enabled = 0;
 		call->enabled = 0;
 
 
 		pr_cont("OK\n");
 		pr_cont("OK\n");