linux/drivers/usb/host
Soeren Moch 85ecd0322b USB: EHCI: fix bug in iTD/siTD DMA pool allocation
[Description written by Alan Stern]

Soeren tracked down a very difficult bug in ehci-hcd's DMA pool
management of iTD and siTD structures.  Some background: ehci-hcd
gives each isochronous endpoint its own set of active and free itd's
(or sitd's for full-speed devices).  When a new itd is needed, it is
taken from the head of the free list, if possible.  However, itd's
must not be used twice in a single frame because the hardware
continues to access the data structure for the entire duration of a
frame.  Therefore if the itd at the head of the free list has its
"frame" member equal to the current value of ehci->now_frame, it
cannot be reused and instead a new itd is allocated from the DMA pool.
The entries on the free list are not released back to the pool until
the endpoint is no longer in use.

The bug arises from the fact that sometimes an itd can be moved back
onto the free list before itd->frame has been set properly.  In
Soeren's case, this happened because ehci-hcd can allocate one more
itd than it actually needs for an URB; the extra itd may or may not be
required depending on how the transfer aligns with a frame boundary.
For example, an URB with 8 isochronous packets will cause two itd's to
be allocated.  If the URB is scheduled to start in microframe 3 of
frame N then it will require both itds: one for microframes 3 - 7 of
frame N and one for microframes 0 - 2 of frame N+1.  But if the URB
had been scheduled to start in microframe 0 then it would require only
the first itd, which could cover microframes 0 - 7 of frame N.  The
second itd would be returned to the end of the free list.

The itd allocation routine initializes the entire structure to 0, so
the extra itd ends up on the free list with itd->frame set to 0
instead of a meaningful value.  After a while the itd reaches the head
of the list, and occasionally this happens when ehci->now_frame is
equal to 0.  Then, even though it would be okay to reuse this itd, the
driver thinks it must get another itd from the DMA pool.

For as long as the isochronous endpoint remains in use, this flaw in
the mechanism causes more and more itd's to be taken slowly from the
DMA pool.  Since none are released back, the pool eventually becomes
exhausted.

This reuslts in memory allocation failures, which typically show up
during a long-running audio stream.  Video might suffer the same
effect.

The fix is very simple.  To prevent allocations from the pool when
they aren't needed, make sure that itd's sent back to the free list
prematurely have itd->frame set to an invalid value which can never be
equal to ehci->now_frame.

This should be applied to -stable kernels going back to 3.6.

Signed-off-by: Soeren Moch <smoch@web.de>
Signed-off-by: Alan Stern <stern@rowland.harvard.edu>
Cc: stable <stable@vger.kernel.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
2013-03-25 13:59:04 -07:00
..
whci USB: whci-hcd: fix NULL dereference on allocation failure 2012-08-15 15:17:39 -07:00
bcma-hcd.c usb: remove use of __devexit 2012-11-21 13:27:17 -08:00
ehci-atmel.c usb: Convert to devm_ioremap_resource() 2013-01-22 11:41:58 -08:00
ehci-dbg.c USB: EHCI: remove unused Link Power Management code 2012-10-31 12:48:07 -07:00
ehci-fsl.c USB: ehci-fsl: fix regression on mpc5121e 2013-01-11 16:01:07 -08:00
ehci-fsl.h powerpc/usb: fix bug of CPU hang when missing USB PHY clock 2012-09-05 16:52:08 -07:00
ehci-grlib.c usb: Convert to devm_ioremap_resource() 2013-01-22 11:41:58 -08:00
ehci-hcd.c USB: EHCI: fix regression during bus resume 2013-03-15 12:07:53 -07:00
ehci-hub.c USB: EHCI: fix regression during bus resume 2013-03-15 12:07:53 -07:00
ehci-mem.c USB: EHCI: use hrtimer for (s)iTD deallocation 2012-07-16 16:54:25 -07:00
ehci-msm.c usb: remove use of __devexit 2012-11-21 13:27:17 -08:00
ehci-mv.c usb: gadget: patches for v3.9 merge window 2013-01-25 09:08:05 -08:00
ehci-mxc.c USB patches for 3.9-rc1 2013-02-21 12:20:00 -08:00
ehci-octeon.c USB: EHCI: remove ehci_port_power() routine 2012-10-31 12:48:07 -07:00
ehci-omap.c This is the MFD pull request for the 3.9 merge window. 2013-02-24 20:00:58 -08:00
ehci-orion.c Revert "USB: EHCI: make ehci-orion a separate driver" 2013-02-20 10:25:44 -08:00
ehci-pci.c USB: ehci: make debug port in-use detection functional again 2013-01-07 10:34:33 -08:00
ehci-platform.c usb: Convert to devm_ioremap_resource() 2013-01-22 11:41:58 -08:00
ehci-pmcmsp.c USB: EHCI: remove ehci_port_power() routine 2012-10-31 12:48:07 -07:00
ehci-ppc-of.c usb: Convert to devm_ioremap_resource() 2013-01-22 11:41:58 -08:00
ehci-ps3.c usb: remove use of __devinit 2012-11-21 13:27:16 -08:00
ehci-q.c USB: EHCI: fix regression during bus resume 2013-03-15 12:07:53 -07:00
ehci-s5p.c usb: xceiv: patches for v3.9 merge window 2013-01-25 09:09:46 -08:00
ehci-sched.c USB: EHCI: fix bug in iTD/siTD DMA pool allocation 2013-03-25 13:59:04 -07:00
ehci-sead3.c usb: Convert to devm_ioremap_resource() 2013-01-22 11:41:58 -08:00
ehci-sh.c usb: Convert to devm_ioremap_resource() 2013-01-22 11:41:58 -08:00
ehci-spear.c usb: remove use of __devinitdata 2012-11-21 13:27:16 -08:00
ehci-sysfs.c
ehci-tegra.c usb: host: tegra: make use of PHY pointer of HCD 2013-01-28 11:42:11 -07:00
ehci-tilegx.c usb: add host support for the tilegx architecture 2012-07-18 16:40:29 -04:00
ehci-timer.c USB: EHCI: fix regression in QH unlinking 2013-03-20 16:17:22 -07:00
ehci-vt8500.c Revert "USB: EHCI: make ehci-vt8500 a separate driver" 2013-02-20 10:26:31 -08:00
ehci-w90x900.c usb: remove use of __devexit 2012-11-21 13:27:17 -08:00
ehci-xilinx-of.c usb: Convert to devm_ioremap_resource() 2013-01-22 11:41:58 -08:00
ehci.h USB: EHCI: add a name for the platform-private field 2013-01-22 09:22:13 -08:00
fhci-dbg.c USB: FHCI: Reusing QUICC Engine USB Controller registers from immap_qe.h 2012-06-26 19:42:11 -07:00
fhci-hcd.c usb: remove use of __devexit 2012-11-21 13:27:17 -08:00
fhci-hub.c USB: FHCI: Reusing QUICC Engine USB Controller registers from immap_qe.h 2012-06-26 19:42:11 -07:00
fhci-mem.c
fhci-q.c
fhci-sched.c USB: FHCI: use list_move_tail instead of list_del/list_add_tail 2012-09-05 16:55:18 -07:00
fhci-tds.c USB: FHCI: Reusing QUICC Engine USB Controller registers from immap_qe.h 2012-06-26 19:42:11 -07:00
fhci.h USB: FHCI: Reusing QUICC Engine USB Controller registers from immap_qe.h 2012-06-26 19:42:11 -07:00
fsl-mph-dr-of.c USB: fsl-mph-dr-of: fix regression on mpc5121e 2013-01-11 16:01:06 -08:00
hwa-hc.c
imx21-dbg.c
imx21-hcd.c usb: imx21-hcd: Include missing linux/module.h 2013-01-11 12:01:09 -08:00
imx21-hcd.h ARM: imx: move platform_data definitions 2012-09-14 11:17:21 +02:00
isp116x-hcd.c usb: remove use of __devinit 2012-11-21 13:27:16 -08:00
isp116x.h
isp1362-hcd.c usb: remove use of __devexit 2012-11-21 13:27:17 -08:00
isp1362.h
isp1760-hcd.c usb/isp1760: declare schedule_ptds() and errata2_function() static 2013-01-30 00:17:38 -05:00
isp1760-hcd.h
isp1760-if.c usb: remove use of __devexit 2012-11-21 13:27:17 -08:00
Kconfig Revert "USB: EHCI: make ehci-vt8500 a separate driver" 2013-02-20 10:26:31 -08:00
Makefile Revert "USB: EHCI: make ehci-vt8500 a separate driver" 2013-02-20 10:26:31 -08:00
octeon2-common.c
ohci-at91.c ARM: arm-soc: Header cleanups 2012-12-12 11:45:16 -08:00
ohci-da8xx.c ARM: davinci: move platform_data definitions 2012-09-14 11:16:54 +02:00
ohci-dbg.c USB: ohci-dbg.c: remove dbg() usage 2012-05-01 21:33:37 -07:00
ohci-ep93xx.c usb: remove use of __devinit 2012-11-21 13:27:16 -08:00
ohci-exynos.c usb: xceiv: patches for v3.9 merge window 2013-01-25 09:09:46 -08:00
ohci-hcd.c USB: OHCI: remove Alchemy OHCI platform driver. 2012-10-22 11:29:12 -07:00
ohci-hub.c USB: ohci: merge ohci_finish_controller_resume with ohci_resume 2012-10-22 11:23:59 -07:00
ohci-jz4740.c usb: remove use of __devexit 2012-11-21 13:27:17 -08:00
ohci-mem.c
ohci-nxp.c usb: Convert to devm_ioremap_resource() 2013-01-22 11:41:58 -08:00
ohci-octeon.c usb: remove use of __devinit 2012-11-21 13:27:16 -08:00
ohci-omap3.c ARM: arm-soc: Header cleanups 2012-12-12 11:45:16 -08:00
ohci-omap.c ARM: arm-soc: Header cleanups 2012-12-12 11:45:16 -08:00
ohci-pci.c usb: remove use of __devinit 2012-11-21 13:27:16 -08:00
ohci-platform.c usb: Convert to devm_ioremap_resource() 2013-01-22 11:41:58 -08:00
ohci-ppc-of.c usb: remove use of __devinit 2012-11-21 13:27:16 -08:00
ohci-ps3.c usb: remove use of __devinit 2012-11-21 13:27:16 -08:00
ohci-pxa27x.c usb: remove use of __devinit 2012-11-21 13:27:16 -08:00
ohci-q.c USB: ohci: set urb->hcpriv = NULL immediately, after free it 2013-01-11 16:03:38 -08:00
ohci-s3c2410.c usb: Convert to devm_ioremap_resource() 2013-01-22 11:41:58 -08:00
ohci-sa1111.c usb: remove use of __devinit 2012-11-21 13:27:16 -08:00
ohci-sm501.c USB: OHCI: sm501: fix build failure after ohci_finish_controller_resume removal 2012-10-23 10:18:53 -07:00
ohci-spear.c usb: remove use of __devinitdata 2012-11-21 13:27:16 -08:00
ohci-tilegx.c usb: add host support for the tilegx architecture 2012-07-18 16:40:29 -04:00
ohci-tmio.c usb: host: ohci-tmio: fix compile warning 2013-01-11 16:22:53 -08:00
ohci.h USB: move transceiver from ehci_hcd and ohci_hcd to hcd and rename it as phy 2012-06-13 12:38:36 -07:00
oxu210hp-hcd.c USB: oxu210hp-hcd.c: remove dbg() usage 2012-05-01 21:33:43 -07:00
oxu210hp.h
pci-quirks.c usb: Prevent dead ports when xhci is not enabled 2013-01-24 09:56:19 -08:00
pci-quirks.h usb: host: xhci: fix compilation error for non-PCI based stacks 2012-09-05 12:26:11 -07:00
r8a66597-hcd.c usb: remove use of __devexit 2012-11-21 13:27:17 -08:00
r8a66597.h usb/host/r8a66597: remove conditional compilation of clk code 2012-07-30 17:25:12 -07:00
sl811_cs.c
sl811-hcd.c usb: remove use of __devexit 2012-11-21 13:27:17 -08:00
sl811.h
ssb-hcd.c usb: remove use of __devexit 2012-11-21 13:27:17 -08:00
u132-hcd.c usb: remove use of __devexit 2012-11-21 13:27:17 -08:00
uhci-debug.c USB: uhci: beautify source code 2013-01-24 13:59:26 -08:00
uhci-grlib.c usb: remove use of __devinit 2012-11-21 13:27:16 -08:00
uhci-hcd.c Merge 3.8-rc5 into usb-next 2013-01-25 12:41:02 -08:00
uhci-hcd.h USB: UHCI: remove unused definition 2013-01-24 13:42:09 -08:00
uhci-hub.c Merge usb-linus branch into usb-next 2013-02-08 12:03:11 -08:00
uhci-pci.c
uhci-platform.c usb: remove use of __devinit 2012-11-21 13:27:16 -08:00
uhci-q.c USB: uhci: check buffer length to avoid memory overflow 2013-01-24 13:42:09 -08:00
xhci-dbg.c xhci: trivial: Remove assigned but unused slot_ctx. 2012-10-25 13:13:48 -07:00
xhci-ext-caps.h xHCI: Correct the #define XHCI_LEGACY_DISABLE_SMI 2012-04-11 08:31:06 -07:00
xhci-hub.c xhci: Avoid "dead ports", add roothub port polling. 2013-01-03 14:10:29 -08:00
xhci-mem.c xhci: Handle HS bulk/ctrl endpoints that don't NAK. 2013-01-03 14:09:55 -08:00
xhci-pci.c usb: host: xhci: move HC_STATE_SUSPENDED check to xhci_suspend() 2012-11-12 11:45:34 -08:00
xhci-plat.c usb: host: xhci-plat: use ioremap_nocache 2012-09-05 12:07:19 -07:00
xhci-ring.c Merge usb-linus branch into usb-next 2013-02-08 12:03:11 -08:00
xhci.c USB: xhci: correctly enable interrupts 2013-03-15 12:07:53 -07:00
xhci.h USB: xhci - fix bit definitions for IMAN register 2013-03-18 08:25:13 -07:00