mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
From: Paul Mackerras <paulus@samba.org>
To: David Howells <dhowells@redhat.com>
Cc: torvalds@osdl.org, akpm@osdl.org, mingo@redhat.com,
	linux-arch@vger.kernel.org, linuxppc64-dev@ozlabs.org,
	linux-kernel@vger.kernel.org
Subject: Re: [PATCH] Document Linux's memory barriers
Date: Thu, 9 Mar 2006 08:49:50 +1100	[thread overview]
Message-ID: <17423.20862.764098.732463@cargo.ozlabs.ibm.com> (raw)
In-Reply-To: <28393.1141823992@warthog.cambridge.redhat.com>

David Howells writes:

> > Enabling/disabling interrupts doesn't imply a barrier on powerpc, and
> > nor does taking an interrupt or returning from one.
> 
> Surely it ought to, otherwise what's to stop accesses done with interrupts
> disabled crossing with accesses done inside an interrupt handler?

The rule that the CPU always sees its own loads and stores in program
order.

If a CPU takes an interrupt after doing some stores, and the interrupt
handler does loads from the same location(s), it has to see the new
values, even if they haven't got to memory yet.  The interrupt isn't
special in this situation; if the instruction stream has a store to a
location followed by a load from it, the load *has* to see the value
stored by the store (assuming no other store to the same location in
the meantime, of course).  That's true whether or not the CPU takes an
exception or interrupt between the store and the load.  Anything else
would make programming really ... um ... interesting. :)

> > > +Either interrupt disablement (LOCK) and enablement (UNLOCK) will barrier
> > ...
> > I don't think this is right, and I don't think it is necessary to
> > achieve the end you state, since a CPU will always see its own memory
> > accesses in program order.
> 
> But what about a driver accessing some memory that its device is going to
> observe under irq disablement, and then getting an interrupt immediately after
> from that same device, the handler for which communicates with the device,
> possibly then being broken because the CPU hasn't completed all the memory
> accesses that the driver made while interrupts are disabled?

Well, we have to be clear about what causes what here.  Is the device
accessing this memory just at a random time, or is the access caused
by (in response to) an MMIO store?  And what causes the interrupt?
Does it just happen to come along at this time or is it in response to
one of the stores?

If the device accesses to memory are in response to an MMIO store,
then the code needs an explicit wmb() between the memory stores and
the MMIO store.  Disabling interrupts isn't going to help here because
the device doesn't see the CPU interrupt enable state.

In general it is possible for the CPU to see a different state of
memory than the device sees.  If the driver needs to be sure that they
both see the same view then it needs to use some sort of
synchronization.  A memory barrier followed by a store to the device,
with no further stores to memory until we have an indication from the
device that it has received the MMIO store, would be a suitable way to
synchronize.  Enabling or disabling interrupts does nothing useful
here because the device doesn't see that.  That applies whether we are
in an interrupt routine or not.

Do you have a specific scenario in mind, with a particular device and
driver?

One thing that driver writers do need to be careful about is that if a
device writes some data to memory and then causes an interrupt, the
fact that the interrupt has reached the CPU and the CPU has invoked
the driver's interrupt routine does *not* mean that the data has got
to memory from the CPU's point of view.  The data could still be
queued up in the PCI host bridge or elsewhere.  Doing an MMIO read
from the device is sufficient to ensure that the CPU will then see the
correct data in memory.

> Alternatively, might it be possible for communications between two CPUs to be
> stuffed because one took an interrupt that also modified common data before
> the it had committed the memory accesses done under interrupt disablement?
> This would suggest using a lock though.

Disabling interrupts doesn't do *anything* to help with communication
between CPUs.  You have to use locks or explicit barriers for that.
It is possible for one CPU to see memory accesses done by another CPU
in a different order from the program order on the CPU that did the
accesses.  That applies whether or not some of the accesses were done
inside an interrupt routine.

> > What does *F+*A mean?
> 
> Combined accesses.

Still opaque, sorry: you mean they both happen in some unspecified
order?

