All of lore.kernel.org
 help / color / mirror / Atom feed
From: Ed Tomlinson <edt@aei.ca>
To: paulmck@linux.vnet.ibm.com
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>,
	Steven Rostedt <rostedt@goodmis.org>,
	Sergey Senozhatsky <sergey.senozhatsky@gmail.com>,
	Ingo Molnar <mingo@elte.hu>, Thomas Gleixner <tglx@linutronix.de>,
	Andrew Morton <akpm@linux-foundation.org>,
	Dipankar Sarma <dipankar@in.ibm.com>,
	linux-kernel@vger.kernel.org
Subject: Re: INFO: possible circular locking dependency detected
Date: Fri, 15 Jul 2011 17:48:06 -0400	[thread overview]
Message-ID: <201107151748.07109.edt@aei.ca> (raw)
In-Reply-To: <20110715165613.GC2327@linux.vnet.ibm.com>

On Friday 15 July 2011 12:56:13 Paul E. McKenney wrote:
> On Fri, Jul 15, 2011 at 06:11:55PM +0200, Peter Zijlstra wrote:
> > On Fri, 2011-07-15 at 08:59 -0700, Paul E. McKenney wrote:
> > 
> > > > Because we're in irq_exit(), after decrementing preempt_count, so
> > > > in_irq() returns false.
> > > 
> > > Can we delay decrementing preempt_count so that RCU has some chance
> > > of actually working?
> > 
> > No, softirqs must be ran with in_irq() being false.
> 
> How about just through the wakeup, not across the softirqs themselves?
> 
> > > > No, the *BANG* being that we end up calling rcu_read_unlock_special()
> > > > while holding scheduler locks, which is BAD(tm).
> > > 
> > > Well, it certainly is BAD(tm) if you guys continue to deprive
> > > rcu_read_unlock_special() of the means of determining whether it is
> > > being invoked from hardware irq handler context.
> > 
> > hard irq handler isn't really the problem here, its the nested softirq
> > code that is.
> 
> More specifically, the calls to the scheduler.  Which in turn is now
> problematic due to the addition of RCU read-side critical sections in
> code holding rq and pi locks.  I clearly failed to fully think through
> the consequences of adding those rcu_read_unlock() calls.
> 
> > > > >  (Which I believe, perhaps
> > > > > incorrectly, to be prevented by the fact that all modifications to
> > > > > ->rcu_read_unlock_special are carried out with irqs disabled on the
> > > > > corresponding CPU, at least given no RCU_BOOST.)  The check for in_irq()
> > > > > should prevent the from-irq rcu_read_unlock_special() from attempting
> > > > > to acquire any locks.
> > > > 
> > > > Right, so in_irq() simply checks a few bits in preempt_count, which we
> > > > just cleared due to being in irq_exit().
> > > 
> > > Right.  So how about delaying clearing those bits until after you get
> > > done messing with the scheduler from hardware irq handler context?
> > 
> > Can't do.
> 
> "messing with the scheduler", not "executing softirq handlers".
> 
> > > > But in_irq() isn't sufficient for RCU usage after the hardirq ends, see
> > > > irq_exit(). Also there's all of softirq to consider, that too can run
> > > > and not get caught by in_irq().
> > > 
> > > Change the rules without adjusting the callers can in fact result in some
> > > breakage.  ;-)
> > 
> > There's no changing the rules here, this is how its worked for a very
> > long time indeed. Softirqs can run from the hardirq tail.
> 
> OK, my complaint was due to my believing that local_irq_save() was
> invoking the scheduler.
> 
> > > The bit about local_irq_save() and local_irq_restore() invoking the
> > > scheduler is rather surprising -- is there a raw_ version that avoids
> > > this?
> > 
> > They don't, they might for -rt, but that's a different story. But
> > looking at the latest version I have its only local_irq_save_rt() and
> > friends that do that.
> 
> Whew!  ;-)
> 
> > > > > 3.	It is possible that the task is preempted after the
> > > > > 	--rcu_read_lock_nesting, in which case the task won't be queued.
> > > > > 	Of course the task might already be queued if there was an
> > > > > 	earlier preemption during this same RCU read-side critical
> > > > > 	section, in which case #2 applies.
> > > > > 
> > > > > 	In other words, a preemption in __rcu_read_unlock() after the
> > > > > 	--rcu_read_lock_nesting has no effect on RCU state: either the
> > > > > 	task was already marked RCU_READ_UNLOCK_BLOCKED, or it wasn't.
> > > > > 	Either way, rcu_note_context_switch() does not see this task as
> > > > > 	being in an RCU read-side critical section.
> > > > > 
> > > > > So what am I missing here?
> > > > 
> > > >  $task			IRQ		SoftIRQ
> > > > 
> > > >  rcu_read_lock()
> > > > 
> > > >  /* do stuff */
> > > > 
> > > >  <preempt> |= UNLOCK_BLOCKED
> > > > 
> > > >  rcu_read_unlock()
> > > >    --t->rcu_read_lock_nesting
> > > > 
> > > > 			irq_enter();
> > > > 			/* do stuff, don't use RCU */
> > > > 			irq_exit();
> > > > 			  sub_preempt_count(IRQ_EXIT_OFFSET);
> > > > 			  invoke_softirq()
> > > 
> > > Why can't we exchange the order of the above two so that RCU correctly
> > > avoids messing with the scheduler if called from hardware interrupt
> > > context?
> > 
> > Because softirqs != hardirq ? This has been so like forever, can't go
> > change the semantics of this without risking tons of borkage. Every time
> > we try to change softirq semantics (we tried with -rt, because softirqs
> > are a massive pain) everything goes tits up fast.
> > 
> > > > 
> > > > 					ttwu();
> > > > 					  spin_lock_irq(&pi->lock)
> > > > 					  rcu_read_lock();
> > > > 					  /* do stuff */
> > > > 					  rcu_read_unlock();
> > > > 					    rcu_read_unlock_special()
> > > > 					      rcu_report_exp_rnp()
> > > > 					        ttwu()
> > > > 					          spin_lock_irq(&pi->lock) /* deadlock */
> > > > 					      
> > > > 
> > > >    rcu_read_unlock_special(t);
> > > > 
> > > > Ed can simply trigger this 'easy' because invoke_softirq() immediately
> > > > does a ttwu() of ksoftirqd/# instead of doing the in-place softirq stuff
> > > > first, but even without that the above happens.
> > > 
> > > An easily reproduced bug is certainly a nice change of pace...
> > > 
> > > > Something like the below _might_ fix it..
> > > 
> > > Maybe, but how does tglx make PREEMPT_RT work in this case?  The problem
> > > is that PREEMPT_RT allows ksoftirqd to be preempted, and thus allows it
> > > to be RCU priority boosted.
> > 
> > RT is mostly easier since it doesn't nest as many contexts, softirqs for
> > example always run in task context, and the only way to run them in a
> > random tasks' context is through local_bh_enable() and since there's no
> > local_bh_enable() call in the middle of __rcu_read_unlock() you're
> > pretty good there.
> > 
> > I know tglx has some softirq changes he hasn't yet shared with me, but
> > if the patch I send earlier fixes the problem for mainline, I'm fairly
> > confident I can cook one up for him as well.
> 
> OK.  Ed, would you be willing to try the patch out?

