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" > > > > 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 > > Reviewed-by: Josh Triplett > > --- > > 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(>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/
Re: [PATCH tip/core/rcu 8/9] rcu: Simplify _rcu_barrier() processing
On 08/20/2013 10:42 AM, Paul E. McKenney wrote: > From: "Paul E. McKenney" > > 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 > Reviewed-by: Josh Triplett > --- > 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(>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/
Re: [PATCH tip/core/rcu 8/9] rcu: Simplify _rcu_barrier() processing
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/
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 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 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); -- 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/
[PATCH tip/core/rcu 8/9] rcu: Simplify _rcu_barrier() processing
From: "Paul E. McKenney" 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 Reviewed-by: Josh Triplett --- 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 +* 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(>barrier_mutex); -- 1.8.1.5 -- 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/
[PATCH tip/core/rcu 8/9] rcu: Simplify _rcu_barrier() processing
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 +* 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); -- 1.8.1.5 -- 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/