Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S933452AbcDTKbW (ORCPT ); Wed, 20 Apr 2016 06:31:22 -0400 Received: from merlin.infradead.org ([205.233.59.134]:37858 "EHLO merlin.infradead.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S932188AbcDTKbT (ORCPT ); Wed, 20 Apr 2016 06:31:19 -0400 Date: Wed, 20 Apr 2016 12:30:59 +0200 From: Peter Zijlstra To: Jason Low Cc: Will Deacon , Linus Torvalds , "linux-kernel@vger.kernel.org" , "mingo@redhat.com" , "paulmck@linux.vnet.ibm.com" , terry.rudd@hpe.com, "Long, Wai Man" , "boqun.feng@gmail.com" , "dave@stgolabs.net" Subject: Re: [RFC] arm64: Implement WFE based spin wait for MCS spinlocks Message-ID: <20160420103059.GX3408@twins.programming.kicks-ass.net> References: <1460618018.2871.25.camel@j-VirtualBox> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1460618018.2871.25.camel@j-VirtualBox> User-Agent: Mutt/1.5.21 (2012-12-30) Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 1133 Lines: 34 On Thu, Apr 14, 2016 at 12:13:38AM -0700, Jason Low wrote: > Use WFE to avoid most spinning with MCS spinlocks. This is implemented > with the new cmpwait() mechanism for comparing and waiting for the MCS > locked value to change using LDXR + WFE. > > Signed-off-by: Jason Low > --- > arch/arm64/include/asm/mcs_spinlock.h | 21 +++++++++++++++++++++ > 1 file changed, 21 insertions(+) > create mode 100644 arch/arm64/include/asm/mcs_spinlock.h > > diff --git a/arch/arm64/include/asm/mcs_spinlock.h b/arch/arm64/include/asm/mcs_spinlock.h > new file mode 100644 > index 0000000..d295d9d > --- /dev/null > +++ b/arch/arm64/include/asm/mcs_spinlock.h > @@ -0,0 +1,21 @@ > +#ifndef __ASM_MCS_SPINLOCK_H > +#define __ASM_MCS_SPINLOCK_H > + > +#define arch_mcs_spin_lock_contended(l) \ > +do { \ > + int locked_val; \ > + for (;;) { \ > + locked_val = READ_ONCE(*l); \ > + if (locked_val) \ > + break; \ > + cmpwait(l, locked_val); \ > + } \ > + smp_rmb(); \ > +} while (0) If you make the generic version use smp_cond_load_acquire() this isn't needed.