USB HCD: avoid duplicate local_irq_disable()
authorAlan Stern <stern@rowland.harvard.edu>
Wed, 21 Nov 2007 23:13:10 +0000 (15:13 -0800)
committerGreg Kroah-Hartman <gregkh@suse.de>
Wed, 28 Nov 2007 21:58:35 +0000 (13:58 -0800)
Arnd Bergmann wrote:

usb_hcd_flush_endpoint() has a retry loop that starts with a spin_lock_irq(),
but only gives up the spinlock, not the irq_disable before jumping to the
rescan label.

Alan Stern:

I agree with your sentiment, but it would be better to solve this
problem without using local_irq_disable().

Signed-off-by: Alan Stern <stern@rowland.harvard.edu>
Cc: Arnd Bergmann <arnd@arndb.de>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
drivers/usb/core/hcd.c

index fea8256a18d6e1a99c01872a25e99ac3354f3f7c..d5ed3fa9e304b5d76b859b31203ab6bb866a3aa1 100644 (file)
@@ -1311,8 +1311,8 @@ void usb_hcd_flush_endpoint(struct usb_device *udev,
        hcd = bus_to_hcd(udev->bus);
 
        /* No more submits can occur */
-rescan:
        spin_lock_irq(&hcd_urb_list_lock);
+rescan:
        list_for_each_entry (urb, &ep->urb_list, urb_list) {
                int     is_in;
 
@@ -1345,6 +1345,7 @@ rescan:
                usb_put_urb (urb);
 
                /* list contents may have changed */
+               spin_lock(&hcd_urb_list_lock);
                goto rescan;
        }
        spin_unlock_irq(&hcd_urb_list_lock);