diff options
| author | David S. Miller <davem@davemloft.net> | 2013-03-27 13:52:49 -0400 | 
|---|---|---|
| committer | David S. Miller <davem@davemloft.net> | 2013-03-27 13:52:49 -0400 | 
| commit | e2a553dbf18a5177fdebe29495c32a8e7fd3a4db (patch) | |
| tree | 5ccb3d498325a7aaf93f49549eca03cb7861ca1c /kernel/trace/trace.c | |
| parent | 7559d97993ae7d552c96313155286f372cf4cf7c (diff) | |
| parent | a8c45289f215e137825bf9630d0abb41c1dc41ff (diff) | |
| download | olio-linux-3.10-e2a553dbf18a5177fdebe29495c32a8e7fd3a4db.tar.xz olio-linux-3.10-e2a553dbf18a5177fdebe29495c32a8e7fd3a4db.zip  | |
Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
Conflicts:
	include/net/ipip.h
The changes made to ipip.h in 'net' were already included
in 'net-next' before that header was moved to another location.
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'kernel/trace/trace.c')
| -rw-r--r-- | kernel/trace/trace.c | 59 | 
1 files changed, 47 insertions, 12 deletions
diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c index 1f835a83cb2..4f1dade5698 100644 --- a/kernel/trace/trace.c +++ b/kernel/trace/trace.c @@ -704,7 +704,7 @@ __update_max_tr(struct trace_array *tr, struct task_struct *tsk, int cpu)  void  update_max_tr(struct trace_array *tr, struct task_struct *tsk, int cpu)  { -	struct ring_buffer *buf = tr->buffer; +	struct ring_buffer *buf;  	if (trace_stop_count)  		return; @@ -719,6 +719,7 @@ update_max_tr(struct trace_array *tr, struct task_struct *tsk, int cpu)  	arch_spin_lock(&ftrace_max_lock); +	buf = tr->buffer;  	tr->buffer = max_tr.buffer;  	max_tr.buffer = buf; @@ -2880,11 +2881,25 @@ static int set_tracer_option(struct tracer *trace, char *cmp, int neg)  	return -EINVAL;  } -static void set_tracer_flags(unsigned int mask, int enabled) +/* Some tracers require overwrite to stay enabled */ +int trace_keep_overwrite(struct tracer *tracer, u32 mask, int set) +{ +	if (tracer->enabled && (mask & TRACE_ITER_OVERWRITE) && !set) +		return -1; + +	return 0; +} + +int set_tracer_flag(unsigned int mask, int enabled)  {  	/* do nothing if flag is already set */  	if (!!(trace_flags & mask) == !!enabled) -		return; +		return 0; + +	/* Give the tracer a chance to approve the change */ +	if (current_trace->flag_changed) +		if (current_trace->flag_changed(current_trace, mask, !!enabled)) +			return -EINVAL;  	if (enabled)  		trace_flags |= mask; @@ -2894,18 +2909,24 @@ static void set_tracer_flags(unsigned int mask, int enabled)  	if (mask == TRACE_ITER_RECORD_CMD)  		trace_event_enable_cmd_record(enabled); -	if (mask == TRACE_ITER_OVERWRITE) +	if (mask == TRACE_ITER_OVERWRITE) {  		ring_buffer_change_overwrite(global_trace.buffer, enabled); +#ifdef CONFIG_TRACER_MAX_TRACE +		ring_buffer_change_overwrite(max_tr.buffer, enabled); +#endif +	}  	if (mask == TRACE_ITER_PRINTK)  		trace_printk_start_stop_comm(enabled); + +	return 0;  }  static int trace_set_options(char *option)  {  	char *cmp;  	int neg = 0; -	int ret = 0; +	int ret = -ENODEV;  	int i;  	cmp = strstrip(option); @@ -2915,19 +2936,20 @@ static int trace_set_options(char *option)  		cmp += 2;  	} +	mutex_lock(&trace_types_lock); +  	for (i = 0; trace_options[i]; i++) {  		if (strcmp(cmp, trace_options[i]) == 0) { -			set_tracer_flags(1 << i, !neg); +			ret = set_tracer_flag(1 << i, !neg);  			break;  		}  	}  	/* If no option could be set, test the specific tracer options */ -	if (!trace_options[i]) { -		mutex_lock(&trace_types_lock); +	if (!trace_options[i])  		ret = set_tracer_option(current_trace, cmp, neg); -		mutex_unlock(&trace_types_lock); -	} + +	mutex_unlock(&trace_types_lock);  	return ret;  } @@ -2937,6 +2959,7 @@ tracing_trace_options_write(struct file *filp, const char __user *ubuf,  			size_t cnt, loff_t *ppos)  {  	char buf[64]; +	int ret;  	if (cnt >= sizeof(buf))  		return -EINVAL; @@ -2946,7 +2969,9 @@ tracing_trace_options_write(struct file *filp, const char __user *ubuf,  	buf[cnt] = 0; -	trace_set_options(buf); +	ret = trace_set_options(buf); +	if (ret < 0) +		return ret;  	*ppos += cnt; @@ -3250,6 +3275,9 @@ static int tracing_set_tracer(const char *buf)  		goto out;  	trace_branch_disable(); + +	current_trace->enabled = false; +  	if (current_trace->reset)  		current_trace->reset(tr); @@ -3294,6 +3322,7 @@ static int tracing_set_tracer(const char *buf)  	}  	current_trace = t; +	current_trace->enabled = true;  	trace_branch_enable(tr);   out:  	mutex_unlock(&trace_types_lock); @@ -4780,7 +4809,13 @@ trace_options_core_write(struct file *filp, const char __user *ubuf, size_t cnt,  	if (val != 0 && val != 1)  		return -EINVAL; -	set_tracer_flags(1 << index, val); + +	mutex_lock(&trace_types_lock); +	ret = set_tracer_flag(1 << index, val); +	mutex_unlock(&trace_types_lock); + +	if (ret < 0) +		return ret;  	*ppos += cnt;  |