Re: [PATCH] USB: fix resource leak in xhci power loss path

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Thu, May 10, 2012 at 04:55:16PM +0200, Oliver Neukum wrote:
> From 01f1001ffc02b6f0b8e104a88183f2692d7e1fb3 Mon Sep 17 00:00:00 2001
> From: Oliver Neukum <oliver@xxxxxxxxxx>
> Date: Thu, 10 May 2012 10:19:21 +0200
> Subject: [PATCH] USB: fix resource leak in xhci power loss path
> 
> SOme more data structures must be freed and counters
> reset if an XHCI controller has lost power. The failure
> to do so renders some chips inoperative after a certain number
> of S4 cycles.
> 
> Signed-off-by: Oliver Neukum <oneukum@xxxxxxx>
> ---
>  drivers/usb/host/xhci-mem.c |   26 ++++++++++++++++++++++++++
>  1 files changed, 26 insertions(+), 0 deletions(-)
> 
> Hi Sarah,
> 
> does this fix all the resource leaks you were concerned about?

I think this is sufficient, but let me refresh my memory about the BW
code and get back to you.

I actually found another potential resource leak yesterday, so I'm going
to send a separate patch for that.

Sarah Sharp

> diff --git a/drivers/usb/host/xhci-mem.c b/drivers/usb/host/xhci-mem.c
> index 68eaa90..6e208dd 100644
> --- a/drivers/usb/host/xhci-mem.c
> +++ b/drivers/usb/host/xhci-mem.c
> @@ -1791,6 +1791,14 @@ void xhci_mem_cleanup(struct xhci_hcd *xhci)
>  {
>  	struct pci_dev	*pdev = to_pci_dev(xhci_to_hcd(xhci)->self.controller);
>  	struct dev_info	*dev_info, *next;
> +	struct list_head *tt_list_head;
> +	struct list_head *tt;
> +	struct list_head *endpoints;
> +	struct list_head *ep, *q;
> +	struct xhci_tt_bw_info *tt_info;
> +	struct xhci_interval_bw_table *bwt;
> +	struct xhci_virt_ep *virt_ep;
> +
>  	unsigned long	flags;
>  	int size;
>  	int i;
> @@ -1849,8 +1857,26 @@ void xhci_mem_cleanup(struct xhci_hcd *xhci)
>  	}
>  	spin_unlock_irqrestore(&xhci->lock, flags);
>  
> +	bwt = &xhci->rh_bw->bw_table;
> +	for (i = 0; i < XHCI_MAX_INTERVAL; i++) {
> +		endpoints = &bwt->interval_bw[i].endpoints;
> +		list_for_each_safe(ep, q, endpoints) {
> +			virt_ep = list_entry(ep, struct xhci_virt_ep, bw_endpoint_list);
> +			list_del(&virt_ep->bw_endpoint_list);
> +			kfree(virt_ep);
> +		}
> +	}
> +
> +	tt_list_head = &xhci->rh_bw->tts;
> +	list_for_each_safe(tt, q, tt_list_head) {
> +		tt_info = list_entry(tt, struct xhci_tt_bw_info, tt_list);
> +		list_del(tt);
> +		kfree(tt_info);
> +        }
> +
>  	xhci->num_usb2_ports = 0;
>  	xhci->num_usb3_ports = 0;
> +	xhci->num_active_eps = 0;
>  	kfree(xhci->usb2_ports);
>  	kfree(xhci->usb3_ports);
>  	kfree(xhci->port_array);
> -- 
> 1.7.1
> 
> --
> To unsubscribe from this list: send the line "unsubscribe linux-usb" in
> the body of a message to majordomo@xxxxxxxxxxxxxxx
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[Index of Archives]     [Linux Media]     [Linux Input]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [Old Linux USB Devel Archive]

  Powered by Linux