]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
usb: wusbcore: remove excessive irqsave
authorJohn Ogness <john.ogness@linutronix.de>
Sun, 24 Jun 2018 22:08:41 +0000 (00:08 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 28 Jun 2018 10:36:06 +0000 (19:36 +0900)
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: John Ogness <john.ogness@linutronix.de>
Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/usb/wusbcore/wa-xfer.c

index 7fca4e7e556d31e7dcbbb11f2857e9ae47d075d3..01f2f21830c0e93887d95aa5bde38261b63d5883 100644 (file)
@@ -1918,7 +1918,7 @@ EXPORT_SYMBOL_GPL(wa_urb_enqueue);
  */
 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_seg *seg;
        struct wa_rpipe *rpipe;
@@ -1964,10 +1964,10 @@ int wa_urb_dequeue(struct wahc *wa, struct urb *urb, int status)
                goto out_unlock;
        }
        /* 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)
                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 */
                goto out_unlock;        /* setup(), enqueue_b() completes */
        /* 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)
 
 dequeue_delayed:
        list_del_init(&xfer->list_node);
-       spin_unlock_irqrestore(&wa->xfer_list_lock, flags2);
+       spin_unlock(&wa->xfer_list_lock);
        xfer->result = urb->status;
        spin_unlock_irqrestore(&xfer->lock, flags);
        wa_xfer_giveback(xfer);