From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S933840AbcHaSc2 (ORCPT ); Wed, 31 Aug 2016 14:32:28 -0400 Received: from mail-wm0-f49.google.com ([74.125.82.49]:36972 "EHLO mail-wm0-f49.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S932162AbcHaScZ (ORCPT ); Wed, 31 Aug 2016 14:32:25 -0400 Subject: Re: [PATCH 1/4] spinlock: Document memory barrier rules To: Will Deacon , Peter Zijlstra References: <1472385376-8801-1-git-send-email-manfred@colorfullife.com> <1472385376-8801-2-git-send-email-manfred@colorfullife.com> <20160829104815.GI10153@twins.programming.kicks-ass.net> <968e4c62-4486-a6aa-8fdf-67ff9b05a330@colorfullife.com> <20160829134424.GS10153@twins.programming.kicks-ass.net> <4859166f-ff39-e998-638b-6bf6912422a3@colorfullife.com> <20160831154049.GY10121@twins.programming.kicks-ass.net> <20160831164020.GG29505@arm.com> Cc: benh@kernel.crashing.org, paulmck@linux.vnet.ibm.com, Ingo Molnar , Boqun Feng , Andrew Morton , LKML , 1vier1@web.de, Davidlohr Bueso From: Manfred Spraul Message-ID: <80de24e3-fa01-a6d6-99e9-afd1e831e07b@colorfullife.com> Date: Wed, 31 Aug 2016 20:32:18 +0200 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Thunderbird/45.2.0 MIME-Version: 1.0 In-Reply-To: <20160831164020.GG29505@arm.com> Content-Type: text/plain; charset=windows-1252; format=flowed Content-Transfer-Encoding: 7bit Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On 08/31/2016 06:40 PM, Will Deacon wrote: > > I'm struggling with this example. We have these locks: > > &sem->lock > &sma->sem_base[0...sma->sem_nsems].lock > &sma->sem_perm.lock > > a condition variable: > > sma->complex_mode > > and a new barrier: > > smp_mb__after_spin_lock() > > For simplicity, we can make sma->sem_nsems == 1, and have &sma->sem_base[0] > be &sem->lock in the example above. Correct. > &sma->sem_perm.lock seems to be > irrelevant. Correct. > The litmus test then looks a bit like: > > CPUm: > > LOCK(x) > smp_mb(); > RyAcq=0 > > > CPUn: > > Wy=1 > smp_mb(); > UNLOCK_WAIT(x) Correct. > > which I think can be simplified to: > > > LOCK(x) I thought that here a barrier is required, because Ry=0 could be before store of the lock. > Ry=0 RyAcq instead of Ry would required due to the unlock at the end of the critical section CpuN: <...> WyRelease=0 for the litmus test irrelevant. > Wy=1 > smp_mb(); // Note that this is implied by spin_unlock_wait on PPC and arm64 > LOCK(x) // spin_unlock_wait behaves like lock; unlock > UNLOCK(x) > [I've removed a bunch of barriers here, that I don't think are necessary > for the guarantees you're after] > > and the question is "Can both CPUs proceed?". > > Looking at the above, then I don't think that they can. Whilst CPUm can > indeed speculate the Ry=0 before successfully taking the lock, if CPUn > observes CPUm's read, then it must also observe the lock being held wrt > the spin_lock API. That is because a successful LOCK operation by CPUn > would force CPUm to replay its LL/SC loop and therefore discard its > speculation of y. > > What am I missing? The code snippet seems to have too many barriers to me! spin_unlock_wait() is not necessarily lock()+unlock(). It can be a simple Rx, or now RxAcq. So I had assumed: CPUm: LOCK(x) smp_mb(); /* at least for PPC, therefore with arch override */ RyAcq=0 CPUn: Wy=1 smp_mb(); /* at least for archs where UNLOCK_WAIT is RxAcq */ UNLOCK_WAIT(x) smp_rmb(); /* not required anymore, was required when UNLOCK_WAIT was Rx */ -- Manfred