From: "Paul E. McKenney" <paulmck@linux.vnet.ibm.com>
To: Frederic Weisbecker <fweisbec@gmail.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: Wed, 4 Jan 2012 18:01:08 -0800 [thread overview]
Message-ID: <20120105020108.GQ2448@linux.vnet.ibm.com> (raw)
In-Reply-To: <20120105014518.GD1143@somewhere>
On Thu, Jan 05, 2012 at 02:45:20AM +0100, Frederic Weisbecker wrote:
> 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.
Ah, of course! I keep forgetting that CONFIG_DEBUG_ATOMIC_SLEEP selects
CONFIG_PREEMPT_COUNT.
> > 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.
One nice thing about the lockdep approach is that it tracks where the
conflicting RCU read-side critical section started. But I am planning
for these to be 3.4 material, so we do have some time to refine them.
Thanx, Paul
next prev parent reply other threads:[~2012-01-05 2:01 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
2012-01-05 2:01 ` Paul E. McKenney [this message]
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=20120105020108.GQ2448@linux.vnet.ibm.com \
--to=paulmck@linux.vnet.ibm.com \
--cc=fweisbec@gmail.com \
--cc=levinsasha928@gmail.com \
--cc=linux-kernel@vger.kernel.org \
/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.