From: Will Deacon <will.deacon@arm.com>
To: George Spelvin <linux@horizon.com>
Cc: "tim.c.chen@linux.intel.com" <tim.c.chen@linux.intel.com>,
"a.p.zijlstra@chello.nl" <a.p.zijlstra@chello.nl>,
"aarcange@redhat.com" <aarcange@redhat.com>,
"akpm@linux-foundation.org" <akpm@linux-foundation.org>,
"alex.shi@linaro.org" <alex.shi@linaro.org>,
"andi@firstfloor.org" <andi@firstfloor.org>,
"arnd@arndb.de" <arnd@arndb.de>, "aswin@hp.com" <aswin@hp.com>,
"dave.hansen@intel.com" <dave.hansen@intel.com>,
"davidlohr.bueso@hp.com" <davidlohr.bueso@hp.com>,
"figo1802@gmail.com" <figo1802@gmail.com>,
"hpa@zytor.com" <hpa@zytor.com>,
"linux-arch@vger.kernel.org" <linux-arch@vger.kernel.org>,
"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>,
"linux-mm@kvack.org" <linux-mm@kvack.org>,
"matthew.r.wilcox@intel.com" <matthew.r.wilcox@intel.com>,
"mingo@elte.hu" <mingo@elte.hu>,
"paulmck@linux.vnet.ibm.com" <paulmck@linux.vnet.ibm>
Subject: Re: [PATCH v5 4/4] MCS Lock: Barrier corrections
Date: Wed, 13 Nov 2013 17:37:57 +0000 [thread overview]
Message-ID: <20131113173757.GG11928@mudshark.cambridge.arm.com> (raw)
In-Reply-To: <20131112171633.7498.qmail@science.horizon.com>
On Tue, Nov 12, 2013 at 05:16:33PM +0000, George Spelvin wrote:
> > On Mon, Nov 11, 2013 at 09:17:52PM +0000, Tim Chen wrote:
> >> An alternate implementation is
> >> while (!ACCESS_ONCE(node->locked))
> >> arch_mutex_cpu_relax();
> >> smp_load_acquire(&node->locked);
> >>
> >> Leaving the smp_load_acquire at the end to provide appropriate barrier.
> >> Will that be acceptable?
>
> Will Deacon <will.deacon@arm.com> wrote:
> > It still doesn't solve my problem though: I want a way to avoid that busy
> > loop by some architecture-specific manner. The arch_mutex_cpu_relax() hook
> > is a start, but there is no corresponding hook on the unlock side to issue a
> > wakeup. Given a sensible relax implementation, I don't have an issue with
> > putting a load-acquire in a loop, since it shouldn't be aggresively spinning
> > anymore.
>
> So you want something like this?
>
> /*
> * This is a spin-wait with acquire semantics. That is, accesses after
> * this are not allowed to be reordered before the load that meets
> * the specified condition. This requires that it end with either a
> * load-acquire or a full smp_mb(). The optimal way to do this is likely
> * to be architecture-dependent. E.g. x86 MONITOR/MWAIT instructions.
> */
> #ifndef smp_load_acquire_until
> #define smp_load_acquire_until(addr, cond) \
> while (!(smp_load_acquire(addr) cond)) { \
> do { \
> arch_mutex_cpu_relax(); \
> } while (!(ACCESS_ONCE(*(addr)) cond)); \
> }
> #endif
>
> smp_load_acquire_until(&node->locked, != 0);
>
> Alternative implementations:
>
> #define smp_load_acquire_until(addr, cond) { \
> while (!(ACCESS_ONCE(*(addr)) cond)) \
> arch_mutex_cpu_relax(); \
> smp_mb(); }
>
> #define smp_load_acquire_until(addr, cond) \
> if (!(smp_load_acquire(addr) cond)) { \
> do { \
> arch_mutex_cpu_relax(); \
> } while (!(ACCESS_ONCE(*(addr)) cond)); \
> smp_mb(); \
> }
Not really...
To be clear: having the load-acquire in a loop is fine, provided that
arch_mutex_cpu_relax is something which causes the load to back-off (you
mentioned the MONITOR/MWAIT instructions on x86).
On ARM, our equivalent of those instructions also has a counterpart
instruction that needs to be executed by the CPU doing the unlock. That
means we can do one of two things:
1. Add an arch hook in the unlock path to pair with the relax()
call on the lock path (arch_mutex_cpu_wake() ?).
2. Move most of the code into arch_mcs_[un]lock, like we do for
spinlocks.
Whilst (1) would suffice, (2) would allow further optimisation on arm64,
where we can play tricks to avoid the explicit wakeup if we can control the
way in which the lock value is written.
Will
--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo@kvack.org. For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>
next prev parent reply other threads:[~2013-11-13 17:37 UTC|newest]
Thread overview: 43+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <cover.1383935697.git.tim.c.chen@linux.intel.com>
2013-11-08 19:51 ` [PATCH v5 1/4] MCS Lock: Restructure the MCS lock defines and locking code into its own file Tim Chen
2013-11-08 19:51 ` Tim Chen
2013-11-19 19:10 ` Paul E. McKenney
2013-11-19 19:10 ` Paul E. McKenney
2013-11-19 19:42 ` Tim Chen
2013-11-19 19:42 ` Tim Chen
2013-11-19 19:54 ` Paul E. McKenney
2013-11-19 19:54 ` Paul E. McKenney
2013-11-08 19:52 ` [PATCH v5 2/4] MCS Lock: optimizations and extra comments Tim Chen
2013-11-08 19:52 ` Tim Chen
2013-11-19 19:13 ` Paul E. McKenney
2013-11-19 19:13 ` Paul E. McKenney
2013-11-19 19:42 ` Tim Chen
2013-11-19 19:42 ` Tim Chen
2013-11-19 22:57 ` Tim Chen
2013-11-19 22:57 ` Tim Chen
2013-11-19 23:05 ` Paul E. McKenney
2013-11-19 23:05 ` Paul E. McKenney
2013-11-08 19:52 ` [PATCH v5 3/4] MCS Lock: Move mcs_lock/unlock function into its own file Tim Chen
2013-11-08 19:52 ` Tim Chen
2013-11-19 19:15 ` Paul E. McKenney
2013-11-19 19:15 ` Paul E. McKenney
2013-11-08 19:52 ` [PATCH v5 4/4] MCS Lock: Barrier corrections Tim Chen
2013-11-08 19:52 ` Tim Chen
2013-11-11 18:10 ` Will Deacon
2013-11-11 18:20 ` Peter Zijlstra
2013-11-19 19:23 ` Paul E. McKenney
2013-11-11 21:17 ` Tim Chen
2013-11-12 1:57 ` Waiman Long
2013-11-19 19:32 ` Paul E. McKenney
2013-11-19 21:45 ` Tim Chen
2013-11-19 23:30 ` Paul E. McKenney
2013-11-12 2:09 ` Waiman Long
2013-11-12 14:54 ` Waiman Long
2013-11-12 14:54 ` Waiman Long
2013-11-12 16:08 ` Will Deacon
2013-11-12 17:16 ` George Spelvin
2013-11-13 17:37 ` Will Deacon [this message]
2013-11-19 19:26 ` Paul E. McKenney
2013-11-19 19:21 ` Paul E. McKenney
2013-11-19 19:21 ` Paul E. McKenney
2013-11-19 19:46 ` Tim Chen
2013-11-19 19:46 ` Tim Chen
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20131113173757.GG11928@mudshark.cambridge.arm.com \
--to=will.deacon@arm.com \
--cc=a.p.zijlstra@chello.nl \
--cc=aarcange@redhat.com \
--cc=akpm@linux-foundation.org \
--cc=alex.shi@linaro.org \
--cc=andi@firstfloor.org \
--cc=arnd@arndb.de \
--cc=aswin@hp.com \
--cc=dave.hansen@intel.com \
--cc=davidlohr.bueso@hp.com \
--cc=figo1802@gmail.com \
--cc=hpa@zytor.com \
--cc=linux-arch@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=linux@horizon.com \
--cc=matthew.r.wilcox@intel.com \
--cc=mingo@elte.hu \
--cc=paulmck@linux.vnet.ibm \
--cc=tim.c.chen@linux.intel.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).