Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751851AbbLCQh2 (ORCPT ); Thu, 3 Dec 2015 11:37:28 -0500 Received: from foss.arm.com ([217.140.101.70]:50171 "EHLO foss.arm.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751071AbbLCQh0 (ORCPT ); Thu, 3 Dec 2015 11:37:26 -0500 Date: Thu, 3 Dec 2015 16:37:26 +0000 From: Will Deacon To: Peter Zijlstra Cc: mingo@kernel.org, oleg@redhat.com, linux-kernel@vger.kernel.org, paulmck@linux.vnet.ibm.com, boqun.feng@gmail.com, corbet@lwn.net, mhocko@kernel.org, dhowells@redhat.com, torvalds@linux-foundation.org, waiman.long@hpe.com, pjt@google.com Subject: Re: [PATCH 3/4] locking: Introduce smp_cond_acquire() Message-ID: <20151203163725.GJ11337@arm.com> References: <20151203124010.627312076@infradead.org> <20151203124339.552838970@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20151203124339.552838970@infradead.org> User-Agent: Mutt/1.5.23 (2014-03-12) Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 2640 Lines: 72 Hi Peter, On Thu, Dec 03, 2015 at 01:40:13PM +0100, Peter Zijlstra wrote: > Introduce smp_cond_acquire() which combines a control dependency and a > read barrier to form acquire semantics. > > This primitive has two benefits: > - it documents control dependencies, > - its typically cheaper than using smp_load_acquire() in a loop. > > Signed-off-by: Peter Zijlstra (Intel) > --- > include/linux/compiler.h | 17 +++++++++++++++++ > kernel/locking/qspinlock.c | 3 +-- > kernel/sched/core.c | 8 +------- > kernel/sched/sched.h | 2 +- > 4 files changed, 20 insertions(+), 10 deletions(-) > > --- a/include/linux/compiler.h > +++ b/include/linux/compiler.h > @@ -299,6 +299,23 @@ static __always_inline void __write_once > __u.__val; \ > }) > > +/** > + * smp_cond_acquire() - Spin wait for cond with ACQUIRE ordering > + * @cond: boolean expression to wait for > + * > + * Equivalent to using smp_load_acquire() on the condition variable but employs > + * the control dependency of the wait to reduce the barrier on many platforms. > + * > + * The control dependency provides a LOAD->STORE order, the additional RMB > + * provides LOAD->LOAD order, together they provide LOAD->{LOAD,STORE} order, > + * aka. ACQUIRE. > + */ > +#define smp_cond_acquire(cond) do { \ > + while (!(cond)) \ > + cpu_relax(); \ > + smp_rmb(); /* ctrl + rmb := acquire */ \ > +} while (0) > + > #endif /* __KERNEL__ */ > > #endif /* __ASSEMBLY__ */ > --- a/kernel/locking/qspinlock.c > +++ b/kernel/locking/qspinlock.c > @@ -446,8 +446,7 @@ void queued_spin_lock_slowpath(struct qs > if ((val = pv_wait_head_or_lock(lock, node))) > goto locked; > > - while ((val = smp_load_acquire(&lock->val.counter)) & _Q_LOCKED_PENDING_MASK) > - cpu_relax(); > + smp_cond_acquire(!((val = atomic_read(&lock->val)) & _Q_LOCKED_PENDING_MASK)); I think we spoke about this before, but what would work really well for arm64 here is if we could override smp_cond_acquire in such a way that the atomic_read could be performed explicitly in the macro. That would allow us to use an LDXR to set the exclusive monitor, which in turn means we can issue a WFE and get a cheap wakeup when lock->val is actually modified. With the current scheme, there's not enough information expressed in the "cond" parameter to perform this optimisation. Cheers, Will -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/