Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit b11c53e1 authored by Zhaolei's avatar Zhaolei Committed by Frederic Weisbecker
Browse files

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: default avatarZhao 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: default avatarFrederic Weisbecker <fweisbec@gmail.com>
parent 29fcefba
Loading
Loading
Loading
Loading
+7 −2
Original line number Original line Diff line number Diff line
@@ -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
Original line number Original line Diff line number Diff line
@@ -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");