lkml.org 
[lkml]   [2011]   [Jun]   [1]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[115/146] xhci: Fix memory leak bug when dropping endpoints
    2.6.38-stable review patch.  If anyone has any objections, please let us know.

    ------------------

    From: Sarah Sharp <sarah.a.sharp@linux.intel.com>

    commit 834cb0fc4712a3b21c6b8c5cb55bd13607191311 upstream.

    When the USB core wants to change to an alternate interface setting that
    doesn't include an active endpoint, or de-configuring the device, the xHCI
    driver needs to issue a Configure Endpoint command to tell the host to
    drop some endpoints from the schedule. After the command completes, the
    xHCI driver needs to free rings for any endpoints that were dropped.

    Unfortunately, the xHCI driver wasn't actually freeing the endpoint rings
    for dropped endpoints. The rings would be freed if the endpoint's
    information was simply changed (and a new ring was installed), but dropped
    endpoints never had their rings freed. This caused errors when the ring
    segment DMA pool was freed when the xHCI driver was unloaded:

    [ 5582.883995] xhci_hcd 0000:06:00.0: dma_pool_destroy xHCI ring segments, ffff88003371d000 busy
    [ 5582.884002] xhci_hcd 0000:06:00.0: dma_pool_destroy xHCI ring segments, ffff880033716000 busy
    [ 5582.884011] xhci_hcd 0000:06:00.0: dma_pool_destroy xHCI ring segments, ffff880033455000 busy
    [ 5582.884018] xhci_hcd 0000:06:00.0: Freed segment pool
    [ 5582.884026] xhci_hcd 0000:06:00.0: Freed device context pool
    [ 5582.884033] xhci_hcd 0000:06:00.0: Freed small stream array pool
    [ 5582.884038] xhci_hcd 0000:06:00.0: Freed medium stream array pool
    [ 5582.884048] xhci_hcd 0000:06:00.0: xhci_stop completed - status = 1
    [ 5582.884061] xhci_hcd 0000:06:00.0: USB bus 3 deregistered
    [ 5582.884193] xhci_hcd 0000:06:00.0: PCI INT A disabled

    Fix this issue and free endpoint rings when their endpoints are
    successfully dropped.

    This patch should be backported to kernels as old as 2.6.31.

    Signed-off-by: Sarah Sharp <sarah.a.sharp@linux.intel.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>

    ---
    drivers/usb/host/xhci.c | 11 ++++++++++-
    1 file changed, 10 insertions(+), 1 deletion(-)

    --- a/drivers/usb/host/xhci.c
    +++ b/drivers/usb/host/xhci.c
    @@ -1636,8 +1636,17 @@ int xhci_check_bandwidth(struct usb_hcd
    xhci_dbg_ctx(xhci, virt_dev->out_ctx,
    LAST_CTX_TO_EP_NUM(slot_ctx->dev_info));

    + /* Free any rings that were dropped, but not changed. */
    + for (i = 1; i < 31; ++i) {
    + if ((ctrl_ctx->drop_flags & (1 << (i + 1))) &&
    + !(ctrl_ctx->add_flags & (1 << (i + 1))))
    + xhci_free_or_cache_endpoint_ring(xhci, virt_dev, i);
    + }
    xhci_zero_in_ctx(xhci, virt_dev);
    - /* Install new rings and free or cache any old rings */
    + /*
    + * Install any rings for completely new endpoints or changed endpoints,
    + * and free or cache any old rings from changed endpoints.
    + */
    for (i = 1; i < 31; ++i) {
    if (!virt_dev->eps[i].new_ring)
    continue;



    \
     
     \ /
      Last update: 2011-06-01 10:21    [W:5.014 / U:0.008 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site