From: Will Deacon <will.deacon@arm.com>
To: Peter Zijlstra <peterz@infradead.org>
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()
Date: Fri, 4 Dec 2015 14:57:52 +0000 [thread overview]
Message-ID: <20151204144939.GA15969@arm.com> (raw)
In-Reply-To: <20151203202627.GV17308@twins.programming.kicks-ass.net>
On Thu, Dec 03, 2015 at 09:26:27PM +0100, Peter Zijlstra wrote:
> On Thu, Dec 03, 2015 at 04:37:26PM +0000, Will Deacon wrote:
> > > +#define smp_cond_acquire(cond) do { \
> > > + while (!(cond)) \
> > > + cpu_relax(); \
> > > + smp_rmb(); /* ctrl + rmb := acquire */ \
> > > +} while (0)
>
> > > + 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.
>
> Right, but I'm having a hard time constructing something pretty that can
> do that. Lambda functions would be lovely, but we don't have those :/
>
> While we can easily pass a pointer to an arbitrary type, we need
> an expression to evaluate the result of the pointer load to act as our
> condition.
>
> smp_cond_acquire(&lock->val.counter,
> [](int val){ return !(val & _Q_LOCKED_PENDING_MASK); });
>
> Would be nice, but alas.
>
> The best we can do is hardcode a variable name; maybe something like:
>
> #define smp_cond_acquire(ptr, expr) do { \
> typeof(*ptr) val; \
> while ((val = READ_ONCE(*ptr)), expr) \
> cpu_relax(); \
> smp_rmb(); /* ctrl + rmb := acquire */ \
> } while (0)
>
> Which would let us write:
>
> smp_cond_acquire(&lock->val.counter, !(val & _Q_LOCKED_PENDING_MASK));
>
>
> Thoughts?
That would certainly work for me, but I appreciate it's not pretty. We
could have an extra macro parameter for the name of the temporary
variable, if you wanted to make it explicit.
Will
next prev parent reply other threads:[~2015-12-04 14:57 UTC|newest]
Thread overview: 18+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-12-03 12:40 [PATCH 0/4] scheduler ordering bits -v2 Peter Zijlstra
2015-12-03 12:40 ` [PATCH 1/4] sched: Better document the try_to_wake_up() barriers Peter Zijlstra
2015-12-03 12:40 ` [PATCH 2/4] sched: Fix a race in try_to_wake_up() vs schedule() Peter Zijlstra
2015-12-03 12:40 ` [PATCH 3/4] locking: Introduce smp_cond_acquire() Peter Zijlstra
2015-12-03 16:37 ` Will Deacon
2015-12-03 20:26 ` Peter Zijlstra
2015-12-03 21:16 ` Peter Zijlstra
2015-12-04 14:57 ` Will Deacon [this message]
2015-12-04 20:51 ` Waiman Long
2015-12-04 22:05 ` Linus Torvalds
2015-12-04 22:48 ` Waiman Long
2015-12-04 23:43 ` Peter Zijlstra
2015-12-07 15:18 ` Will Deacon
2015-12-03 19:41 ` Davidlohr Bueso
2015-12-03 20:31 ` Peter Zijlstra
2015-12-03 12:40 ` [PATCH 4/4] sched: Document Program-Order guarantees Peter Zijlstra
2015-12-03 13:16 ` Boqun Feng
2015-12-03 13:29 ` Peter Zijlstra
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=20151204144939.GA15969@arm.com \
--to=will.deacon@arm.com \
--cc=boqun.feng@gmail.com \
--cc=corbet@lwn.net \
--cc=dhowells@redhat.com \
--cc=linux-kernel@vger.kernel.org \
--cc=mhocko@kernel.org \
--cc=mingo@kernel.org \
--cc=oleg@redhat.com \
--cc=paulmck@linux.vnet.ibm.com \
--cc=peterz@infradead.org \
--cc=pjt@google.com \
--cc=torvalds@linux-foundation.org \
--cc=waiman.long@hpe.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