diff options
Diffstat (limited to 'kernel/trace/trace_nop.c')
| -rw-r--r-- | kernel/trace/trace_nop.c | 65 | 
1 files changed, 53 insertions, 12 deletions
diff --git a/kernel/trace/trace_nop.c b/kernel/trace/trace_nop.c index 4592b4862515..b9767acd30ac 100644 --- a/kernel/trace/trace_nop.c +++ b/kernel/trace/trace_nop.c @@ -12,6 +12,27 @@  #include "trace.h" +/* Our two options */ +enum { +	TRACE_NOP_OPT_ACCEPT = 0x1, +	TRACE_NOP_OPT_REFUSE = 0x2 +}; + +/* Options for the tracer (see trace_options file) */ +static struct tracer_opt nop_opts[] = { +	/* Option that will be accepted by set_flag callback */ +	{ TRACER_OPT(test_nop_accept, TRACE_NOP_OPT_ACCEPT) }, +	/* Option that will be refused by set_flag callback */ +	{ TRACER_OPT(test_nop_refuse, TRACE_NOP_OPT_REFUSE) }, +	{ } /* Always set a last empty entry */ +}; + +static struct tracer_flags nop_flags = { +	/* You can check your flags value here when you want. */ +	.val = 0, /* By default: all flags disabled */ +	.opts = nop_opts +}; +  static struct trace_array	*ctx_trace;  static void start_nop_trace(struct trace_array *tr) @@ -24,7 +45,7 @@ static void stop_nop_trace(struct trace_array *tr)  	/* Nothing to do! */  } -static void nop_trace_init(struct trace_array *tr) +static int nop_trace_init(struct trace_array *tr)  {  	int cpu;  	ctx_trace = tr; @@ -32,33 +53,53 @@ static void nop_trace_init(struct trace_array *tr)  	for_each_online_cpu(cpu)  		tracing_reset(tr, cpu); -	if (tr->ctrl) -		start_nop_trace(tr); +	start_nop_trace(tr); +	return 0;  }  static void nop_trace_reset(struct trace_array *tr)  { -	if (tr->ctrl) -		stop_nop_trace(tr); +	stop_nop_trace(tr);  } -static void nop_trace_ctrl_update(struct trace_array *tr) +/* It only serves as a signal handler and a callback to + * accept or refuse tthe setting of a flag. + * If you don't implement it, then the flag setting will be + * automatically accepted. + */ +static int nop_set_flag(u32 old_flags, u32 bit, int set)  { -	/* When starting a new trace, reset the buffers */ -	if (tr->ctrl) -		start_nop_trace(tr); -	else -		stop_nop_trace(tr); +	/* +	 * Note that you don't need to update nop_flags.val yourself. +	 * The tracing Api will do it automatically if you return 0 +	 */ +	if (bit == TRACE_NOP_OPT_ACCEPT) { +		printk(KERN_DEBUG "nop_test_accept flag set to %d: we accept." +			" Now cat trace_options to see the result\n", +			set); +		return 0; +	} + +	if (bit == TRACE_NOP_OPT_REFUSE) { +		printk(KERN_DEBUG "nop_test_refuse flag set to %d: we refuse." +			"Now cat trace_options to see the result\n", +			set); +		return -EINVAL; +	} + +	return 0;  } +  struct tracer nop_trace __read_mostly =  {  	.name		= "nop",  	.init		= nop_trace_init,  	.reset		= nop_trace_reset, -	.ctrl_update	= nop_trace_ctrl_update,  #ifdef CONFIG_FTRACE_SELFTEST  	.selftest	= trace_selftest_startup_nop,  #endif +	.flags		= &nop_flags, +	.set_flag	= nop_set_flag  };  | 
