| From: Sebastian Andrzej Siewior <bigeasy@linutronix.de> |
| Date: Fri, 8 Nov 2013 17:34:54 +0100 |
| Subject: usb: do no disable interrupts in giveback |
| |
| Since commit 94dfd7ed ("USB: HCD: support giveback of URB in tasklet |
| context") the USB code disables interrupts before invoking the complete |
| callback. |
| This should not be required the HCD completes the URBs either in hard-irq |
| context or in BH context. Lockdep may report false positives if one has two |
| HCDs (one completes in IRQ and the other in BH context) and is using the same |
| USB driver (device) with both HCDs. This is safe since the same URBs are never |
| mixed with those two HCDs. |
| Longeterm we should force all HCDs to complete in the same context. |
| |
| Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de> |
| --- |
| drivers/usb/core/hcd.c | 3 --- |
| 1 file changed, 3 deletions(-) |
| |
| --- a/drivers/usb/core/hcd.c |
| +++ b/drivers/usb/core/hcd.c |
| @@ -1736,7 +1736,6 @@ static void __usb_hcd_giveback_urb(struc |
| struct usb_hcd *hcd = bus_to_hcd(urb->dev->bus); |
| struct usb_anchor *anchor = urb->anchor; |
| int status = urb->unlinked; |
| - unsigned long flags; |
| |
| urb->hcpriv = NULL; |
| if (unlikely((urb->transfer_flags & URB_SHORT_NOT_OK) && |
| @@ -1764,9 +1763,7 @@ static void __usb_hcd_giveback_urb(struc |
| * and no one may trigger the above deadlock situation when |
| * running complete() in tasklet. |
| */ |
| - local_irq_save(flags); |
| urb->complete(urb); |
| - local_irq_restore(flags); |
| |
| usb_anchor_resume_wakeups(anchor); |
| atomic_dec(&urb->use_count); |