From: Nicholas Piggin <npiggin@gmail.com>
To: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Cc: linuxppc-dev@lists.ozlabs.org, Michael Ellerman <mpe@ellerman.id.au>
Subject: Re: [RFC][PATCH 0/2] reworking cause_ipi and adding global doorbell support
Date: Tue, 14 Mar 2017 16:22:06 +1000 [thread overview]
Message-ID: <20170314162206.381c71d7@roar.ozlabs.ibm.com> (raw)
In-Reply-To: <1489467001.26634.1.camel@kernel.crashing.org>
On Tue, 14 Mar 2017 15:50:01 +1100
Benjamin Herrenschmidt <benh@kernel.crashing.org> wrote:
> On Tue, 2017-03-14 at 14:35 +1000, Nicholas Piggin wrote:
> > > We might need a sync still between clearing the byte and calling the
> > > handler no ? Or at least a smp_wmb() to ensure that the clear is
> > > visible before any action of the handler.
> >
> > Yes I have exactly that (smp_wmb).
> >
> > At first I checked and cleared each byte then did a single smp_wmb, but
> > I changed my mind because most of the time the IPI will fire with only
> > one message set, so it does not seem like it's worth the extra branches
> > to avoid a lwsync in the rare case of 2 messages.
>
> Will lwsync provide transitivity ?
>
> What we care about is that if the handler does something that when observed
> by another CPU causes that other CPU to send back an IPI, the write by that
> other CPU comes after our clear. I'm not sure if lwsync is enough. We might
> need Paul Mck for that :-)
Hmm. Well lwsync is cumulative for the ordering it provides.
The target CPU can pick up messages without having gone through an
interrupt and msgsync, and even before sender has executed a sync.
Let's say we have the following situation where the IPI handler on
CPU1 reads variables set by CPU0 and CPU2, and stores the result in
other memory locations.
CPU0 CPU1 CPU2
data0=1
sync
CPU[1].msg[x]=1
msg=CPU[1].msg[x]
if (msg) /* handle x */
CPU[1].msg[x]=0
lwsync
ready0=data0
ready2=data2
ASSERTa(ready0==1)
x=ready0
if (x)
ASSERTb(data0==1 after lwsync)
data2=1
sync
CPU[1].msg[x]=1
sync
doorbell
*doorbell*
if (ready2==0)
ASSERTc(CPU[1].msg[x]==1)
ASSERTa is the simple pairwise that data from CPU0 must be visible if the
message is set. In this case sync and lwsync on CPU0 and 1 should make
that work for cache inhibited. I guess if we only order cacheable and
require CI to add their own syncs, then CPU0 sync may be lwsync as well?
Alternatively if we require CI ordering then CPU1 has to be sync.
ASSERTb is cumulative ordering where if CPU2 sees CPU1 handler result
then it must also see CPU0 pre-IPI result. I think this is covered by
example 2 on p820 of ISAv3 doc.
ASSERTc says that if the handler did not pick up CPU2's store after
setting msg[x]=0, then it must eventually see msg[x]=1 store from CPU2.
I think this should also be true because if CPU2 found ready0==1, then
it would also see CPU[1].msg[x]==0 after a barrier (simple pairwise
ordering).
You're right though, we should run it by Paul :)
Thanks,
Nick
prev parent reply other threads:[~2017-03-14 6:22 UTC|newest]
Thread overview: 11+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-03-12 17:13 [RFC][PATCH 0/2] reworking cause_ipi and adding global doorbell support Nicholas Piggin
2017-03-12 17:13 ` [PATCH 1/2] powerpc/64s: change the doorbell IPI calling convention Nicholas Piggin
2017-03-12 17:13 ` [PATCH 2/2] powerpc/64s: use global doorbell on POWER9 in HV mode Nicholas Piggin
2017-03-13 23:31 ` [RFC][PATCH 0/2] reworking cause_ipi and adding global doorbell support Benjamin Herrenschmidt
2017-03-14 1:49 ` Nicholas Piggin
2017-03-14 2:34 ` Benjamin Herrenschmidt
2017-03-14 2:53 ` Nicholas Piggin
2017-03-14 3:57 ` Benjamin Herrenschmidt
2017-03-14 4:35 ` Nicholas Piggin
2017-03-14 4:50 ` Benjamin Herrenschmidt
2017-03-14 6:22 ` Nicholas Piggin [this message]
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=20170314162206.381c71d7@roar.ozlabs.ibm.com \
--to=npiggin@gmail.com \
--cc=benh@kernel.crashing.org \
--cc=linuxppc-dev@lists.ozlabs.org \
--cc=mpe@ellerman.id.au \
/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).