* [PATCH 1/2] tracing: Have stack tracer force RCU to be watching [not found] <20151022132044.002031045@goodmis.org> @ 2015-10-22 13:20 ` Steven Rostedt 2015-10-29 9:54 ` Paul E. McKenney 0 siblings, 1 reply; 2+ messages in thread From: Steven Rostedt @ 2015-10-22 13:20 UTC (permalink / raw) To: linux-kernel Cc: Linus Torvalds, Ingo Molnar, Andrew Morton, stable, Peter Zijlstra, Paul E. McKenney [-- Attachment #1: 0001-tracing-Have-stack-tracer-force-RCU-to-be-watching.patch --] [-- Type: text/plain, Size: 2068 bytes --] From: "Steven Rostedt (Red Hat)" <rostedt@goodmis.org> 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 0be964be0d45 "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 | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/kernel/trace/trace_stack.c b/kernel/trace/trace_stack.c index b746399ab59c..5f29402bff0f 100644 --- a/kernel/trace/trace_stack.c +++ b/kernel/trace/trace_stack.c @@ -88,6 +88,12 @@ check_stack(unsigned long ip, unsigned long *stack) local_irq_save(flags); arch_spin_lock(&max_stack_lock); + /* + * RCU may not be watching, make it see us. + * The stack trace code uses rcu_sched. + */ + rcu_irq_enter(); + /* In case another CPU set the tracer_frame on us */ if (unlikely(!frame_size)) this_size -= tracer_frame; @@ -169,6 +175,7 @@ check_stack(unsigned long ip, unsigned long *stack) } out: + rcu_irq_exit(); arch_spin_unlock(&max_stack_lock); local_irq_restore(flags); } -- 2.6.1 ^ permalink raw reply related [flat|nested] 2+ messages in thread
* Re: [PATCH 1/2] tracing: Have stack tracer force RCU to be watching 2015-10-22 13:20 ` [PATCH 1/2] tracing: Have stack tracer force RCU to be watching Steven Rostedt @ 2015-10-29 9:54 ` Paul E. McKenney 0 siblings, 0 replies; 2+ messages in thread From: Paul E. McKenney @ 2015-10-29 9:54 UTC (permalink / raw) To: Steven Rostedt Cc: linux-kernel, Linus Torvalds, Ingo Molnar, Andrew Morton, stable, Peter Zijlstra On Thu, Oct 22, 2015 at 09:20:45AM -0400, Steven Rostedt wrote: > From: "Steven Rostedt (Red Hat)" <rostedt@goodmis.org> > > 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 0be964be0d45 "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> It does look like it will make RCU pay attention in the region of interest. Acked-by: Paul E. McKenney <paulmck@linux.vnet.ibm.com> > --- > kernel/trace/trace_stack.c | 7 +++++++ > 1 file changed, 7 insertions(+) > > diff --git a/kernel/trace/trace_stack.c b/kernel/trace/trace_stack.c > index b746399ab59c..5f29402bff0f 100644 > --- a/kernel/trace/trace_stack.c > +++ b/kernel/trace/trace_stack.c > @@ -88,6 +88,12 @@ check_stack(unsigned long ip, unsigned long *stack) > local_irq_save(flags); > arch_spin_lock(&max_stack_lock); > > + /* > + * RCU may not be watching, make it see us. > + * The stack trace code uses rcu_sched. > + */ > + rcu_irq_enter(); > + > /* In case another CPU set the tracer_frame on us */ > if (unlikely(!frame_size)) > this_size -= tracer_frame; > @@ -169,6 +175,7 @@ check_stack(unsigned long ip, unsigned long *stack) > } > > out: > + rcu_irq_exit(); > arch_spin_unlock(&max_stack_lock); > local_irq_restore(flags); > } > -- > 2.6.1 > > ^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2015-10-29 10:57 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
[not found] <20151022132044.002031045@goodmis.org>
2015-10-22 13:20 ` [PATCH 1/2] tracing: Have stack tracer force RCU to be watching Steven Rostedt
2015-10-29 9:54 ` Paul E. McKenney
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).