linuxppc-dev.lists.ozlabs.org archive mirror
 help / color / mirror / Atom feed
From: Jesse Barnes <jbarnes@virtuousgeek.org>
To: Nick Piggin <nickpiggin@yahoo.com.au>
Cc: linux-arch@vger.kernel.org, Roland Dreier <rdreier@cisco.com>,
	Jes Sorensen <jes@sgi.com>,
	linux-kernel@vger.kernel.org, Jeremy Higdon <jeremy@sgi.com>,
	David Miller <davem@davemloft.net>,
	linuxppc-dev@ozlabs.org, scottwood@freescale.com,
	torvalds@linux-foundation.org, tpiepho@freescale.com,
	alan@lxorguk.ukuu.org.uk, Arjan van de Ven <arjan@infradead.org>
Subject: Re: MMIO and gcc re-ordering issue
Date: Tue, 3 Jun 2008 09:52:09 -0700	[thread overview]
Message-ID: <200806030952.10360.jbarnes@virtuousgeek.org> (raw)
In-Reply-To: <200806031433.12460.nickpiggin@yahoo.com.au>

On Monday, June 02, 2008 9:33 pm Nick Piggin wrote:
> On Monday 02 June 2008 19:56, Jes Sorensen wrote:
> > Jeremy Higdon wrote:
> > > We don't actually have that problem on the Altix.  All writes issued
> > > by CPU X will be ordered with respect to each other.  But writes by
> > > CPU X and CPU Y will not be, unless an mmiowb() is done by the
> > > original CPU before the second CPU writes.  I.e.
> > >
> > > 	CPU X	writel
> > > 	CPU X	writel
> > > 	CPU X	mmiowb
> > >
> > > 	CPU Y	writel
> > > 	...
> > >
> > > Note that this implies some sort of locking.  Also note that if in
> > > the above, CPU Y did the mmiowb, that would not work.
> >
> > Hmmm,
> >
> > Then it's less bad than I thought - my apologies for the confusion.
> >
> > Would we be able to use Ben's trick of setting a per cpu flag in
> > writel() then and checking that in spin unlock issuing the mmiowb()
> > there if needed?
>
> Yes you could, but your writels would still not be strongly ordered
> within (or outside) spinlock regions, which is what Linus wants (and
> I kind of agree with).

I think you mean wrt cacheable memory accesses here (though iirc on ia64 
spin_unlock has release semantics, so at least it'll barrier other stores).

> This comes back to my posting about mmiowb and io_*mb barriers etc.
>
> Despite what you say, what you've done really _does_ change the semantics
> of wmb() for all drivers. It is a really sad situation we've got ourselves
> into somehow, AFAIKS in the hope of trying to save ourselves a tiny bit
> of work upfront :( (this is not just the sgi folk with mmiowb I'm talking
> about, but the whole random undefinedness of ordering and io barriers).
>
> The right way to make any change is never to weaken the postcondition of
> an existing interface *unless* you are willing to audit the entire tree
> and fix it. Impossible for drivers, so the correct thing to do is introduce
> a new interface, and move things over at an easier pace. Not rocket
> science.

Well, given how undefined things have been in the past, each arch has had to 
figure out what things mean (based on looking at drivers & core code) then 
come up with appropriate primitives.  On Altix, we went both directions:  we 
made regular PIO reads (readX etc.) *very* expensive to preserve 
compatibility with what existing drivers expect, and added a readX_relaxed to 
give a big performance boost to tuned drivers.

OTOH, given that posted PCI writes were nothing new to Linux, but the Altix 
network topology was, we introduced mmiowb() (with lots of discussion I might 
add), which has clear and relatively simple usage guidelines.

Now, in hindsight, using a PIO write set & test flag approach in 
writeX/spin_unlock (ala powerpc) might have been a better approach, but iirc 
that never came up in the discussion, probably because we were focused on PCI 
posting and not uncached vs. cached ordering.

> The argument that "Altix only uses a few drivers so this way we can just
> fix these up rather than make big modifications to large numbers of
> drivers" is bogus. It is far worse even for Altix if you make incompatible
> changes, because you first *break* every driver on your platform, then you
> have to audit and fix them. If you make compatible changes, then you have
> to do exactly the same audits to move them over to the new API, but you go
> from slower->faster rather than broken->non broken. As a bonus, you haven't
> got random broken stuff all over the tree that you forgot to audit.

I agree, but afaik the only change Altix ended up forcing on people was 
mmiowb(), but that turned out to be necessary on mips64 (and maybe some other 
platforms?) anyway.

> I don't know how there is still so much debate about this :(
>
> I have a proposal: I am a neutral party here, not being an arch maintainer,
> so I'll take input and write up a backward compatible API specification
> and force everybody to conform to it ;)

Aside from the obvious performance impact of making all the readX/writeX 
routines strongly ordered, both in terms of PCI posting and cacheable vs. 
uncacheable accesses, it also makes things inconsistent.  Both core code & 
drivers will still have to worry about regular, cacheable memory barriers for 
correctness, but it looks like you're proposing that they not have to think 
about I/O ordering.

At any rate, I don't think anyone would argue against defining the ordering 
semantics of all of these routines (btw you should also include ordering wrt 
DMA & PCI posting); the question is what's the best balance between keeping 
the driver requirements simple and the performance cost on complex arches.

Jesse

  parent reply	other threads:[~2008-06-03 16:59 UTC|newest]

Thread overview: 160+ 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
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 [this message]
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
2008-05-27 23:48           ` [PATCH V2] [POWERPC] Improve (in|out)_[bl]eXX() " 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=200806030952.10360.jbarnes@virtuousgeek.org \
    --to=jbarnes@virtuousgeek.org \
    --cc=alan@lxorguk.ukuu.org.uk \
    --cc=arjan@infradead.org \
    --cc=davem@davemloft.net \
    --cc=jeremy@sgi.com \
    --cc=jes@sgi.com \
    --cc=linux-arch@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linuxppc-dev@ozlabs.org \
    --cc=nickpiggin@yahoo.com.au \
    --cc=rdreier@cisco.com \
    --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;
as well as URLs for NNTP newsgroup(s).