diff options
Diffstat (limited to 'kernel/trace/trace_sched_switch.c')
| -rw-r--r-- | kernel/trace/trace_sched_switch.c | 72 | 
1 files changed, 58 insertions, 14 deletions
| diff --git a/kernel/trace/trace_sched_switch.c b/kernel/trace/trace_sched_switch.c index 4c896a0101bd..b341c02730be 100644 --- a/kernel/trace/trace_sched_switch.c +++ b/kernel/trace/trace_sched_switch.c @@ -12,27 +12,38 @@  #include "trace.h" -static int			sched_ref; +#define RECORD_CMDLINE	1 +#define RECORD_TGID	2 + +static int		sched_cmdline_ref; +static int		sched_tgid_ref;  static DEFINE_MUTEX(sched_register_mutex);  static void  probe_sched_switch(void *ignore, bool preempt,  		   struct task_struct *prev, struct task_struct *next)  { -	if (unlikely(!sched_ref)) -		return; +	int flags; + +	flags = (RECORD_TGID * !!sched_tgid_ref) + +		(RECORD_CMDLINE * !!sched_cmdline_ref); -	tracing_record_cmdline(prev); -	tracing_record_cmdline(next); +	if (!flags) +		return; +	tracing_record_taskinfo_sched_switch(prev, next, flags);  }  static void  probe_sched_wakeup(void *ignore, struct task_struct *wakee)  { -	if (unlikely(!sched_ref)) -		return; +	int flags; + +	flags = (RECORD_TGID * !!sched_tgid_ref) + +		(RECORD_CMDLINE * !!sched_cmdline_ref); -	tracing_record_cmdline(current); +	if (!flags) +		return; +	tracing_record_taskinfo(current, flags);  }  static int tracing_sched_register(void) @@ -75,28 +86,61 @@ static void tracing_sched_unregister(void)  	unregister_trace_sched_wakeup(probe_sched_wakeup, NULL);  } -static void tracing_start_sched_switch(void) +static void tracing_start_sched_switch(int ops)  { +	bool sched_register = (!sched_cmdline_ref && !sched_tgid_ref);  	mutex_lock(&sched_register_mutex); -	if (!(sched_ref++)) + +	switch (ops) { +	case RECORD_CMDLINE: +		sched_cmdline_ref++; +		break; + +	case RECORD_TGID: +		sched_tgid_ref++; +		break; +	} + +	if (sched_register && (sched_cmdline_ref || sched_tgid_ref))  		tracing_sched_register();  	mutex_unlock(&sched_register_mutex);  } -static void tracing_stop_sched_switch(void) +static void tracing_stop_sched_switch(int ops)  {  	mutex_lock(&sched_register_mutex); -	if (!(--sched_ref)) + +	switch (ops) { +	case RECORD_CMDLINE: +		sched_cmdline_ref--; +		break; + +	case RECORD_TGID: +		sched_tgid_ref--; +		break; +	} + +	if (!sched_cmdline_ref && !sched_tgid_ref)  		tracing_sched_unregister();  	mutex_unlock(&sched_register_mutex);  }  void tracing_start_cmdline_record(void)  { -	tracing_start_sched_switch(); +	tracing_start_sched_switch(RECORD_CMDLINE);  }  void tracing_stop_cmdline_record(void)  { -	tracing_stop_sched_switch(); +	tracing_stop_sched_switch(RECORD_CMDLINE); +} + +void tracing_start_tgid_record(void) +{ +	tracing_start_sched_switch(RECORD_TGID); +} + +void tracing_stop_tgid_record(void) +{ +	tracing_stop_sched_switch(RECORD_TGID);  } | 
