All of lore.kernel.org
 help / color / mirror / Atom feed
From: Frederic Weisbecker <fweisbec@gmail.com>
To: "Paul E. McKenney" <paulmck@linux.vnet.ibm.com>
Cc: Sasha Levin <levinsasha928@gmail.com>,
	linux-kernel <linux-kernel@vger.kernel.org>
Subject: Re: [PATCH] rcu: Improve detection of illegal synchronize_rcu() call from RCU read side
Date: Thu, 5 Jan 2012 02:45:20 +0100	[thread overview]
Message-ID: <20120105014518.GD1143@somewhere> (raw)
In-Reply-To: <20120104213035.GF2448@linux.vnet.ibm.com>

On Wed, Jan 04, 2012 at 01:30:35PM -0800, Paul E. McKenney wrote:
> On Wed, Jan 04, 2012 at 08:03:39PM +0100, Frederic Weisbecker wrote:
> > Actually for the case of RCU, the wait_for_completion() called by synchronize_rcu()
> > has a might_sleep() call that triggers a warning in this case.
> > 
> > But in the case of SMP with 1 online CPU, the rcu_blocking_is_gp()
> > checks returns right away on rcutree. So probably we need this?
> 
> I modified this to push the might_sleep() down into the
> rcu_blocking_is_gp() function, queued the result, and retained your
> Signed-off-by.  (Please let me know if there is any problem with this.)
> 
> This does work for TREE_PREEMPT_RCU and for synchronize_rcu_bh() in
> TREE_RCU, but not for synchronize_sched() in TREE_RCU.  This is because
> rcu_read_lock() and rcu_read_unlock() are no-ops in the TREE_RCU case.

Not sure about that. This calls preempt_disable() which, in any case with
CONFIG_DEBUG_ATOMIC_SLEEP, handles the preempt count. And that even if
!CONFIG_PREEMPT.

> 
> So I queued up a separate patch using rcu_lockdep_assert() to check for
> illegal RCU grace period within the same-type RCU read-side critical
> section, including for SRCU.  This is also a partial solution, as it
> does not handle things like this:
> 
> 	void foo(void)
> 	{
> 		mutex_lock(&my_mutex);
> 		. . .
> 		synchronize_srcu(&my_srcu);
> 		. . .
> 		mutex_unlock(&my_mutex);
> 	}
> 
> 	void bar(void)
> 	{
> 		int idx;
> 
> 		idx = rcu_read_lock(&m_srcu);
> 		. . .
> 		mutex_lock(&my_mutex);
> 		. . .
> 		mutex_unlock(&my_mutex);
> 		. . .
> 		srcu_read_unlock(&m_srcu, idx);
> 	}
> 
> This can be extended into a chain of locks and a chain of SRCU instances.
> For an example of the latter, consider an SRCU-A read-side critical
> section containing an SRCU-B grace period, an SRCU-B read-side critical
> section containing an SRCU-C grace period, and so on, with the SRCU-Z
> read-side critical section containing an RCU-A grace period.

Heh! Indeed...

> But it
> is OK to hold a mutex across one SRCU read-side critical section while
> acquiring that same mutex within another same-flavor SRCU read-side
> critical section.  So the analogy with reader-writer locking only goes
> so far.
> 
> At the moment, a full solution seems to require some surgery on lockdep
> itself, but perhaps there is a better way.

Ok.

> 
> > rcutiny seems to be fine with the cond_resched() call, but srcu needs
> > a special treatment.
> 
> For the moment, I just applied rcu_lockdep_assert() everywhere -- zero
> cost on non-lockdep kernels, and fully handles all of the RCU simple
> self-deadlock cases.

So, for RCU I'm not sure this is useful given the might_sleep() things.
But for srcu it is.

Thanks.

  reply	other threads:[~2012-01-05  1:45 UTC|newest]

Thread overview: 18+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2011-12-26 12:16 INFO: task rcuc/0:7 blocked for more than 120 seconds Sasha Levin
2011-12-26 16:31 ` Paul E. McKenney
2011-12-26 16:37   ` Frederic Weisbecker
2011-12-26 19:56     ` Paul E. McKenney
2012-01-04 19:03       ` [PATCH] rcu: Improve detection of illegal synchronize_rcu() call from RCU read side Frederic Weisbecker
2012-01-04 21:30         ` Paul E. McKenney
2012-01-05  1:45           ` Frederic Weisbecker [this message]
2012-01-05  2:01             ` Paul E. McKenney
2012-01-05  2:06               ` Frederic Weisbecker
2012-01-05  2:17                 ` Paul E. McKenney
2011-12-27  9:13   ` INFO: task rcuc/0:7 blocked for more than 120 seconds Sasha Levin
2011-12-28  4:29     ` Paul E. McKenney
2012-01-03 20:27       ` Paul E. McKenney
2012-01-03 20:37         ` Greg KH
2012-01-03 21:38           ` Paul E. McKenney
2012-01-03 21:50             ` Greg KH
2012-01-03 22:26               ` Paul E. McKenney
2012-01-03 22:33                 ` Paul E. McKenney

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=20120105014518.GD1143@somewhere \
    --to=fweisbec@gmail.com \
    --cc=levinsasha928@gmail.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=paulmck@linux.vnet.ibm.com \
    /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.