On 08/20/2013 10:42 AM, Paul E. McKenney wrote: > From: "Paul E. McKenney" <paul...@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 <paul...@linux.vnet.ibm.com> > Reviewed-by: Josh Triplett <j...@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" > + * 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); -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/