All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Paul E. McKenney" <paulmck@linux.vnet.ibm.com>
To: Steven Rostedt <rostedt@goodmis.org>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>,
	Ed Tomlinson <edt@aei.ca>,
	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 11:33:19 -0700	[thread overview]
Message-ID: <20110715183319.GG2327@linux.vnet.ibm.com> (raw)
In-Reply-To: <1310751751.27864.74.camel@gandalf.stny.rr.com>

On Fri, Jul 15, 2011 at 01:42:31PM -0400, Steven Rostedt wrote:
> On Fri, 2011-07-15 at 10:24 -0700, Paul E. McKenney wrote:
> 
> > But the rcu_read_unlock() called from within the irq handler would
> > take a second snapshot of ->special.  It could then enter
> > rcu_read_unlock_special().
> 
> You agree that an interrupt preempting the rcu_read_unlock() is causing
> the issues correct? But it is also contained within rcu_read_unlock().
> That is, we just don't want interrupts or softirqs from calling the
> special function when it preempted rcu_read_unlock().
> 
> How about this patch? (again totally untested and not even compiled)

I really dislike the added overhead, especially the implied
preempt_disable() and preempt_enable() calls.  I am actually trying to
-reduce- its overhead, for example, by removing the function call...

But as a short-term hack-around, it could be OK.  It does seem to
cover all the possible conditions, at least all the ones I can see at
the moment.

Longer term, enclosing the rq/pi lock critical sections with
rcu_read_lock() and rcu_read_unlock() seems more reasonable.

Hmmm...  Does just setting CONFIG_IRQ_FORCED_THREADING suffice to test
this stuff?  Or is "threadirqs" also required on the kernel command line?

							Thanx, Paul

> -- Steve
> 
> diff --git a/kernel/rcupdate.c b/kernel/rcupdate.c
> index 7784bd2..0bdf0ea 100644
> --- a/kernel/rcupdate.c
> +++ b/kernel/rcupdate.c
> @@ -46,6 +46,8 @@
>  #include <linux/module.h>
>  #include <linux/hardirq.h>
> 
> +DEFINE_PER_CPU(int, in_rcu_read_unlock);
> +
>  #ifdef CONFIG_DEBUG_LOCK_ALLOC
>  static struct lock_class_key rcu_lock_key;
>  struct lockdep_map rcu_lock_map =
> diff --git a/kernel/rcutree_plugin.h b/kernel/rcutree_plugin.h
> index 14dc7dd..a4adbb7 100644
> --- a/kernel/rcutree_plugin.h
> +++ b/kernel/rcutree_plugin.h
> @@ -375,6 +375,8 @@ static void rcu_read_unlock_special(struct task_struct *t)
>  	}
>  }
> 
> +DECLARE_PER_CPU(int, in_rcu_read_unlock);
> +
>  /*
>   * Tree-preemptible RCU implementation for rcu_read_unlock().
>   * Decrement ->rcu_read_lock_nesting.  If the result is zero (outermost
> @@ -386,12 +388,16 @@ void __rcu_read_unlock(void)
>  {
>  	struct task_struct *t = current;
> 
> +	get_cpu_var(in_rcu_read_unlock)++;
>  	barrier();  /* needed if we ever invoke rcu_read_unlock in rcutree.c */
>  	--t->rcu_read_lock_nesting;
>  	barrier();  /* decrement before load of ->rcu_read_unlock_special */
>  	if (t->rcu_read_lock_nesting == 0 &&
> +	    __get_cpu_var(in_rcu_read_unlock) == 1 &&
>  	    unlikely(ACCESS_ONCE(t->rcu_read_unlock_special)))
>  		rcu_read_unlock_special(t);
> +	__get_cpu_var(in_rcu_read_unlock)--;
> +	put_cpu_var(in_rcu_read_unlock);
>  #ifdef CONFIG_PROVE_LOCKING
>  	WARN_ON_ONCE(ACCESS_ONCE(t->rcu_read_lock_nesting) < 0);
>  #endif /* #ifdef CONFIG_PROVE_LOCKING */
> 
> 
> --
> To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
> Please read the FAQ at  http://www.tux.org/lkml/

  reply	other threads:[~2011-07-15 18:34 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
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 [this message]
  -- 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=20110715183319.GG2327@linux.vnet.ibm.com \
    --to=paulmck@linux.vnet.ibm.com \
    --cc=a.p.zijlstra@chello.nl \
    --cc=akpm@linux-foundation.org \
    --cc=dipankar@in.ibm.com \
    --cc=edt@aei.ca \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mingo@elte.hu \
    --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.