All of lore.kernel.org
 help / color / mirror / Atom feed
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

  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.