From: rmorell@nvidia.com
To: Alan Stern <stern@rowland.harvard.edu>
Cc: David Brownell <dbrownell@users.sourceforge.net>,
Greg Kroah-Hartman <gregkh@suse.de>,
Benoit Goby <benoit@android.com>,
Sarah Sharp <sarah.a.sharp@linux.intel.com>,
Matthew Wilcox <willy@linux.intel.com>,
Ming Lei <tom.leiming@gmail.com>,
Jacob Pan <jacob.jun.pan@intel.com>,
Oliver Neukum <oliver@neukum.org>,
Olof Johansson <olof@lixom.net>,
Erik Gilling <konkers@android.com>,
Colin Cross <ccross@android.com>,
"linux-usb@vger.kernel.org" <linux-usb@vger.kernel.org>,
"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>,
"linux-tegra@vger.kernel.org" <linux-tegra@vger.kernel.org>
Subject: Re: [PATCH 2/2] USB: ehci: tegra: Align DMA transfers to 32 bytes
Date: Mon, 24 Jan 2011 14:53:23 -0800 [thread overview]
Message-ID: <20110124225323.GA5701@morell.nvidia.com> (raw)
In-Reply-To: <Pine.LNX.4.44L0.1101241132420.2030-100000@iolanthe.rowland.org>
On Mon, Jan 24, 2011 at 08:36:55AM -0800, Alan Stern wrote:
> On Thu, 20 Jan 2011, Robert Morell wrote:
>
> > The Tegra2 USB controller doesn't properly deal with misaligned DMA
> > buffers, causing corruption. This is especially prevalent with USB
> > network adapters, where skbuff alignment is often in the middle of a
> > 4-byte dword.
> >
> > To avoid this, allocate a temporary buffer for the DMA if the provided
> > buffer isn't sufficiently aligned.
> >
> > Signed-off-by: Robert Morell <rmorell@nvidia.com>
> > ---
> > drivers/usb/host/ehci-tegra.c | 92 +++++++++++++++++++++++++++++++++++++++++
> > 1 files changed, 92 insertions(+), 0 deletions(-)
> >
> > diff --git a/drivers/usb/host/ehci-tegra.c b/drivers/usb/host/ehci-tegra.c
> > index 2341904..7cdfc65 100644
> > --- a/drivers/usb/host/ehci-tegra.c
> > +++ b/drivers/usb/host/ehci-tegra.c
> > @@ -32,6 +32,8 @@
> > #define TEGRA_USB_USBMODE_HOST (3 << 0)
> > #define TEGRA_USB_PORTSC1_PTC(x) (((x) & 0xf) << 16)
> >
> > +#define TEGRA_USB_DMA_ALIGN 32
> > +
> > struct tegra_ehci_context {
> > bool valid;
> > u32 command;
> > @@ -461,6 +463,94 @@ static int tegra_ehci_bus_resume(struct usb_hcd *hcd)
> > }
> > #endif
> >
> > +struct temp_buffer {
> > + void *kmalloc_ptr;
> > + void *old_xfer_buffer;
> > + u8 data[0];
> > +};
> > +
> > +static void free_temp_buffer(struct urb *urb, int status)
> > +{
> > + enum dma_data_direction dir;
> > + struct temp_buffer *temp;
> > +
> > + if (!(urb->transfer_flags & URB_ALIGNED_TEMP_BUFFER))
> > + return;
> > +
> > + dir = usb_urb_dir_in(urb) ? DMA_FROM_DEVICE : DMA_TO_DEVICE;
> > +
> > + temp = container_of(urb->transfer_buffer, struct temp_buffer,
> > + data);
> > +
> > + if (dir == DMA_FROM_DEVICE && !status)
> > + memcpy(temp->old_xfer_buffer, temp->data,
> > + urb->transfer_buffer_length);
>
> Even if status is nonzero, there may be valid data in the buffer. You
> should skip that test.
Thanks for looking, Alan. I added that test based on earlier feedback.
I think the big concern here is security: if the URB fails in such a way
that the buffer is not overwritten, then we may copy out freed kernel
data to userspace.
Are there specific status codes that I can check for here? I guess the
only other option is to remove the direction check from the alloc path
or alloc with GFP_ZERO.
Thanks,
Robert
> No other problems that I can see.
>
> Alan Stern
>
>
next prev parent reply other threads:[~2011-01-24 22:53 UTC|newest]
Thread overview: 51+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-12-17 21:58 [RFC] Align tegra-ehci DMA transfers to 32B Robert Morell
2010-12-17 21:58 ` [PATCH 1/2] USB: Add driver hooks for (un)?map_urb_for_dma Robert Morell
2010-12-17 21:58 ` [PATCH 2/2] USB: ehci: tegra: Align DMA transfers to 32 bytes Robert Morell
2010-12-17 22:35 ` Greg KH
2010-12-17 22:42 ` rmorell
2010-12-17 23:09 ` Greg KH
2010-12-17 23:17 ` Oliver Neukum
2010-12-17 23:35 ` Greg KH
2010-12-17 23:50 ` rmorell
2010-12-17 23:40 ` rmorell
2010-12-18 0:37 ` Greg KH
2010-12-18 1:29 ` rmorell
2010-12-17 22:32 ` [RFC] Align tegra-ehci DMA transfers to 32B Greg KH
2010-12-17 22:44 ` rmorell
2010-12-17 23:07 ` Greg KH
2010-12-17 23:07 ` David Brownell
2010-12-18 1:49 ` [PATCH v2] " Robert Morell
2010-12-19 21:38 ` [PATCH] " Robert Morell
2011-01-06 23:20 ` [PATCH v4] " Robert Morell
2011-01-20 21:41 ` [PATCH v5] " Robert Morell
2011-01-27 3:06 ` [PATCH v6] " Robert Morell
2011-01-27 3:06 ` [PATCH 1/3] USB: HCD: Add usb_hcd prefix to exported functions Robert Morell
2011-01-27 16:01 ` Alan Stern
2011-01-27 3:06 ` [PATCH 2/3] USB: HCD: Add driver hooks for (un)?map_urb_for_dma Robert Morell
2011-01-27 16:01 ` Alan Stern
2011-01-27 3:06 ` [PATCH 3/3] USB: ehci: tegra: Align DMA transfers to 32 bytes Robert Morell
2011-02-04 19:49 ` Greg KH
[not found] ` <20110204194954.GA25180-U8xfFu+wG4EAvxtiuMwx3w@public.gmane.org>
2011-02-04 20:14 ` Olof Johansson
2011-02-04 20:14 ` Olof Johansson
[not found] ` <AANLkTinRtch4Pvr3GLz5wZU2xkG3FMJxxzSNAdParA7j-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2011-02-04 20:16 ` Greg KH
2011-02-04 20:16 ` Greg KH
[not found] ` <20110204201616.GA12482-l3A5Bk7waGM@public.gmane.org>
2011-02-04 20:26 ` rmorell-DDmLM1+adcrQT0dZR+AlfA
2011-02-04 20:26 ` rmorell
[not found] ` <20110204202640.GC1744-f3YH7lVHJt/FT5IIyIEb6QC/G2K4zDHf@public.gmane.org>
2011-02-04 20:35 ` Greg KH
2011-02-04 20:35 ` Greg KH
2011-01-20 21:41 ` [PATCH 1/2] USB: HCD: Add driver hooks for (un)?map_urb_for_dma Robert Morell
2011-01-23 3:46 ` Greg KH
2011-01-24 16:32 ` Alan Stern
2011-01-20 21:41 ` [PATCH 2/2] USB: ehci: tegra: Align DMA transfers to 32 bytes Robert Morell
2011-01-24 16:36 ` Alan Stern
2011-01-24 22:53 ` rmorell [this message]
2011-01-25 2:59 ` Alan Stern
2011-01-06 23:20 ` [PATCH v4 1/2] USB: HCD: Add driver hooks for (un)?map_urb_for_dma Robert Morell
2011-01-06 23:20 ` [PATCH v4 2/2] USB: ehci: tegra: Align DMA transfers to 32 bytes Robert Morell
2010-12-19 21:38 ` [PATCH 1/2] USB: Add driver hooks for (un)?map_urb_for_dma Robert Morell
2010-12-19 21:38 ` [PATCH 2/2] USB: ehci: tegra: Align DMA transfers to 32 bytes Robert Morell
2010-12-19 21:57 ` Oliver Neukum
2010-12-18 1:49 ` [PATCH v2 1/2] USB: Add driver hooks for (un)?map_urb_for_dma Robert Morell
2010-12-18 17:51 ` Greg KH
2010-12-18 1:49 ` [PATCH v2 2/2] USB: ehci: tegra: Align DMA transfers to 32 bytes Robert Morell
2010-12-18 17:52 ` Greg KH
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=20110124225323.GA5701@morell.nvidia.com \
--to=rmorell@nvidia.com \
--cc=benoit@android.com \
--cc=ccross@android.com \
--cc=dbrownell@users.sourceforge.net \
--cc=gregkh@suse.de \
--cc=jacob.jun.pan@intel.com \
--cc=konkers@android.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-tegra@vger.kernel.org \
--cc=linux-usb@vger.kernel.org \
--cc=oliver@neukum.org \
--cc=olof@lixom.net \
--cc=sarah.a.sharp@linux.intel.com \
--cc=stern@rowland.harvard.edu \
--cc=tom.leiming@gmail.com \
--cc=willy@linux.intel.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 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.