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