diff options
Diffstat (limited to 'kernel/trace/trace_stack.c')
| -rw-r--r-- | kernel/trace/trace_stack.c | 6 | 
1 files changed, 5 insertions, 1 deletions
diff --git a/kernel/trace/trace_stack.c b/kernel/trace/trace_stack.c index 719a52a4064a..3c7bfc4bf5e9 100644 --- a/kernel/trace/trace_stack.c +++ b/kernel/trace/trace_stack.c @@ -78,7 +78,7 @@ check_stack(unsigned long ip, unsigned long *stack)  {  	unsigned long this_size, flags; unsigned long *p, *top, *start;  	static int tracer_frame; -	int frame_size = ACCESS_ONCE(tracer_frame); +	int frame_size = READ_ONCE(tracer_frame);  	int i, x;  	this_size = ((unsigned long)stack) & (THREAD_SIZE-1); @@ -209,6 +209,10 @@ stack_trace_call(unsigned long ip, unsigned long parent_ip,  	if (__this_cpu_read(disable_stack_tracer) != 1)  		goto out; +	/* If rcu is not watching, then save stack trace can fail */ +	if (!rcu_is_watching()) +		goto out; +  	ip += MCOUNT_INSN_SIZE;  	check_stack(ip, &stack);  |