@@ -1745,6 +1745,7 @@ struct xhci_command *xhci_alloc_command_with_ctx(struct xhci_hcd *xhci,
void xhci_urb_free_priv(struct urb_priv *urb_priv)
{
+ WARN_ONCE(1, "xhci private data should be managed by urb");
kfree(urb_priv);
}
@@ -821,7 +821,6 @@ static void xhci_giveback_urb_in_irq(struct xhci_hcd *xhci,
struct xhci_td *cur_td, int status)
{
struct urb *urb = cur_td->urb;
- struct urb_priv *urb_priv = urb->hcpriv;
struct usb_hcd *hcd = bus_to_hcd(urb->dev->bus);
if (usb_pipetype(urb->pipe) == PIPE_ISOCHRONOUS) {
@@ -831,7 +830,7 @@ static void xhci_giveback_urb_in_irq(struct xhci_hcd *xhci,
usb_amd_quirk_pll_enable();
}
}
- xhci_urb_free_priv(urb_priv);
+ urb_free_hcpriv(urb);
usb_hcd_unlink_urb_from_ep(hcd, urb);
trace_xhci_urb_giveback(urb);
usb_hcd_giveback_urb(hcd, urb, status);
@@ -1552,7 +1552,7 @@ static int xhci_urb_enqueue(struct usb_hcd *hcd, struct urb *urb, gfp_t mem_flag
else
num_tds = 1;
- urb_priv = kzalloc(struct_size(urb_priv, td, num_tds), mem_flags);
+ urb_priv = urb_hcpriv_mempool_zalloc(urb, struct_size(urb_priv, td, num_tds), mem_flags);
if (!urb_priv)
return -ENOMEM;
@@ -1626,8 +1626,7 @@ static int xhci_urb_enqueue(struct usb_hcd *hcd, struct urb *urb, gfp_t mem_flag
if (ret) {
free_priv:
- xhci_urb_free_priv(urb_priv);
- urb->hcpriv = NULL;
+ urb_free_hcpriv(urb);
}
spin_unlock_irqrestore(&xhci->lock, flags);
return ret;
@@ -1789,8 +1788,7 @@ static int xhci_urb_dequeue(struct usb_hcd *hcd, struct urb *urb, int status)
return ret;
err_giveback:
- if (urb_priv)
- xhci_urb_free_priv(urb_priv);
+ urb_free_hcpriv(urb);
usb_hcd_unlink_urb_from_ep(hcd, urb);
spin_unlock_irqrestore(&xhci->lock, flags);
usb_hcd_giveback_urb(hcd, urb, -ESHUTDOWN);
--- Changes since v2: 1. WARN when xhci_urb_free_priv is called somehow. --- xhci keeps alloc/free private data for each enqueue/dequeue cycles, when using a USB webcam, allocation rate is ~250/s; when using a USB mic, allocation rate reaches ~1k/s; The more usb device in use, the higher allocation rate. URB objects have longer lifecycle than private data, hand over ownership of private data to urb can save lots of memory allocations over time. Signed-off-by: David Wang <00107082@163.com> --- drivers/usb/host/xhci-mem.c | 1 + drivers/usb/host/xhci-ring.c | 3 +-- drivers/usb/host/xhci.c | 8 +++----- 3 files changed, 5 insertions(+), 7 deletions(-)