• S
    tracing: Have stack tracer force RCU to be watching · a2d76290
    Steven Rostedt (Red Hat) 提交于
    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 0be964be "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: NSteven Rostedt <rostedt@goodmis.org>
    a2d76290
trace_stack.c 10.2 KB