Re: [PATCH tip/core/rcu 8/9] rcu: Simplify _rcu_barrier() processing

2013-08-20 Thread Paul E. McKenney
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

2013-08-20 Thread Lai Jiangshan
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

2013-08-20 Thread Lai Jiangshan
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

2013-08-20 Thread Paul E. McKenney
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

2013-08-19 Thread Paul E. McKenney
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

2013-08-19 Thread Paul E. McKenney
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/