[Precise PATCH] USB: Fix 'bad dma' problem on WDM device disconnect
Herton Ronaldo Krzesinski
herton.krzesinski at canonical.com
Thu Dec 13 16:23:28 UTC 2012
On Thu, Dec 13, 2012 at 11:10:43PM +0800, Ming Lei wrote:
> On Thu, Dec 13, 2012 at 10:34 PM, Leann Ogasawara
> <leann.ogasawara at canonical.com> wrote:
> >> commit 7a55df4694e1758a7a1c3b1432e36fca0c859d6a
> >> Author: Bjørn Mork <bjorn at mork.no>
> >> Date: Mon Jan 16 15:11:59 2012 +0100
> >>
> >> USB: cdc-wdm: better allocate a buffer that is at least as big as
> >> we tell the USB core
> >
> > I'm still a little confused... The above patch is also already in
> > Precise. We pulled it in via upstream stable.
>
> Yes, that is just the problem because it is the patch which causes
> the 'bad dma' error in LP1081879 and coherent memory leak.
>
> The patch should have done the change in both allocation and free,
> but it only did it in allocation.
Hi Ming, I remember sawing a bug in one of my 'patch pilot' duties which
seems related to your problem. It's this one:
https://bugs.launchpad.net/ubuntu/+source/linux/+bug/1074157
The problem is that commit cafbe85fb0d00d32988905c4978df433ca9b6512
changed the usb_alloc_coherent call but not the usb_free_coherent calls
as you also noted. The problem is that upstream changed the allocation
on the driver right after commit cafbe85fb0d, not using anymore the
usb_*_coherent functions, and there is no upstream change to
cherry-pick.
At least precise (3.2 based kernels), need this change because of having commit
cafbe85fb0d00d32988905c4978df433ca9b6512:
diff --git a/drivers/usb/class/cdc-wdm.c b/drivers/usb/class/cdc-wdm.c
index 9aaed0d..97b2c55 100644
--- a/drivers/usb/class/cdc-wdm.c
+++ b/drivers/usb/class/cdc-wdm.c
@@ -301,7 +301,7 @@ static void cleanup(struct wdm_device *desc)
desc->sbuf,
desc->validity->transfer_dma);
usb_free_coherent(interface_to_usbdev(desc->intf),
- desc->bMaxPacketSize0,
+ desc->wMaxCommand,
desc->inbuf,
desc->response->transfer_dma);
kfree(desc->orq);
@@ -788,7 +788,7 @@ out:
err3:
usb_set_intfdata(intf, NULL);
usb_free_coherent(interface_to_usbdev(desc->intf),
- desc->bMaxPacketSize0,
+ desc->wMaxCommand,
desc->inbuf,
desc->response->transfer_dma);
err2:
I think this will be worth may be a special exception for stable, but
meanwhile if you could test the diff and confirm I could send it as a
SAUCE patch for Precise (and Oneiric if it's affected too).
>
> Thanks,
> --
> Ming Lei
>
> --
> kernel-team mailing list
> kernel-team at lists.ubuntu.com
> https://lists.ubuntu.com/mailman/listinfo/kernel-team
>
--
[]'s
Herton
More information about the kernel-team
mailing list