From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1755535AbcH1NnR (ORCPT ); Sun, 28 Aug 2016 09:43:17 -0400 Received: from mx0b-001b2d01.pphosted.com ([148.163.158.5]:49148 "EHLO mx0a-001b2d01.pphosted.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1750884AbcH1NnP (ORCPT ); Sun, 28 Aug 2016 09:43:15 -0400 X-IBM-Helo: d03dlp01.boulder.ibm.com X-IBM-MailFrom: paulmck@linux.vnet.ibm.com Date: Sun, 28 Aug 2016 06:43:22 -0700 From: "Paul E. McKenney" To: Manfred Spraul Cc: benh@kernel.crashing.org, Ingo Molnar , Boqun Feng , Peter Zijlstra , Andrew Morton , LKML , 1vier1@web.de, Davidlohr Bueso Subject: Re: [PATCH 2/4] barrier.h: Move smp_mb__after_unlock_lock to barrier.h Reply-To: paulmck@linux.vnet.ibm.com References: <1472385376-8801-1-git-send-email-manfred@colorfullife.com> <1472385376-8801-2-git-send-email-manfred@colorfullife.com> <1472385376-8801-3-git-send-email-manfred@colorfullife.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1472385376-8801-3-git-send-email-manfred@colorfullife.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-TM-AS-GCONF: 00 X-Content-Scanned: Fidelis XPS MAILER x-cbid: 16082813-0016-0000-0000-000004860945 X-IBM-SpamModules-Scores: X-IBM-SpamModules-Versions: BY=3.00005654; HX=3.00000240; KW=3.00000007; PH=3.00000004; SC=3.00000183; SDB=6.00750707; UDB=6.00354696; IPR=6.00523480; BA=6.00004676; NDR=6.00000001; ZLA=6.00000005; ZF=6.00000009; ZB=6.00000000; ZP=6.00000000; ZH=6.00000000; ZU=6.00000002; MB=3.00012490; XFM=3.00000011; UTC=2016-08-28 13:43:13 X-IBM-AV-DETECTION: SAVI=unused REMOTE=unused XFE=unused x-cbparentid: 16082813-0017-0000-0000-00003267F3CC Message-Id: <20160828134321.GC19706@linux.vnet.ibm.com> X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10432:,, definitions=2016-08-28_08:,, signatures=0 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 spamscore=0 suspectscore=0 malwarescore=0 phishscore=0 adultscore=0 bulkscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.0.1-1604210000 definitions=main-1608280133 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Sun, Aug 28, 2016 at 01:56:14PM +0200, Manfred Spraul wrote: > spin_unlock() + spin_lock() together do not form a full memory barrier: > > a=1; > spin_unlock(&b); > spin_lock(&c); > + smp_mb__after_unlock_lock(); > d=1; Better would be s/d=1/r1=d/ above. Then another process doing this: d=1 smp_mb() r2=a might have the after-the-dust-settles outcome of r1==0&&r2==0. The advantage of this scenario is that it can happen on real hardware. > > Without the smp_mb__after_unlock_lock(), other CPUs can observe the > write to d without seeing the write to a. > > Signed-off-by: Manfred Spraul With the upgraded commit log, I am OK with the patch below. However, others will probably want to see at least one use of smp_mb__after_unlock_lock() outside of RCU. Thanx, Paul > --- > include/asm-generic/barrier.h | 16 ++++++++++++++++ > kernel/rcu/tree.h | 12 ------------ > 2 files changed, 16 insertions(+), 12 deletions(-) > > diff --git a/include/asm-generic/barrier.h b/include/asm-generic/barrier.h > index fe297b5..9b4d28f 100644 > --- a/include/asm-generic/barrier.h > +++ b/include/asm-generic/barrier.h > @@ -244,6 +244,22 @@ do { \ > smp_acquire__after_ctrl_dep(); \ > VAL; \ > }) > + > +#ifndef smp_mb__after_unlock_lock > +/* > + * Place this after a lock-acquisition primitive to guarantee that > + * an UNLOCK+LOCK pair act as a full barrier. This guarantee applies > + * if the UNLOCK and LOCK are executed by the same CPU or if the > + * UNLOCK and LOCK operate on the same lock variable. > + */ > +#ifdef CONFIG_PPC > +#define smp_mb__after_unlock_lock() smp_mb() /* Full ordering for lock. */ > +#else /* #ifdef CONFIG_PPC */ > +#define smp_mb__after_unlock_lock() do { } while (0) > +#endif /* #else #ifdef CONFIG_PPC */ > + > +#endif > + > #endif > > #endif /* !__ASSEMBLY__ */ > diff --git a/kernel/rcu/tree.h b/kernel/rcu/tree.h > index e99a523..a0cd9ab 100644 > --- a/kernel/rcu/tree.h > +++ b/kernel/rcu/tree.h > @@ -687,18 +687,6 @@ static inline void rcu_nocb_q_lengths(struct rcu_data *rdp, long *ql, long *qll) > #endif /* #ifdef CONFIG_RCU_TRACE */ > > /* > - * Place this after a lock-acquisition primitive to guarantee that > - * an UNLOCK+LOCK pair act as a full barrier. This guarantee applies > - * if the UNLOCK and LOCK are executed by the same CPU or if the > - * UNLOCK and LOCK operate on the same lock variable. > - */ > -#ifdef CONFIG_PPC > -#define smp_mb__after_unlock_lock() smp_mb() /* Full ordering for lock. */ > -#else /* #ifdef CONFIG_PPC */ > -#define smp_mb__after_unlock_lock() do { } while (0) > -#endif /* #else #ifdef CONFIG_PPC */ > - > -/* > * Wrappers for the rcu_node::lock acquire and release. > * > * Because the rcu_nodes form a tree, the tree traversal locking will observe > -- > 2.5.5 >