Messages in this thread | | | Date | Tue, 20 Aug 2013 11:50:06 -0700 | From | "Paul E. McKenney" <> | Subject | Re: [PATCH tip/core/rcu 8/9] rcu: Simplify _rcu_barrier() processing |
| |
On Tue, Aug 20, 2013 at 05:48:01PM +0800, Lai Jiangshan wrote: > On 08/20/2013 10:42 AM, Paul E. McKenney wrote: > > From: "Paul E. McKenney" <paulmck@linux.vnet.ibm.com> > > > > This commit drops an unneeded ACCESS_ONCE() and simplifies an "our work > > is done" check in _rcu_barrier(). This applies feedback from Linus > > (https://lkml.org/lkml/2013/7/26/777) that he gave to similar code > > in an unrelated patch. > > > > Signed-off-by: Paul E. McKenney <paulmck@linux.vnet.ibm.com> > > Reviewed-by: Josh Triplett <josh@joshtriplett.org> > > --- > > kernel/rcutree.c | 15 +++++++++++++-- > > 1 file changed, 13 insertions(+), 2 deletions(-) > > > > diff --git a/kernel/rcutree.c b/kernel/rcutree.c > > index c6a064a..612aff1 100644 > > --- a/kernel/rcutree.c > > +++ b/kernel/rcutree.c > > @@ -2817,9 +2817,20 @@ static void _rcu_barrier(struct rcu_state *rsp) > > * transition. The "if" expression below therefore rounds the old > > * value up to the next even number and adds two before comparing. > > */ > > - snap_done = ACCESS_ONCE(rsp->n_barrier_done); > > + snap_done = rsp->n_barrier_done; > > _rcu_barrier_trace(rsp, "Check", -1, snap_done); > > - if (ULONG_CMP_GE(snap_done, ((snap + 1) & ~0x1) + 2)) { > > + > > + /* > > + * If the value in snap is odd, we needed to wait for the current > > + * rcu_barrier() to complete, then wait for the next one, in other > > + * words, we need the value of snap_done to be three larger than > > + * the value of snap. On the other hand, if the value in snap is > > + * even, we only had to wait for the next rcu_barrier() to complete, > > + * in other words, we need the value of snap_done to be only two > > + * greater than the value of snap. The "(snap + 3) & 0x1" computes > > "(snap + 3) & 0x1" > ==> "(snap + 3) & ~0x1"
Good catch, fixed!
Thanx, Paul
> > + * this for us (thank you, Linus!). > > + */ > > + if (ULONG_CMP_GE(snap_done, (snap + 3) & ~0x1)) { > > _rcu_barrier_trace(rsp, "EarlyExit", -1, snap_done); > > smp_mb(); /* caller's subsequent code after above check. */ > > mutex_unlock(&rsp->barrier_mutex); >
| |