USB: xhci: Use GFP_ATOMIC while holding spinlocks.
The xHCI functions to queue an URB onto the hardware rings must be called with the xhci spinlock held. Those functions will allocate memory, and take a gfp_t memory flags argument. We must pass them the GFP_ATOMIC flag, since we don't want the memory allocation to attempt to sleep while waiting for more memory to become available. 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:
committed by
Greg Kroah-Hartman
parent
a1587d97ce
commit
b11069f5f6
@@ -601,10 +601,13 @@ int xhci_urb_enqueue(struct usb_hcd *hcd, struct urb *urb, gfp_t mem_flags)
|
|||||||
goto exit;
|
goto exit;
|
||||||
}
|
}
|
||||||
if (usb_endpoint_xfer_control(&urb->ep->desc))
|
if (usb_endpoint_xfer_control(&urb->ep->desc))
|
||||||
ret = xhci_queue_ctrl_tx(xhci, mem_flags, urb,
|
/* We have a spinlock and interrupts disabled, so we must pass
|
||||||
|
* atomic context to this function, which may allocate memory.
|
||||||
|
*/
|
||||||
|
ret = xhci_queue_ctrl_tx(xhci, GFP_ATOMIC, urb,
|
||||||
slot_id, ep_index);
|
slot_id, ep_index);
|
||||||
else if (usb_endpoint_xfer_bulk(&urb->ep->desc))
|
else if (usb_endpoint_xfer_bulk(&urb->ep->desc))
|
||||||
ret = xhci_queue_bulk_tx(xhci, mem_flags, urb,
|
ret = xhci_queue_bulk_tx(xhci, GFP_ATOMIC, urb,
|
||||||
slot_id, ep_index);
|
slot_id, ep_index);
|
||||||
else
|
else
|
||||||
ret = -EINVAL;
|
ret = -EINVAL;
|
||||||
|
Reference in New Issue
Block a user