From: Nick Piggin <nickpiggin@yahoo.com.au>
To: Paul Mackerras <paulus@samba.org>
Cc: Linus Torvalds <torvalds@linux-foundation.org>,
Matthew Wilcox <matthew@wil.cx>,
Trent Piepho <tpiepho@freescale.com>,
Russell King <rmk+lkml@arm.linux.org.uk>,
Benjamin Herrenschmidt <benh@kernel.crashing.org>,
David Miller <davem@davemloft.net>,
linux-arch@vger.kernel.org, scottwood@freescale.com,
linuxppc-dev@ozlabs.org, alan@lxorguk.ukuu.org.uk,
linux-kernel@vger.kernel.org
Subject: Re: MMIO and gcc re-ordering issue
Date: Wed, 11 Jun 2008 15:00:30 +1000 [thread overview]
Message-ID: <200806111500.30789.nickpiggin@yahoo.com.au> (raw)
In-Reply-To: <18511.21025.978328.596571@cargo.ozlabs.ibm.com>
On Wednesday 11 June 2008 14:18, Paul Mackerras wrote:
> Nick Piggin writes:
> > OK, I'm sitll not quite sure where this has ended up. I guess you are
> > happy with x86 semantics as they are now. That is, all IO accesses are
> > strongly ordered WRT one another and WRT cacheable memory (which includes
> > keeping them within spinlocks),
>
> My understanding was that on x86, loads could pass stores in general,
> i.e. a later load could be performed before an earlier store.
Yes, this is the one reordering allowed by the ISA on cacheable memory.
WC memory is weaker, which Linus wants to allow exception for because
one must explicitly ask for it. UC memory (which presumably is what
we're talking about as "IO access") I think is stronger in that it does
not allow any reordering between one another or any cacheable access:
AMD says this:
c — A store (wp,wt,wb,uc,wc,wc+) may not pass a previous load
(wp,wt,wb,uc,wc,wc+).
f — A load (uc) does not pass a previous store (wp,wt,wb,uc,wc,wc+).
g — A store (wp,wt,wb,uc) does not pass a previous store (wp,wt,wb,uc).
i — A load (wp,wt,wb,wc,wc+) does not pass a previous store (uc).
AMD does allow WC/WC+ to be weakly ordered WRT WC as well as UC, which
Intel seemingly does not. But we're alrady treating WC as special.
I can't actually find the definitive statement in the Intel manuals
saying UC is strongly ordered also WRT WB. Linus?
> I guess
> that can't be true for uncached loads, but could a cacheable load be
> performed before an earlier uncached store?
> > - as strong as x86. guaranteed not to break drivers that work on x86,
> > but slower on some archs. To me, this is most pleasing. It is much
> > much easier to notice something is going a little slower and to work
> > out how to use weaker ordering there, than it is to debug some
> > once-in-a-bluemoon breakage caused by just the right architecture,
> > driver, etc. It totally frees up the driver writer from thinking
> > about barriers, provided they get the locking right.
>
> I just wish we had even one actual example of things going wrong with
> the current rules we have on powerpc to motivate changing to this
> model.
~/usr/src/linux-2.6> git grep test_and_set_bit drivers/ | wc -l
506
How sure are you that none of those forms part of a cobbled-together
locking scheme that hopes to constrain some IO access?
~/usr/src/linux-2.6> git grep test_and_set_bit drivers/ | grep while | wc -l
29
How about those?
~/usr/src/linux-2.6> git grep mutex_lock drivers/ | wc -l
3138
How sure are you that none of them is hoping to constrain IO operations
within the lock?
Also grep for down, down_write, write_lock, and maybe some others I've
forgotten. And then forget completely about locking and imagine some
of the open coded things you see around the place (or parts where drivers
try to get creative and open code their own locking or try lockless
things).
> > Now that doesn't leave waker ordering architectures lumped with "slow old
> > x86 semantics". Think of it as giving them the benefit of sharing x86
> > development and testing :) We can then formalise the relaxed __ accessors
> > to be more complete (ie. +/- byteswapping).
>
> That leaves a gulf between the extremely strongly ordered writel
> etc. and the extremely weakly ordered __writel etc. The current
> powerpc scheme is fine for a lot of drivers but your proposal would
> leave us no way to deliver it to them.
But surely you have to audit the drivers anyway to ensure they are OK
with the current powerpc scheme. In which case, once you have audited
them and know they are safe, you can easily convert them to the even
_faster_ __readl/__writel, and just add the appropriate barriers.
next prev parent reply other threads:[~2008-06-11 5:00 UTC|newest]
Thread overview: 159+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-05-20 20:40 [PATCH] [POWERPC] Improve (in|out)_beXX() asm code Trent Piepho
2008-05-20 21:16 ` Benjamin Herrenschmidt
2008-05-20 21:38 ` Scott Wood
2008-05-20 22:02 ` Benjamin Herrenschmidt
2008-05-20 22:21 ` Trent Piepho
2008-05-20 22:15 ` Alan Cox
2008-05-20 22:35 ` Scott Wood
2008-05-20 22:39 ` David Miller
2008-05-20 22:43 ` Scott Wood
2008-05-20 22:53 ` David Miller
2008-05-23 4:24 ` Benjamin Herrenschmidt
2008-05-22 22:56 ` Trent Piepho
2008-05-23 12:36 ` MMIO and gcc re-ordering (Was: [PATCH] [POWERPC] Improve (in|out)_beXX() asm code) Benjamin Herrenschmidt
2008-05-23 12:50 ` Benjamin Herrenschmidt
2008-05-23 21:14 ` Scott Wood
2008-05-23 22:47 ` Benjamin Herrenschmidt
2008-05-27 1:33 ` MMIO and gcc re-ordering issue Benjamin Herrenschmidt
2008-05-27 1:40 ` David Miller
2008-05-27 2:15 ` Benjamin Herrenschmidt
2008-05-27 2:28 ` David Miller
2008-05-27 3:39 ` Benjamin Herrenschmidt
2008-05-27 15:35 ` Linus Torvalds
2008-05-27 16:47 ` Linus Torvalds
2008-05-27 17:31 ` Linus Torvalds
2008-06-02 10:36 ` Ingo Molnar
2008-06-02 21:53 ` Benjamin Herrenschmidt
2008-05-27 21:12 ` Benjamin Herrenschmidt
2008-05-27 18:23 ` Trent Piepho
2008-05-27 18:33 ` Scott Wood
2008-05-27 21:10 ` Benjamin Herrenschmidt
2008-05-27 21:30 ` Linus Torvalds
2008-05-27 21:38 ` Alan Cox
2008-05-27 21:53 ` Matthew Wilcox
2008-05-27 21:46 ` Alan Cox
2008-05-27 22:02 ` Linus Torvalds
2008-05-27 21:59 ` Linus Torvalds
2008-05-27 21:38 ` Benjamin Herrenschmidt
2008-05-27 21:42 ` Matthew Wilcox
2008-05-27 22:17 ` Benjamin Herrenschmidt
2008-05-28 8:36 ` Haavard Skinnemoen
2008-05-29 11:05 ` Pantelis Antoniou
2008-05-30 1:13 ` Benjamin Herrenschmidt
2008-05-30 6:07 ` Haavard Skinnemoen
2008-05-30 7:24 ` Benjamin Herrenschmidt
2008-05-30 8:27 ` Haavard Skinnemoen
2008-05-30 9:22 ` Geert Uytterhoeven
2008-06-02 8:11 ` Haavard Skinnemoen
2008-06-02 15:48 ` Scott Wood
2008-06-03 7:46 ` Haavard Skinnemoen
2008-06-04 15:31 ` Linus Torvalds
2008-05-27 21:55 ` Linus Torvalds
2008-05-27 22:19 ` Benjamin Herrenschmidt
2008-05-29 7:10 ` Arnd Bergmann
2008-05-29 10:46 ` Alan Cox
2008-06-02 7:24 ` Russell King
2008-06-03 4:16 ` Nick Piggin
2008-06-03 4:32 ` Benjamin Herrenschmidt
2008-06-03 6:11 ` Nick Piggin
2008-06-03 6:48 ` Benjamin Herrenschmidt
2008-06-03 6:53 ` Paul Mackerras
2008-06-03 7:18 ` Nick Piggin
2008-06-03 14:47 ` Linus Torvalds
2008-06-03 18:47 ` Trent Piepho
2008-06-03 18:55 ` Matthew Wilcox
2008-06-03 19:57 ` Trent Piepho
2008-06-03 21:35 ` Matthew Wilcox
2008-06-03 21:58 ` Trent Piepho
2008-06-04 2:00 ` Nick Piggin
2008-06-03 19:07 ` Linus Torvalds
2008-06-04 2:05 ` Nick Piggin
2008-06-04 2:46 ` Linus Torvalds
2008-06-04 11:47 ` Alan Cox
2008-06-10 6:56 ` Nick Piggin
2008-06-10 17:41 ` Jesse Barnes
2008-06-10 18:10 ` James Bottomley
2008-06-10 19:05 ` Roland Dreier
2008-06-10 19:19 ` Jesse Barnes
2008-06-11 3:29 ` Nick Piggin
2008-06-11 3:40 ` Benjamin Herrenschmidt
2008-06-11 4:06 ` Nick Piggin
2008-06-11 16:07 ` Jesse Barnes
2008-06-12 11:27 ` Nick Piggin
2008-06-11 4:18 ` Paul Mackerras
2008-06-11 5:00 ` Nick Piggin [this message]
2008-06-11 5:13 ` Paul Mackerras
2008-06-11 5:35 ` Nick Piggin
2008-06-11 6:02 ` Nick Piggin
2008-06-12 12:14 ` Paul Mackerras
2008-06-12 13:08 ` Nick Piggin
2008-06-11 14:46 ` Linus Torvalds
2008-06-11 5:20 ` Paul Mackerras
2008-06-04 2:19 ` Nick Piggin
2008-06-03 19:43 ` Trent Piepho
2008-06-03 21:33 ` Matthew Wilcox
2008-06-03 21:44 ` Trent Piepho
2008-06-04 2:25 ` Nick Piggin
2008-06-04 6:39 ` Trent Piepho
2008-06-03 22:26 ` Benjamin Herrenschmidt
2008-05-27 3:42 ` Arjan van de Ven
2008-05-27 4:08 ` Roland Dreier
2008-05-27 4:20 ` Arjan van de Ven
2008-05-27 7:08 ` Benjamin Herrenschmidt
2008-05-27 15:50 ` Roland Dreier
2008-05-27 16:37 ` James Bottomley
2008-05-27 17:38 ` Roland Dreier
2008-05-27 17:53 ` James Bottomley
2008-05-27 18:07 ` Roland Dreier
2008-05-27 18:17 ` Roland Dreier
2008-05-27 21:23 ` Chris Friesen
2008-05-27 21:29 ` Roland Dreier
2008-05-27 23:04 ` Paul Mackerras
2008-05-27 21:11 ` Benjamin Herrenschmidt
2008-05-27 21:33 ` Roland Dreier
2008-05-27 22:13 ` Benjamin Herrenschmidt
2008-05-27 22:39 ` Roland Dreier
2008-05-29 14:47 ` Jes Sorensen
2008-05-29 15:01 ` James Bottomley
2008-05-30 9:36 ` Jes Sorensen
2008-05-30 17:21 ` Jesse Barnes
2008-05-31 7:57 ` Jeremy Higdon
2008-05-29 21:40 ` Benjamin Herrenschmidt
2008-05-29 21:48 ` Trent Piepho
2008-05-29 22:05 ` Benjamin Herrenschmidt
2008-05-30 1:53 ` Trent Piepho
2008-05-29 21:53 ` Jesse Barnes
2008-05-30 9:39 ` Jes Sorensen
2008-05-30 9:48 ` Jes Sorensen
2008-05-31 8:14 ` Pavel Machek
2008-06-02 9:48 ` Jes Sorensen
2008-05-29 22:06 ` Roland Dreier
2008-05-29 22:25 ` Trent Piepho
2008-05-30 3:56 ` Paul Mackerras
2008-05-31 7:52 ` Jeremy Higdon
2008-06-02 9:56 ` Jes Sorensen
2008-06-02 21:02 ` Jeremy Higdon
2008-06-03 4:33 ` Nick Piggin
2008-06-03 8:15 ` Jeremy Higdon
2008-06-03 8:19 ` Nick Piggin
2008-06-03 8:45 ` Jeremy Higdon
2008-06-03 16:52 ` Jesse Barnes
2008-06-05 8:40 ` Jes Sorensen
2008-06-05 8:43 ` Benjamin Herrenschmidt
2008-06-12 15:07 ` Matthew Wilcox
2008-06-13 0:07 ` Benjamin Herrenschmidt
2008-05-31 8:04 ` Pavel Machek
2008-05-27 8:24 ` Alan Cox
2008-05-27 15:28 ` Jonathan Corbet
2008-05-20 22:55 ` [PATCH] [POWERPC] Improve (in|out)_beXX() asm code Trent Piepho
2008-05-21 14:01 ` Benjamin Herrenschmidt
2008-05-20 22:00 ` Trent Piepho
2008-05-21 14:00 ` Benjamin Herrenschmidt
2008-05-21 19:44 ` Trent Piepho
2008-05-21 20:41 ` Benjamin Herrenschmidt
2008-05-20 22:00 ` Andreas Schwab
2008-05-20 22:11 ` Trent Piepho
2008-05-20 22:47 ` Andreas Schwab
2008-05-20 23:14 ` Trent Piepho
2008-05-21 8:03 ` Andreas Schwab
2008-05-21 20:25 ` Trent Piepho
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=200806111500.30789.nickpiggin@yahoo.com.au \
--to=nickpiggin@yahoo.com.au \
--cc=alan@lxorguk.ukuu.org.uk \
--cc=benh@kernel.crashing.org \
--cc=davem@davemloft.net \
--cc=linux-arch@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linuxppc-dev@ozlabs.org \
--cc=matthew@wil.cx \
--cc=paulus@samba.org \
--cc=rmk+lkml@arm.linux.org.uk \
--cc=scottwood@freescale.com \
--cc=torvalds@linux-foundation.org \
--cc=tpiepho@freescale.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
all inboxes | Powered by JetHome®