From: "Paul E. McKenney" <paulmck@linux.vnet.ibm.com>
To: Frederic Weisbecker <fweisbec@gmail.com>
Cc: linux-kernel@vger.kernel.org, mingo@elte.hu,
laijs@cn.fujitsu.com, dipankar@in.ibm.com,
akpm@linux-foundation.org, mathieu.desnoyers@polymtl.ca,
josh@joshtriplett.org, niv@us.ibm.com, tglx@linutronix.de,
peterz@infradead.org, rostedt@goodmis.org, dhowells@redhat.com,
edumazet@google.com, darren@dvhart.com, sbw@mit.edu
Subject: Re: [PATCH RFC nohz_full 6/7] nohz_full: Add full-system-idle state machine
Date: Thu, 18 Jul 2013 09:47:49 -0700 [thread overview]
Message-ID: <20130718164749.GV4161@linux.vnet.ibm.com> (raw)
In-Reply-To: <20130718142450.GB7398@somewhere>
On Thu, Jul 18, 2013 at 04:24:51PM +0200, Frederic Weisbecker wrote:
> On Wed, Jul 17, 2013 at 08:39:21PM -0700, Paul E. McKenney wrote:
> > On Thu, Jul 18, 2013 at 03:33:01AM +0200, Frederic Weisbecker wrote:
> > > So it's like:
> > >
> > > CPU 0 CPU 1
> > >
> > > read I write I
> > > smp_mb() smp_mb()
> > > cmpxchg S read S
> > >
> > > I still can't find what guarantees we don't read a value in CPU 1 that is way below
> > > what we want.
> >
> > One key point is that there is a second cycle from LONG to FULL.
> >
> > (Not saying that there is not a bug -- there might well be. In fact,
> > I am starting to think that I need to do another Promela model...
>
> Now I'm very confused :)
To quote a Nobel Laureate who presented at an ISEF here in Portland some
years back, "Confusion is the most productive state of mind." ;-)
> I'm far from being a specialist on these matters but I would really love to
> understand this patchset. Is there any documentation somewhere I can read
> that could help, something about cycles of committed memory or something?
Documentation/memory-barriers.txt should suffice for this. If you want
more rigor, http://www.cl.cam.ac.uk/~pes20/ppc-supplemental/test7.pdf
But memory-barrier pairing suffices here. Here is case 2 from my
earlier email in more detail. The comments with capital letters
mark important memory barriers, some of which are buried in atomic
operations.
1. Some CPU coming out of idle:
o rcu_sysidle_exit():
smp_mb__before_atomic_inc();
atomic_inc(&rdtp->dynticks_idle);
smp_mb__after_atomic_inc(); /* A */
o rcu_sysidle_force_exit():
oldstate = ACCESS_ONCE(full_sysidle_state);
2. RCU GP kthread:
o rcu_sysidle():
cmpxchg(&full_sysidle_state, RCU_SYSIDLE_SHORT, RCU_SYSIDLE_LONG);
/* B */
o rcu_sysidle_check_cpu():
cur = atomic_read(&rdtp->dynticks_idle);
Memory barrier A pairs with memory barrier B, so that if #1's load
from full_sysidle_state sees RCU_SYSIDLE_SHORT, we know that #1's
atomic_inc() must be visible to #2's atomic_read(). This will cause #2
to recognize that the CPU came out of idle, which will in turn cause it
to invoke rcu_sysidle_cancel() instead of rcu_sysidle(), resulting in
full_sysidle_state being set to RCU_SYSIDLE_NOT.
Thanx, Paul
> > > > Unfortunately, the reasoning in #2 above does not hold in the small-CPU
> > > > case because there is the possibility of both the timekeeping CPU and
> > > > the RCU grace-period kthread concurrently advancing the state machine.
> > > > This would be bad, good catch!!!
> > >
> > > It's not like I spotted anything myself but you're welcome :)
> >
> > I will take them any way I can get them. ;-)
> >
> > > > The patch below (untested) is an attempt to fix this. If it actually
> > > > works, I will merge it in with 6/7.
> > > >
> > > > Anything else I missed? ;-)
> > >
> > > Well I guess I'll wait one more night before trying to understand
> > > the below ;)
> >
> > The key point is that the added check means that either the timekeeping
> > CPU is advancing the state machine (if there are few CPUs) or the
> > RCU grace-period kthread is (if there are many CPUs), but never both.
> > Or that is the intent, anyway!
>
> Yeah got that.
>
> Thanks!
>
next prev parent reply other threads:[~2013-07-18 16:49 UTC|newest]
Thread overview: 30+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-07-09 1:29 [PATCH RFC nohz_full 0/7] v3 Provide infrastructure for full-system idle Paul E. McKenney
2013-07-09 1:30 ` [PATCH RFC nohz_full 1/7] nohz_full: Add Kconfig parameter for scalable detection of all-idle state Paul E. McKenney
2013-07-09 1:30 ` [PATCH RFC nohz_full 2/7] nohz_full: Add rcu_dyntick data " Paul E. McKenney
2013-07-09 9:37 ` Peter Zijlstra
2013-07-09 13:23 ` Paul E. McKenney
2013-07-09 1:30 ` [PATCH RFC nohz_full 3/7] nohz_full: Add per-CPU idle-state tracking Paul E. McKenney
2013-07-09 1:30 ` [PATCH RFC nohz_full 4/7] nohz_full: Add full-system idle states and variables Paul E. McKenney
2013-07-09 1:30 ` [PATCH RFC nohz_full 5/7] nohz_full: Add full-system-idle arguments to API Paul E. McKenney
2013-07-09 1:30 ` [PATCH RFC nohz_full 6/7] nohz_full: Add full-system-idle state machine Paul E. McKenney
2013-07-17 23:31 ` Frederic Weisbecker
2013-07-18 0:41 ` Paul E. McKenney
2013-07-18 1:33 ` Frederic Weisbecker
2013-07-18 3:39 ` Paul E. McKenney
2013-07-18 14:24 ` Frederic Weisbecker
2013-07-18 16:47 ` Paul E. McKenney [this message]
2013-07-18 22:46 ` Frederic Weisbecker
2013-07-19 0:24 ` Paul E. McKenney
2013-07-19 2:12 ` Frederic Weisbecker
2013-07-19 5:06 ` Paul E. McKenney
2013-07-24 18:09 ` Frederic Weisbecker
2013-07-24 22:09 ` Paul E. McKenney
2013-07-24 23:26 ` Frederic Weisbecker
2013-07-26 22:52 ` Paul E. McKenney
2013-07-27 18:13 ` Frederic Weisbecker
2013-07-09 1:30 ` [PATCH RFC nohz_full 7/7] nohz_full: Force RCU's grace-period kthreads onto timekeeping CPU Paul E. McKenney
-- strict thread matches above, loose matches on Subject: below --
2013-07-26 23:18 [PATCH RFC nohz_full 0/7] v4 Provide infrastructure for full-system idle Paul E. McKenney
2013-07-26 23:19 ` [PATCH RFC nohz_full 1/7] nohz_full: Add Kconfig parameter for scalable detection of all-idle state Paul E. McKenney
2013-07-26 23:19 ` [PATCH RFC nohz_full 6/7] nohz_full: Add full-system-idle state machine Paul E. McKenney
2013-07-29 8:19 ` Lai Jiangshan
2013-07-29 17:43 ` Paul E. McKenney
2013-08-09 16:20 ` Frederic Weisbecker
2013-08-14 3:07 ` 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=20130718164749.GV4161@linux.vnet.ibm.com \
--to=paulmck@linux.vnet.ibm.com \
--cc=akpm@linux-foundation.org \
--cc=darren@dvhart.com \
--cc=dhowells@redhat.com \
--cc=dipankar@in.ibm.com \
--cc=edumazet@google.com \
--cc=fweisbec@gmail.com \
--cc=josh@joshtriplett.org \
--cc=laijs@cn.fujitsu.com \
--cc=linux-kernel@vger.kernel.org \
--cc=mathieu.desnoyers@polymtl.ca \
--cc=mingo@elte.hu \
--cc=niv@us.ibm.com \
--cc=peterz@infradead.org \
--cc=rostedt@goodmis.org \
--cc=sbw@mit.edu \
--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 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).