xHCI: refine td allocation
In xhci_urb_enqueue(), allocate a block of memory for all the TDs instead of allocating memory for each of them separately. This reduces the number of kzalloc calling when an isochronous usb is submitted. Signed-off-by: Andiry Xu <andiry.xu@amd.com> Signed-off-by: Sarah Sharp <sarah.a.sharp@linux.intel.com> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
This commit is contained in:
parent
fd984d242a
commit
2ffdea25f0
2 changed files with 12 additions and 17 deletions
|
@ -1666,18 +1666,10 @@ struct xhci_command *xhci_alloc_command(struct xhci_hcd *xhci,
|
|||
|
||||
void xhci_urb_free_priv(struct xhci_hcd *xhci, struct urb_priv *urb_priv)
|
||||
{
|
||||
int last;
|
||||
|
||||
if (!urb_priv)
|
||||
return;
|
||||
|
||||
last = urb_priv->length - 1;
|
||||
if (last >= 0) {
|
||||
int i;
|
||||
for (i = 0; i <= last; i++)
|
||||
kfree(urb_priv->td[i]);
|
||||
if (urb_priv) {
|
||||
kfree(urb_priv->td[0]);
|
||||
kfree(urb_priv);
|
||||
}
|
||||
kfree(urb_priv);
|
||||
}
|
||||
|
||||
void xhci_free_command(struct xhci_hcd *xhci,
|
||||
|
|
|
@ -1035,6 +1035,7 @@ static int xhci_check_maxpacket(struct xhci_hcd *xhci, unsigned int slot_id,
|
|||
int xhci_urb_enqueue(struct usb_hcd *hcd, struct urb *urb, gfp_t mem_flags)
|
||||
{
|
||||
struct xhci_hcd *xhci = hcd_to_xhci(hcd);
|
||||
struct xhci_td *buffer;
|
||||
unsigned long flags;
|
||||
int ret = 0;
|
||||
unsigned int slot_id, ep_index;
|
||||
|
@ -1065,13 +1066,15 @@ int xhci_urb_enqueue(struct usb_hcd *hcd, struct urb *urb, gfp_t mem_flags)
|
|||
if (!urb_priv)
|
||||
return -ENOMEM;
|
||||
|
||||
buffer = kzalloc(size * sizeof(struct xhci_td), mem_flags);
|
||||
if (!buffer) {
|
||||
kfree(urb_priv);
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
for (i = 0; i < size; i++) {
|
||||
urb_priv->td[i] = kzalloc(sizeof(struct xhci_td), mem_flags);
|
||||
if (!urb_priv->td[i]) {
|
||||
urb_priv->length = i;
|
||||
xhci_urb_free_priv(xhci, urb_priv);
|
||||
return -ENOMEM;
|
||||
}
|
||||
urb_priv->td[i] = buffer;
|
||||
buffer++;
|
||||
}
|
||||
|
||||
urb_priv->length = size;
|
||||
|
|
Loading…
Reference in a new issue