From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751894AbcHaE7P (ORCPT ); Wed, 31 Aug 2016 00:59:15 -0400 Received: from mail-wm0-f65.google.com ([74.125.82.65]:36018 "EHLO mail-wm0-f65.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1755217AbcHaE7L (ORCPT ); Wed, 31 Aug 2016 00:59:11 -0400 From: Manfred Spraul Subject: Re: [PATCH 1/4] spinlock: Document memory barrier rules To: 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> Cc: benh@kernel.crashing.org, paulmck@linux.vnet.ibm.com, Ingo Molnar , Boqun Feng , Andrew Morton , LKML , 1vier1@web.de, Davidlohr Bueso Message-ID: <4859166f-ff39-e998-638b-6bf6912422a3@colorfullife.com> Date: Wed, 31 Aug 2016 06:59:07 +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: <20160829134424.GS10153@twins.programming.kicks-ass.net> 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/29/2016 03:44 PM, Peter Zijlstra wrote: > > If you add a barrier, the Changelog had better be clear. And I'm still > not entirely sure I get what exactly this barrier should do, nor why it > defaults to a full smp_mb. If what I suspect it should do, only PPC and > ARM64 need the barrier. The barrier must ensure that taking the spinlock (as observed by another cpu with spin_unlock_wait()) and a following read are ordered. start condition: sma->complex_mode = false; CPU 1: spin_lock(&sem->lock); /* sem_nsems instances */ smp_mb__after_spin_lock(); if (!smp_load_acquire(&sma->complex_mode)) { /* fast path successful! */ return sops->sem_num; } /* slow path, not relevant */ CPU 2: (holding sma->sem_perm.lock) smp_store_mb(sma->complex_mode, true); for (i = 0; i < sma->sem_nsems; i++) { spin_unlock_wait(&sma->sem_base[i].lock); } It must not happen that both CPUs proceed: Either CPU1 proceeds, then CPU2 must spin in spin_unlock_wait() or CPU2 proceeds, then CPU1 must enter the slow path. What about this? /* * spin_lock() provides ACQUIRE semantics regarding reading the lock. * There are no guarantees that the store of the lock is visible before * any read or write operation within the protected area is performed. * If the store of the lock must happen first, this function is required. */ #define spin_lock_store_acquire() I would update the patch series. -- Manfred