From: arnd@arndb.de (Arnd Bergmann)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH] USB: ehci: use packed, aligned(4) instead of removing the packed attribute
Date: Wed, 29 Jun 2011 12:56:27 +0200 [thread overview]
Message-ID: <201106291256.27746.arnd@arndb.de> (raw)
In-Reply-To: <alpine.LFD.2.00.1106261027070.2142@xanadu.home>
On Tuesday 28 June 2011, Nicolas Pitre wrote:
> On Sat, 25 Jun 2011, Arnd Bergmann wrote:
>
> > On Saturday 25 June 2011, Nicolas Pitre wrote:
> > > > which means that the dma_buf variable is dereferenced before the
> > > > volatile mmio_reg variable, which opens up a race: An interrupt may have
> > > > signalled us that a DMA is in progress, so we read a MMIO register from
> > > > the device (this is guaranteed to flush the DMA on PCI and similar buses).
> > > > If we read the dma_buf before we read the mmio register, the data we get
> > > > back may be stale.
> > > >
> > > > Adding a barrier() between the two turns the assembly into the expected
> > > >
> > > > ldr r3, [r1, #0]
> > > > ldr r0, [r0, #0]
> > > > bx lr
> > >
> > > But isn't the usual dma_unmap_*() API call providing that barrier
> > > already?
> >
> > Yes, for the streaming mapping that would be sufficient, but not
> > for a coherent mapping, which doesn't need dma_unmap_* or dma_sync*
> > calls before accessing the buffer.
>
> OK, so that leaves only that case. Obviously that must not be all that
> critical in practice given the time it has been "broken" already.
It's not all that critical for a number reasons:
* In many cases, the compiler does not actually reorder the accesses,
even if it is allowed to. Whether it does or not depends a lot on
the toolchain version and compiler flags.
* Even if the code is reordered, the race is very small, and in a lot
of cases the data will already be there anyway.
* Most drivers that rely on the ordering guarantees of readl() are
probably for PCI hardware, which explicitly defines its interface
in these terms. Most ARM implementations nowadays don't have PCI,
or are used with a very limited set of PCI hardware.
None of these however mean that we shouldn't try to fix the problem.
I'm also not convinced that the case I constructed is the only one
that is broken now or in the future, as gcc is adding more
optimizations. Even if I was not able to construct a case where
memory accesses are reorganized around a writel() in practice,
I think it's clear that the compiler is allowed to do it in the
current definition (without a wmb()), while the PCI driver API
assumes that there is a barrier.
> So I'm wondering if this might be a better idea to augment the API with
> explicit barriers to cover the case above which is still a much less
> frequent pattern than successive readl()/writel()'s where the implicit
> memory barrier is really badly affecting the generated code.
Didn't we just introduce the _relaxed() variants specifically to avoid
the extra barriers? Surely the effect of the outer_flush() for writel
on modern cores must be much more severe than the memory barrier
implied by it.
I think the best solution would be to have a set of architecture-
independent I/O accessors that do not observe strict PCI ordering
rules of iowrite32 and writel but instead put that in the hands of
the driver writer.
This can be either the writel_relaxed() family we have on arm
and sh, or out_le32 as on m68k, microblaze, powerpc and extensa,
or something new.
We should probably also define a variant that is native-endian,
to provide a replacement for the __raw_writel family.
Arnd
next prev parent reply other threads:[~2011-06-29 10:56 UTC|newest]
Thread overview: 64+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-04-27 14:34 [PATCH] echi: remove structure packing from ehci_def Rabin Vincent
2011-04-27 15:15 ` Sergei Shtylyov
2011-04-27 15:37 ` [PATCHv2] " Rabin Vincent
2011-06-16 16:17 ` [PATCH] USB: ehci: use packed, aligned(4) instead of removing the packed attribute Alexander Holler
2011-06-16 17:09 ` [PATCH] USB: ehci: use packed,aligned(4) " Alan Stern
2011-06-16 17:55 ` [PATCH] USB: ehci: use packed, aligned(4) " Arnd Bergmann
2011-06-16 19:25 ` [PATCH] USB: ehci: use packed,aligned(4) " Alexander Holler
2011-06-16 19:46 ` Alan Stern
2011-06-16 20:10 ` Alexander Holler
2011-06-16 20:20 ` [PATCH] USB: ehci: use packed, aligned(4) " Arnd Bergmann
2011-06-19 15:02 ` Nicolas Pitre
2011-06-19 19:00 ` [PATCH] USB: ehci: use packed,aligned(4) " Alan Stern
2011-06-19 20:02 ` [PATCH] USB: ehci: use packed, aligned(4) " Arnd Bergmann
2011-06-19 20:11 ` Arnd Bergmann
2011-06-19 21:39 ` Nicolas Pitre
2011-06-19 21:27 ` Nicolas Pitre
2011-06-20 15:03 ` [PATCH] USB: ehci: use packed,aligned(4) " Alan Stern
2011-06-20 16:16 ` [PATCH] USB: ehci: use packed, aligned(4) " Nicolas Pitre
2011-06-20 16:48 ` [PATCH] USB: ehci: use packed,aligned(4) " Alan Stern
2011-06-20 16:58 ` [PATCH] USB: ehci: use packed, aligned(4) " Arnd Bergmann
2011-06-20 19:02 ` Russell King - ARM Linux
2011-06-20 19:20 ` Nicolas Pitre
2011-06-20 19:29 ` Nicolas Pitre
2011-06-20 17:10 ` Nicolas Pitre
2011-06-20 17:35 ` [PATCH] USB: ehci: use packed,aligned(4) " Alan Stern
2011-06-20 18:48 ` Russell King - ARM Linux
2011-06-20 20:26 ` [PATCH] USB: ehci: use packed, aligned(4) " Arnd Bergmann
2011-06-20 20:50 ` Nicolas Pitre
2011-06-20 20:55 ` [PATCH] USB: ehci: use packed,aligned(4) " Russell King - ARM Linux
2011-06-20 21:23 ` [PATCH] USB: ehci: use packed, aligned(4) " Arnd Bergmann
2011-06-20 22:23 ` Nicolas Pitre
2011-06-21 11:25 ` Arnd Bergmann
2011-06-25 1:25 ` Nicolas Pitre
2011-06-25 8:09 ` Arnd Bergmann
2011-06-28 18:51 ` Nicolas Pitre
2011-06-29 10:56 ` Arnd Bergmann [this message]
2011-06-20 19:14 ` Nicolas Pitre
2011-06-20 19:32 ` Russell King - ARM Linux
2011-06-20 20:14 ` Arnd Bergmann
2011-06-20 20:42 ` [PATCH] USB: ehci: use packed,aligned(4) " Alan Stern
2011-06-20 22:36 ` [PATCH] USB: ehci: use packed, aligned(4) " Nicolas Pitre
2011-06-21 15:06 ` [PATCH] USB: ehci: use packed,aligned(4) " Alan Stern
2011-06-20 17:39 ` Alexander Holler
2011-06-20 18:39 ` Alan Stern
2011-06-20 18:46 ` Alexander Holler
2011-06-20 18:57 ` Alan Stern
2011-06-20 19:56 ` [PATCH] USB: ehci: use packed, aligned(4) " Nicolas Pitre
2011-06-20 21:04 ` [PATCH] USB: ehci: use packed,aligned(4) " Alan Stern
2011-06-20 22:31 ` [PATCH] USB: ehci: use packed, aligned(4) " Nicolas Pitre
2011-06-21 14:58 ` [PATCH] USB: ehci: use packed,aligned(4) " Alan Stern
2011-06-21 20:41 ` [PATCH] USB: ehci: use packed, aligned(4) " Nicolas Pitre
2011-06-22 6:23 ` [PATCH] USB: ehci: use packed,aligned(4) " Alexander Holler
2011-06-20 20:09 ` [PATCH] USB: ehci: use packed, aligned(4) " Arnd Bergmann
2011-06-20 21:05 ` [PATCH] USB: ehci: use packed,aligned(4) " Alan Stern
2011-06-20 20:07 ` [PATCH] USB: ehci: use packed, aligned(4) " Arnd Bergmann
2011-06-20 20:28 ` Nicolas Pitre
2011-06-20 20:39 ` Arnd Bergmann
2011-06-20 21:03 ` Nicolas Pitre
2011-06-23 9:47 ` Alexander Holler
2011-06-23 14:25 ` Alan Stern
2011-06-24 11:40 ` Alexander Holler
2011-06-20 16:26 ` Arnd Bergmann
2011-06-16 20:30 ` [PATCH] USB: ehci: use packed,aligned(4) " Alan Stern
2011-06-16 18:16 ` Alexander Holler
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=201106291256.27746.arnd@arndb.de \
--to=arnd@arndb.de \
--cc=linux-arm-kernel@lists.infradead.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;
as well as URLs for NNTP newsgroup(s).