diff options
Diffstat (limited to 'kernel/trace/trace.c')
| -rw-r--r-- | kernel/trace/trace.c | 13 | 
1 files changed, 11 insertions, 2 deletions
| diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c index 44004d8aa3b3..5360b7aec57a 100644 --- a/kernel/trace/trace.c +++ b/kernel/trace/trace.c @@ -1702,6 +1702,9 @@ void tracing_reset_all_online_cpus(void)  	struct trace_array *tr;  	list_for_each_entry(tr, &ftrace_trace_arrays, list) { +		if (!tr->clear_trace) +			continue; +		tr->clear_trace = false;  		tracing_reset_online_cpus(&tr->trace_buffer);  #ifdef CONFIG_TRACER_MAX_TRACE  		tracing_reset_online_cpus(&tr->max_buffer); @@ -2799,11 +2802,17 @@ static char *get_trace_buf(void)  	if (!buffer || buffer->nesting >= 4)  		return NULL; -	return &buffer->buffer[buffer->nesting++][0]; +	buffer->nesting++; + +	/* Interrupts must see nesting incremented before we use the buffer */ +	barrier(); +	return &buffer->buffer[buffer->nesting][0];  }  static void put_trace_buf(void)  { +	/* Don't let the decrement of nesting leak before this */ +	barrier();  	this_cpu_dec(trace_percpu_buffer->nesting);  } @@ -6220,7 +6229,7 @@ static int tracing_set_clock(struct trace_array *tr, const char *clockstr)  	tracing_reset_online_cpus(&tr->trace_buffer);  #ifdef CONFIG_TRACER_MAX_TRACE -	if (tr->flags & TRACE_ARRAY_FL_GLOBAL && tr->max_buffer.buffer) +	if (tr->max_buffer.buffer)  		ring_buffer_set_clock(tr->max_buffer.buffer, trace_clocks[i].func);  	tracing_reset_online_cpus(&tr->max_buffer);  #endif |