> > Well, the driver should *not* be doing *ADR at all, it should be using
> > read[bwl]/write[bwl].  The architecture code has to implement
> > read*/write* in such a way that the accesses generated can't be
> > reordered.  I _think_ it also has to make sure the write accesses
> > can't be write-combined, but it would be good to have that clarified.
> 
> Than what use mmiowb()?

That was introduced to help some platforms that have difficulty
ensuring that MMIO accesses hit the device in the right order, IIRC.
I'm still not entirely clear on exactly where it's needed or what
guarantees you can rely on if you do or don't use it.

> Surely write combining and out-of-order reads are reasonable for cacheable
> devices like framebuffers.

They are.  read*/write* to non-cacheable non-prefetchable MMIO
shouldn't be reordered or write-combined, but for prefetchable MMIO
I'm not sure whether read*/write* should allow reordering, or whether
drivers should use __raw_read/write* if they want that.  (Of course,
with the __raw_ functions they don't get the endian conversion
either...)

Paul.

  reply	other threads:[~2006-03-08 21:50 UTC|newest]

Thread overview: 105+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2006-03-07 17:40 David Howells
2006-03-07 10:34 ` Andi Kleen
2006-03-07 17:47 ` Stephen Hemminger
2006-03-07 18:30 ` David Howells
2006-03-07 11:13   ` Andi Kleen
2006-03-07 18:46   ` Jesse Barnes
2006-03-07 19:23   ` Bryan O'Sullivan
2006-03-07 11:57     ` Andi Kleen
2006-03-07 20:01       ` Jesse Barnes
2006-03-07 21:14       ` Bryan O'Sullivan
2006-03-07 21:24         ` Andi Kleen
2006-03-08  0:36           ` Alan Cox
2006-03-08  0:35       ` Alan Cox
2006-03-07 19:24   ` David Howells
2006-03-07 19:46     ` Stephen Hemminger
2006-03-07 18:40 ` Alan Cox
2006-03-07 18:54   ` linux-os (Dick Johnson)
2006-03-07 19:06     ` Matthew Wilcox
2006-03-07 19:15       ` linux-os (Dick Johnson)
2006-03-09 11:26         ` Sergei Organov
2006-03-07 19:33     ` Alan Cox
2006-03-07 20:09 ` David Howells
2006-03-08  0:32   ` Alan Cox
2006-03-08  8:25   ` Duncan Sands
2006-03-08 22:06     ` Paul Mackerras
2006-03-08 22:24       ` David S. Miller
2006-03-08 22:31         ` Linus Torvalds
2006-03-08 22:42       ` Alan Cox
2006-03-08  2:07 ` Nick Piggin
2006-03-08  3:10 ` Paul Mackerras
2006-03-08  3:30   ` Linus Torvalds
2006-03-08  7:41   ` Nick Piggin
2006-03-08 12:34   ` David Howells
2006-03-08 16:40     ` Bryan O'Sullivan
2006-03-08 13:19 ` David Howells
2006-03-08 21:49   ` Paul Mackerras [this message]
2006-03-08 22:05     ` Alan Cox
2006-03-10  0:49   ` H. Peter Anvin
2006-03-08 14:37 ` [PATCH] Document Linux's memory barriers [try #2] David Howells
2006-03-08 14:55   ` Alan Cox
2006-03-08 15:41     ` Matthew Wilcox
2006-03-08 17:19     ` David Howells
2006-03-08 22:10       ` Paul Mackerras
2006-03-08 23:08         ` Ivan Kokshaysky
2006-03-09  1:01           ` Paul Mackerras
2006-03-09 16:02             ` Ivan Kokshaysky
2006-03-08 22:01     ` Paul Mackerras
2006-03-08 22:23       ` David S. Miller
2006-03-08 17:04   ` David Howells
2006-03-08 17:36     ` Alan Cox
2006-03-08 18:35     ` David Howells
2006-03-08 18:45       ` Alan Cox
2006-03-08 18:59       ` David Howells
2006-03-08 11:38         ` Andi Kleen
2006-03-08 19:08       ` David Howells
2006-03-08 19:26         ` Linus Torvalds
2006-03-08 19:40           ` Matthew Wilcox
2006-03-09  0:37             ` Paul Mackerras
2006-03-09  0:59               ` Jesse Barnes
2006-03-09  1:36                 ` Paul Mackerras
2006-03-09  4:18                   ` Jesse Barnes
2006-03-08 19:54           ` Jesse Barnes
2006-03-08 20:02           ` Alan Cox
2006-03-08 19:31         ` David Howells
2006-03-09  0:35           ` Paul Mackerras
2006-03-09  0:54             ` Linus Torvalds
2006-03-09  1:08               ` Paul Mackerras
2006-03-09  1:27                 ` Linus Torvalds
2006-03-09  2:38                   ` Nick Piggin
2006-03-09  3:45                   ` Paul Mackerras
2006-03-09  4:36                     ` Jesse Barnes
2006-03-09  7:41                       ` Paul Mackerras
2006-03-09  5:38                     ` Linus Torvalds
2006-03-09 11:44                     ` Michael Buesch
2006-03-09 12:27                     ` David Howells
2006-03-09  4:34                   ` Jesse Barnes
2006-03-09  4:43                     ` Paul Mackerras
2006-03-09 10:05                       ` Jes Sorensen
2006-03-09  0:55             ` Jesse Barnes
2006-03-09  1:57               ` Paul Mackerras
2006-03-09  4:26                 ` Jesse Barnes
2006-03-09 12:02   ` Sergei Organov
2006-03-08 16:18 ` [PATCH] Document Linux's memory barriers Pavel Machek
2006-03-08 16:26 ` Christoph Lameter
2006-03-08 17:35 ` David Howells
2006-03-08 17:46   ` Christoph Lameter
2006-03-08 17:59     ` Alan Cox
2006-03-08 19:37 ` [PATCH] Document Linux's memory barriers [try #3] David Howells
2006-03-08 20:16 ` [PATCH] Document Linux's memory barriers David Howells
2006-03-08 22:01   ` Alan Cox
2006-03-09 11:41   ` David Howells
2006-03-09 12:28     ` Alan Cox
2006-03-09 13:02     ` David Howells
2006-03-09 16:32     ` Linus Torvalds
2006-03-09 17:39     ` David Howells
2006-03-09 17:54       ` Linus Torvalds
2006-03-09 17:56         ` Linus Torvalds
2006-03-09 14:01 ` [PATCH] Document Linux's memory barriers [try #3] David Howells
2006-03-07 23:17 [PATCH] Document Linux's memory barriers Chuck Ebbert
2006-03-08  0:15 ` David S. Miller
2006-03-08  0:24 ` Roberto Nibali
     [not found] <5NONi-2hp-3@gated-at.bofh.it>
     [not found] ` <5NOtZ-1FO-27@gated-at.bofh.it>
     [not found]   ` <5NPgs-2Rw-37@gated-at.bofh.it>
     [not found]     ` <5NPq4-34a-23@gated-at.bofh.it>
2006-03-08  0:22       ` Robert Hancock
     [not found] ` <5NQ2U-462-29@gated-at.bofh.it>
     [not found]   ` <5NRLg-6LJ-31@gated-at.bofh.it>
     [not found]     ` <5NRUR-6Yo-11@gated-at.bofh.it>
     [not found]       ` <5NUSF-30Z-5@gated-at.bofh.it>
2006-03-08  1:10         ` Robert Hancock
2006-03-08 11:35           ` Alan Cox
2006-03-08 14:55           ` Andi Kleen

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=17423.20862.764098.732463@cargo.ozlabs.ibm.com \
    --to=paulus@samba.org \
    --cc=akpm@osdl.org \
    --cc=dhowells@redhat.com \
    --cc=linux-arch@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linuxppc64-dev@ozlabs.org \
    --cc=mingo@redhat.com \
    --cc=torvalds@osdl.org \
    /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®