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: Mon, 20 Jun 2011 23:23:49 +0200 [thread overview]
Message-ID: <201106202323.49513.arnd@arndb.de> (raw)
In-Reply-To: <20110620205559.GM26089@n2100.arm.linux.org.uk>
On Monday 20 June 2011 22:55:59 Russell King - ARM Linux wrote:
> On Mon, Jun 20, 2011 at 10:26:37PM +0200, Arnd Bergmann wrote:
> > * We already need a compiler barrier in the non-_relaxed() versions of
> > the I/O accessors, which will force a reload of the base address
> > in a lot of cases, so the code is already suboptimal. Yes, we don't
> > have the barrier today without CONFIG_ARM_DMA_MEM_BUFFERABLE, but that
> > is a bug, because it lets the compiler move accesses to DMA buffers
> > around readl/writel.
>
> You're now being obtuse there. You don't need compiler barriers to
> guarantee order - that's what volatile does there.
>
A simple counterexample:
int f(volatile unsigned long *v)
{
unsigned long a[2], ret;
a[0] = 1; /* initialize our DMA buffer */
a[1] = 2;
*v = (unsigned long)a; /* pass the address to the device, start DMA */
ret = *v; /* flush DMA by reading from mmio */
return ret + a[1]; /* return accumulated status from readl and from modified
DMA buffer */
}
arm-linux-gnueabi-gcc -Wall -O2 test.c -S
Without a barrier, the stores into the DMA buffer before the start are
lost, as is the load from the modified DMA buffer:
sub sp, sp, #8
add r3, sp, #0
str r3, [r0, #0]
ldr r0, [r0, #0]
adds r0, r0, #2
add sp, sp, #8
bx lr
Adding a memory clobber to the volatile dereference turns this into the
expected output:
sub sp, sp, #8
movs r3, #2
movs r2, #1
stmia sp, {r2, r3}
add r3, sp, #0
str r3, [r0, #0]
ldr r0, [r0, #0]
ldr r3, [sp, #4]
adds r0, r0, r3
add sp, sp, #8
bx lr
Now, the dma buffer is written before the volatile access, and read out
again afterwards.
Arnd
WARNING: multiple messages have this Message-ID (diff)
From: Arnd Bergmann <arnd@arndb.de>
To: "Russell King - ARM Linux" <linux@arm.linux.org.uk>
Cc: linux-arm-kernel@lists.infradead.org,
Alan Stern <stern@rowland.harvard.edu>,
linux-usb@vger.kernel.org, Nicolas Pitre <nico@fluxnic.net>,
gregkh@suse.de, lkml <linux-kernel@vger.kernel.org>,
Rabin Vincent <rabin@rab.in>,
Alexander Holler <holler@ahsoftware.de>
Subject: Re: [PATCH] USB: ehci: use packed,aligned(4) instead of removing the packed attribute
Date: Mon, 20 Jun 2011 23:23:49 +0200 [thread overview]
Message-ID: <201106202323.49513.arnd@arndb.de> (raw)
In-Reply-To: <20110620205559.GM26089@n2100.arm.linux.org.uk>
On Monday 20 June 2011 22:55:59 Russell King - ARM Linux wrote:
> On Mon, Jun 20, 2011 at 10:26:37PM +0200, Arnd Bergmann wrote:
> > * We already need a compiler barrier in the non-_relaxed() versions of
> > the I/O accessors, which will force a reload of the base address
> > in a lot of cases, so the code is already suboptimal. Yes, we don't
> > have the barrier today without CONFIG_ARM_DMA_MEM_BUFFERABLE, but that
> > is a bug, because it lets the compiler move accesses to DMA buffers
> > around readl/writel.
>
> You're now being obtuse there. You don't need compiler barriers to
> guarantee order - that's what volatile does there.
>
A simple counterexample:
int f(volatile unsigned long *v)
{
unsigned long a[2], ret;
a[0] = 1; /* initialize our DMA buffer */
a[1] = 2;
*v = (unsigned long)a; /* pass the address to the device, start DMA */
ret = *v; /* flush DMA by reading from mmio */
return ret + a[1]; /* return accumulated status from readl and from modified
DMA buffer */
}
arm-linux-gnueabi-gcc -Wall -O2 test.c -S
Without a barrier, the stores into the DMA buffer before the start are
lost, as is the load from the modified DMA buffer:
sub sp, sp, #8
add r3, sp, #0
str r3, [r0, #0]
ldr r0, [r0, #0]
adds r0, r0, #2
add sp, sp, #8
bx lr
Adding a memory clobber to the volatile dereference turns this into the
expected output:
sub sp, sp, #8
movs r3, #2
movs r2, #1
stmia sp, {r2, r3}
add r3, sp, #0
str r3, [r0, #0]
ldr r0, [r0, #0]
ldr r3, [sp, #4]
adds r0, r0, r3
add sp, sp, #8
bx lr
Now, the dma buffer is written before the volatile access, and read out
again afterwards.
Arnd
next prev parent reply other threads:[~2011-06-20 21:23 UTC|newest]
Thread overview: 124+ 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 14:34 ` Rabin Vincent
2011-04-27 15:15 ` Sergei Shtylyov
2011-04-27 15:15 ` Sergei Shtylyov
2011-04-27 15:37 ` [PATCHv2] " Rabin Vincent
2011-04-27 15:37 ` 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 16:17 ` [PATCH] USB: ehci: use packed,aligned(4) " Alexander Holler
2011-06-16 17:09 ` Alan Stern
2011-06-16 17:09 ` Alan Stern
2011-06-16 17:55 ` [PATCH] USB: ehci: use packed, aligned(4) " Arnd Bergmann
2011-06-16 17:55 ` [PATCH] USB: ehci: use packed,aligned(4) " Arnd Bergmann
2011-06-16 19:25 ` Alexander Holler
2011-06-16 19:25 ` Alexander Holler
2011-06-16 19:46 ` Alan Stern
2011-06-16 19:46 ` Alan Stern
2011-06-16 20:10 ` Alexander Holler
2011-06-16 20:10 ` Alexander Holler
2011-06-16 20:20 ` [PATCH] USB: ehci: use packed, aligned(4) " Arnd Bergmann
2011-06-16 20:20 ` [PATCH] USB: ehci: use packed,aligned(4) " Arnd Bergmann
2011-06-19 15:02 ` [PATCH] USB: ehci: use packed, aligned(4) " Nicolas Pitre
2011-06-19 15:02 ` [PATCH] USB: ehci: use packed,aligned(4) " Nicolas Pitre
2011-06-19 19:00 ` Alan Stern
2011-06-19 19:00 ` Alan Stern
2011-06-19 20:02 ` [PATCH] USB: ehci: use packed, aligned(4) " Arnd Bergmann
2011-06-19 20:02 ` [PATCH] USB: ehci: use packed,aligned(4) " Arnd Bergmann
2011-06-19 20:11 ` [PATCH] USB: ehci: use packed, aligned(4) " Arnd Bergmann
2011-06-19 20:11 ` [PATCH] USB: ehci: use packed,aligned(4) " Arnd Bergmann
2011-06-19 21:39 ` [PATCH] USB: ehci: use packed, aligned(4) " Nicolas Pitre
2011-06-19 21:39 ` [PATCH] USB: ehci: use packed,aligned(4) " Nicolas Pitre
2011-06-19 21:27 ` [PATCH] USB: ehci: use packed, aligned(4) " Nicolas Pitre
2011-06-19 21:27 ` [PATCH] USB: ehci: use packed,aligned(4) " Nicolas Pitre
2011-06-20 15:03 ` Alan Stern
2011-06-20 15:03 ` Alan Stern
2011-06-20 16:16 ` [PATCH] USB: ehci: use packed, aligned(4) " Nicolas Pitre
2011-06-20 16:16 ` [PATCH] USB: ehci: use packed,aligned(4) " Nicolas Pitre
2011-06-20 16:48 ` Alan Stern
2011-06-20 16:48 ` Alan Stern
2011-06-20 16:58 ` [PATCH] USB: ehci: use packed, aligned(4) " Arnd Bergmann
2011-06-20 16:58 ` [PATCH] USB: ehci: use packed,aligned(4) " Arnd Bergmann
2011-06-20 19:02 ` [PATCH] USB: ehci: use packed, aligned(4) " Russell King - ARM Linux
2011-06-20 19:02 ` Russell King - ARM Linux
2011-06-20 19:20 ` Nicolas Pitre
2011-06-20 19:20 ` Nicolas Pitre
2011-06-20 19:29 ` Nicolas Pitre
2011-06-20 19:29 ` Nicolas Pitre
2011-06-20 17:10 ` Nicolas Pitre
2011-06-20 17:10 ` [PATCH] USB: ehci: use packed,aligned(4) " Nicolas Pitre
2011-06-20 17:35 ` Alan Stern
2011-06-20 17:35 ` Alan Stern
2011-06-20 18:48 ` Russell King - ARM Linux
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:26 ` [PATCH] USB: ehci: use packed,aligned(4) " Arnd Bergmann
2011-06-20 20:50 ` [PATCH] USB: ehci: use packed, aligned(4) " Nicolas Pitre
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 20:55 ` Russell King - ARM Linux
2011-06-20 21:23 ` Arnd Bergmann [this message]
2011-06-20 21:23 ` Arnd Bergmann
2011-06-20 22:23 ` [PATCH] USB: ehci: use packed, aligned(4) " Nicolas Pitre
2011-06-20 22:23 ` [PATCH] USB: ehci: use packed,aligned(4) " Nicolas Pitre
2011-06-21 11:25 ` [PATCH] USB: ehci: use packed, aligned(4) " Arnd Bergmann
2011-06-21 11:25 ` [PATCH] USB: ehci: use packed,aligned(4) " Arnd Bergmann
2011-06-25 1:25 ` [PATCH] USB: ehci: use packed, aligned(4) " Nicolas Pitre
2011-06-25 8:09 ` Arnd Bergmann
2011-06-28 18:51 ` Nicolas Pitre
2011-06-29 10:56 ` Arnd Bergmann
2011-06-20 19:14 ` Nicolas Pitre
2011-06-20 19:14 ` [PATCH] USB: ehci: use packed,aligned(4) " Nicolas Pitre
2011-06-20 19:32 ` [PATCH] USB: ehci: use packed, aligned(4) " Russell King - ARM Linux
2011-06-20 19:32 ` Russell King - ARM Linux
2011-06-20 20:14 ` Arnd Bergmann
2011-06-20 20:14 ` Arnd Bergmann
2011-06-20 20:42 ` [PATCH] USB: ehci: use packed,aligned(4) " Alan Stern
2011-06-20 20:42 ` Alan Stern
2011-06-20 22:36 ` [PATCH] USB: ehci: use packed, aligned(4) " Nicolas Pitre
2011-06-20 22:36 ` [PATCH] USB: ehci: use packed,aligned(4) " Nicolas Pitre
2011-06-21 15:06 ` Alan Stern
2011-06-21 15:06 ` Alan Stern
2011-06-20 17:39 ` Alexander Holler
2011-06-20 17:39 ` Alexander Holler
2011-06-20 18:39 ` Alan Stern
2011-06-20 18:39 ` Alan Stern
2011-06-20 18:46 ` Alexander Holler
2011-06-20 18:46 ` Alexander Holler
2011-06-20 18:57 ` Alan Stern
2011-06-20 18:57 ` Alan Stern
2011-06-20 19:56 ` [PATCH] USB: ehci: use packed, aligned(4) " Nicolas Pitre
2011-06-20 19:56 ` [PATCH] USB: ehci: use packed,aligned(4) " Nicolas Pitre
2011-06-20 21:04 ` Alan Stern
2011-06-20 21:04 ` Alan Stern
2011-06-20 22:31 ` [PATCH] USB: ehci: use packed, aligned(4) " Nicolas Pitre
2011-06-20 22:31 ` [PATCH] USB: ehci: use packed,aligned(4) " Nicolas Pitre
2011-06-21 14:58 ` Alan Stern
2011-06-21 14:58 ` Alan Stern
2011-06-21 20:41 ` [PATCH] USB: ehci: use packed, aligned(4) " Nicolas Pitre
2011-06-21 20:41 ` [PATCH] USB: ehci: use packed,aligned(4) " Nicolas Pitre
2011-06-22 6:23 ` Alexander Holler
2011-06-22 6:23 ` Alexander Holler
2011-06-20 20:09 ` [PATCH] USB: ehci: use packed, aligned(4) " Arnd Bergmann
2011-06-20 20:09 ` [PATCH] USB: ehci: use packed,aligned(4) " Arnd Bergmann
2011-06-20 21:05 ` Alan Stern
2011-06-20 21:05 ` Alan Stern
2011-06-20 20:07 ` [PATCH] USB: ehci: use packed, aligned(4) " Arnd Bergmann
2011-06-20 20:07 ` [PATCH] USB: ehci: use packed,aligned(4) " Arnd Bergmann
2011-06-20 20:28 ` [PATCH] USB: ehci: use packed, aligned(4) " Nicolas Pitre
2011-06-20 20:28 ` [PATCH] USB: ehci: use packed,aligned(4) " Nicolas Pitre
2011-06-20 20:39 ` [PATCH] USB: ehci: use packed, aligned(4) " Arnd Bergmann
2011-06-20 20:39 ` Arnd Bergmann
2011-06-20 21:03 ` Nicolas Pitre
2011-06-20 21:03 ` Nicolas Pitre
2011-06-23 9:47 ` Alexander Holler
2011-06-23 9:47 ` Alexander Holler
2011-06-23 14:25 ` Alan Stern
2011-06-23 14:25 ` Alan Stern
2011-06-24 11:40 ` Alexander Holler
2011-06-24 11:40 ` Alexander Holler
2011-06-20 16:26 ` Arnd Bergmann
2011-06-20 16:26 ` [PATCH] USB: ehci: use packed,aligned(4) " Arnd Bergmann
2011-06-16 20:30 ` Alan Stern
2011-06-16 20:30 ` Alan Stern
2011-06-16 18:16 ` Alexander Holler
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=201106202323.49513.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 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.