I am booted at the same git commit with a bluetooth and the disable local_bh around softirq()
patch from this thread.  So far so good.  Not sure how 'easy' this one is to trigger a second time -
I've been running with threadirq enabled since .39 came out.  Last night was the first deadlock...
If nothing happened post rc6 to make it more likely it could be a while before it triggers again.

Thanks
Ed

  reply	other threads:[~2011-07-15 21:48 UTC|newest]

Thread overview: 57+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2011-07-14 14:49 INFO: possible circular locking dependency detected Sergey Senozhatsky
2011-07-14 16:41 ` Peter Zijlstra
2011-07-14 16:57   ` Paul E. McKenney
2011-07-14 19:16     ` Sergey Senozhatsky
2011-07-14 19:15   ` Sergey Senozhatsky
2011-07-14 19:34     ` Paul E. McKenney
2011-07-14 19:38       ` Dave Jones
2011-07-14 20:33         ` Paul E. McKenney
2011-07-14 19:38       ` Sergey Senozhatsky
2011-07-14 16:58 ` Steven Rostedt
2011-07-14 17:02   ` Steven Rostedt
2011-07-14 17:05     ` Paul E. McKenney
2011-07-14 17:32       ` Steven Rostedt
2011-07-14 17:46         ` Steven Rostedt
2011-07-14 19:18           ` Paul E. McKenney
2011-07-14 19:41             ` Steven Rostedt
2011-07-14 20:33               ` Paul E. McKenney
2011-07-15 11:05             ` Ed Tomlinson
2011-07-15 11:29               ` Peter Zijlstra
2011-07-15 11:35                 ` Ed Tomlinson
2011-07-15 11:39                 ` Peter Zijlstra
2011-07-15 18:11                   ` Paul E. McKenney
2011-07-15 12:42                 ` Paul E. McKenney
2011-07-15 13:07                   ` Peter Zijlstra
2011-07-15 14:36                     ` Paul E. McKenney
2011-07-15 15:04                       ` Peter Zijlstra
2011-07-15 15:59                         ` Paul E. McKenney
2011-07-15 16:11                           ` Peter Zijlstra
2011-07-15 16:56                             ` Paul E. McKenney
2011-07-15 21:48                               ` Ed Tomlinson [this message]
2011-07-15 22:04                                 ` Paul E. McKenney
2011-07-16 19:42                                   ` Ed Tomlinson
2011-07-17  0:02                                     ` Paul E. McKenney
2011-07-17  1:56                                       ` Ed Tomlinson
2011-07-17 14:28                                         ` Paul E. McKenney
2011-07-18 15:15                                           ` Paul E. McKenney
2011-07-18  9:29                                     ` Peter Zijlstra
2011-07-18 15:29                                       ` Paul E. McKenney
2011-07-15 16:55                     ` Steven Rostedt
2011-07-15 17:03                       ` Paul E. McKenney
2011-07-15 17:16                         ` Steven Rostedt
2011-07-15 17:24                           ` Paul E. McKenney
2011-07-15 17:42                             ` Steven Rostedt
2011-07-15 18:33                               ` Paul E. McKenney
  -- strict thread matches above, loose matches on Subject: below --
2013-11-20 20:15 Alexei Starovoitov
2013-11-20 23:24 ` Casey Schaufler
2011-08-07 16:22 Justin P. Mattock
2011-08-11 20:57 ` Justin P. Mattock
2009-12-06 10:11 Richard Zidlicky
2009-10-10 23:09 John Kacur
2007-02-08 15:03 Pedro M. López
2006-10-16 14:05 alpha @ steudten Engineering
2006-10-16 14:32 ` Nick Piggin
2006-10-16 15:42   ` Randy Dunlap
2006-10-16 15:46     ` Nick Piggin
2006-10-19  6:02   ` Andrew Morton
2006-10-19  6:30     ` Nick Piggin

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=201107151748.07109.edt@aei.ca \
    --to=edt@aei.ca \
    --cc=a.p.zijlstra@chello.nl \
    --cc=akpm@linux-foundation.org \
    --cc=dipankar@in.ibm.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mingo@elte.hu \
    --cc=paulmck@linux.vnet.ibm.com \
    --cc=rostedt@goodmis.org \
    --cc=sergey.senozhatsky@gmail.com \
    --cc=tglx@linutronix.de \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.