diff options
Diffstat (limited to 'kernel/trace/trace.c')
| -rw-r--r-- | kernel/trace/trace.c | 15 | 
1 files changed, 11 insertions, 4 deletions
diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c index 1bbfa044650..3c13e46d7d2 100644 --- a/kernel/trace/trace.c +++ b/kernel/trace/trace.c @@ -3454,7 +3454,7 @@ static int tracing_wait_pipe(struct file *filp)  			return -EINTR;  		/* -		 * We block until we read something and tracing is enabled. +		 * We block until we read something and tracing is disabled.  		 * We still block if tracing is disabled, but we have never  		 * read anything. This allows a user to cat this file, and  		 * then enable tracing. But after we have read something, @@ -3462,7 +3462,7 @@ static int tracing_wait_pipe(struct file *filp)  		 *  		 * iter->pos will be 0 if we haven't read anything.  		 */ -		if (tracing_is_enabled() && iter->pos) +		if (!tracing_is_enabled() && iter->pos)  			break;  	} @@ -4817,10 +4817,17 @@ rb_simple_write(struct file *filp, const char __user *ubuf,  		return ret;  	if (buffer) { -		if (val) +		mutex_lock(&trace_types_lock); +		if (val) {  			ring_buffer_record_on(buffer); -		else +			if (current_trace->start) +				current_trace->start(tr); +		} else {  			ring_buffer_record_off(buffer); +			if (current_trace->stop) +				current_trace->stop(tr); +		} +		mutex_unlock(&trace_types_lock);  	}  	(*ppos)++;  |