From: Benjamin Herrenschmidt <benh@kernel.crashing.org>
To: Vineet Gupta <Vineet.Gupta1@synopsys.com>
Cc: Peter Zijlstra <peterz@infradead.org>,
"linux-arch@vger.kernel.org" <linux-arch@vger.kernel.org>,
Gilad Ben-Yossef <gilad@benyossef.com>,
Noam Camus <noamc@ezchip.com>,
David Daney <david.daney@cavium.com>,
James Hogan <james.hogan@imgtec.com>,
thomas Gleixner <tglx@linutronix.de>,
lkml <linux-kernel@vger.kernel.org>,
Richard Kuo <rkuo@codeaurora.org>
Subject: Re: Preventing IPI sending races in arch code
Date: Tue, 26 Nov 2013 06:51:43 +1100 [thread overview]
Message-ID: <1385409103.9218.15.camel@pasglop> (raw)
In-Reply-To: <C2D7FE5348E1B147BCA15975FBA2307515715C@IN01WEMBXA.internal.synopsys.com>
On Mon, 2013-11-25 at 13:35 +0000, Vineet Gupta wrote:
> Before reading ur email I was coding something like below:
>
> void arch_send_ipi(int cpu, int type)
> {
> u32 *pending_ptr = per_cpu_ptr(ipi_bits, cpu);
>
> while (cmpxchg(pending_ptr, 0, 1 << type) != 0)
> cpu_relax();
>
> raise_ipi(cpu);
> }
So you would have blocked the sender while there was already
a pending IPI on the target ? Why ?
The optimization proposed by Peter is actually the only interesting
change here, without it the existing set_bit was perfectly fine.
Remember that set_bit is atomic.
Ben.
> But obviously your version is nicer due to optimization, unless I'm over-analyzing it.
>
>
> > Also, the above can be thought of as a memory ordering issue:
> >
> > STORE pending
> > MB /* implied by cmpxchg */
> > STORE ipi /* raise the actual thing */
> >
> > In that case the other end must be:
> >
> > LOAD ipi
> > MB /* implied by xchg */
> > LOAD pending
> >
> > Which is what your code seems to do.
>
> ...
>
> >
> >> IMO the while loop is
> >> completely useless specially if IPIs are not coalesced in h/w.
> > Agreed, the while loops seems superfluous.
>
> Not with your version of sender, since we need it as described above.
>
> >> And we need to move
> >> the xchg ahead of ACK'ing the IPI
> >>
> >> do_IPI
> >> pending = xchg(&ipi_data->bits, 0);
> >> plat_smp_ops.ipi_clear(irq);
> >> while (ffs....)
> >> switch(next-msg)
> >> ...
> >>
> >> Does that look sane to you.
> > This I'm not at all certain of; continuing with the memory order analogy
> > this would allow for the case where we see 0 pending, set a bit, try and
> > raise the interrupt but then do not because its already assert.
> >
> > And since you just removed the while() loop, we'll be left with a !0
> > pending vector and nobody processing it.
>
> Right we need it with ur version of sender. Bit don't with my simplistic one.
>
> -Vineet
> --
> To unsubscribe from this list: send the line "unsubscribe linux-arch" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at http://vger.kernel.org/majordomo-info.html
next prev parent reply other threads:[~2013-11-25 19:53 UTC|newest]
Thread overview: 10+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-11-25 10:52 Preventing IPI sending races in arch code Vineet Gupta
2013-11-25 11:00 ` Peter Zijlstra
2013-11-25 11:30 ` Vineet Gupta
2013-11-25 12:27 ` Peter Zijlstra
2013-11-25 13:35 ` Vineet Gupta
2013-11-25 13:57 ` Peter Zijlstra
2013-11-25 19:51 ` Benjamin Herrenschmidt [this message]
2013-11-26 4:47 ` Vineet Gupta
2013-11-26 5:11 ` Benjamin Herrenschmidt
2013-11-26 6:35 ` Vineet Gupta
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=1385409103.9218.15.camel@pasglop \
--to=benh@kernel.crashing.org \
--cc=Vineet.Gupta1@synopsys.com \
--cc=david.daney@cavium.com \
--cc=gilad@benyossef.com \
--cc=james.hogan@imgtec.com \
--cc=linux-arch@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=noamc@ezchip.com \
--cc=peterz@infradead.org \
--cc=rkuo@codeaurora.org \
--cc=tglx@linutronix.de \
/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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.