Commit 7375fc9f authored by John Ogness's avatar John Ogness Committed by Greg Kroah-Hartman

usb: wusbcore: remove excessive irqsave

wa_urb_dequeue() locks multiple spinlocks while disabling interrupts:

   spin_lock_irqsave(&lock1, flags);
   spin_lock_irqsave(&lock2, flags2);

Obviously there is no need for the second irqsave and "flags2" variable
since interrupts are disabled at that point. Remove the second irqsave:

   spin_lock_irqsave(&lock1, flags);
   spin_lock(&lock2);

and eliminate the flags2 variable.
Signed-off-by: default avatarJohn Ogness <john.ogness@linutronix.de>
Signed-off-by: default avatarSebastian Andrzej Siewior <bigeasy@linutronix.de>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 8982c844
...@@ -1918,7 +1918,7 @@ EXPORT_SYMBOL_GPL(wa_urb_enqueue); ...@@ -1918,7 +1918,7 @@ EXPORT_SYMBOL_GPL(wa_urb_enqueue);
*/ */
int wa_urb_dequeue(struct wahc *wa, struct urb *urb, int status) int wa_urb_dequeue(struct wahc *wa, struct urb *urb, int status)
{ {
unsigned long flags, flags2; unsigned long flags;
struct wa_xfer *xfer; struct wa_xfer *xfer;
struct wa_seg *seg; struct wa_seg *seg;
struct wa_rpipe *rpipe; struct wa_rpipe *rpipe;
...@@ -1964,10 +1964,10 @@ int wa_urb_dequeue(struct wahc *wa, struct urb *urb, int status) ...@@ -1964,10 +1964,10 @@ int wa_urb_dequeue(struct wahc *wa, struct urb *urb, int status)
goto out_unlock; goto out_unlock;
} }
/* Check the delayed list -> if there, release and complete */ /* Check the delayed list -> if there, release and complete */
spin_lock_irqsave(&wa->xfer_list_lock, flags2); spin_lock(&wa->xfer_list_lock);
if (!list_empty(&xfer->list_node) && xfer->seg == NULL) if (!list_empty(&xfer->list_node) && xfer->seg == NULL)
goto dequeue_delayed; goto dequeue_delayed;
spin_unlock_irqrestore(&wa->xfer_list_lock, flags2); spin_unlock(&wa->xfer_list_lock);
if (xfer->seg == NULL) /* still hasn't reached */ if (xfer->seg == NULL) /* still hasn't reached */
goto out_unlock; /* setup(), enqueue_b() completes */ goto out_unlock; /* setup(), enqueue_b() completes */
/* Ok, the xfer is in flight already, it's been setup and submitted.*/ /* Ok, the xfer is in flight already, it's been setup and submitted.*/
...@@ -2054,7 +2054,7 @@ int wa_urb_dequeue(struct wahc *wa, struct urb *urb, int status) ...@@ -2054,7 +2054,7 @@ int wa_urb_dequeue(struct wahc *wa, struct urb *urb, int status)
dequeue_delayed: dequeue_delayed:
list_del_init(&xfer->list_node); list_del_init(&xfer->list_node);
spin_unlock_irqrestore(&wa->xfer_list_lock, flags2); spin_unlock(&wa->xfer_list_lock);
xfer->result = urb->status; xfer->result = urb->status;
spin_unlock_irqrestore(&xfer->lock, flags); spin_unlock_irqrestore(&xfer->lock, flags);
wa_xfer_giveback(xfer); wa_xfer_giveback(xfer);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment