]> git.baikalelectronics.ru Git - kernel.git/commit
tracing: Have stack tracer force RCU to be watching
authorSteven Rostedt (Red Hat) <rostedt@goodmis.org>
Tue, 20 Oct 2015 15:38:08 +0000 (11:38 -0400)
committerSteven Rostedt <rostedt@goodmis.org>
Tue, 20 Oct 2015 15:38:08 +0000 (11:38 -0400)
commit5287859d92b9dd4524a34a1763e3cada75a8c57e
treeed52dce9e296f5d875b130162ef030dfa89d4f30
parent28d9172277b55f6b17a89bbadf987c6aad81a04d
tracing: Have stack tracer force RCU to be watching

The stack tracer was triggering the WARN_ON() in module.c:

 static void module_assert_mutex_or_preempt(void)
 {
 #ifdef CONFIG_LOCKDEP
if (unlikely(!debug_locks))
return;

WARN_ON(!rcu_read_lock_sched_held() &&
!lockdep_is_held(&module_mutex));
 #endif
 }

The reason is that the stack tracer traces all function calls, and some of
those calls happen while exiting or entering user space and idle. Some of
these functions are called after RCU had already stopped watching, as RCU
does not watch userspace or idle CPUs.

If a max stack is hit, then the save_stack_trace() is called, which will
check module addresses and call module_assert_mutex_or_preempt(), and then
trigger the warning. Sad part is, the warning itself will also do a stack
trace and tigger the same warning. That probably should be fixed.

The warning was added by ac8207ad591f "module: Sanitize RCU usage and
locking" but this bug has probably been around longer. But it's unlikely to
cause much harm, but the new warning causes the system to lock up.

Cc: stable@vger.kernel.org # 4.2+
Cc: Peter Zijlstra <peterz@infradead.org>
Cc:"Paul E. McKenney" <paulmck@linux.vnet.ibm.com>
Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
kernel/trace/trace_stack.c