[PATCH] USB: fix deadlock in HCD code

Previous message: [thread] [date] [author]
Next message: [thread] [date] [author]
From: Jiri Kosina
Date: Wednesday, May 21, 2008 - 5:09 am

hcd_urb_list_lock is used for synchronization between IRQ and non-IRQ 
contexts, so the non-IRQ context has to disable IRQs in order to prevent 
deadlocking with IRQ context.

Signed-off-by: Jiri Kosina <jkosina@suse.cz>

 drivers/usb/core/hcd.c |   10 ++++++----
 1 files changed, 6 insertions(+), 4 deletions(-)

diff --git a/drivers/usb/core/hcd.c b/drivers/usb/core/hcd.c
index bf10e9c..19279ed 100644
--- a/drivers/usb/core/hcd.c
+++ b/drivers/usb/core/hcd.c
@@ -1000,8 +1000,9 @@ EXPORT_SYMBOL_GPL(usb_calc_bus_time);
 int usb_hcd_link_urb_to_ep(struct usb_hcd *hcd, struct urb *urb)
 {
 	int		rc = 0;
+	unsigned long flags;
 
-	spin_lock(&hcd_urb_list_lock);
+	spin_lock_irqsave(&hcd_urb_list_lock, flags);
 
 	/* Check that the URB isn't being killed */
 	if (unlikely(urb->reject)) {
@@ -1034,7 +1035,7 @@ int usb_hcd_link_urb_to_ep(struct usb_hcd *hcd, struct urb *urb)
 		goto done;
 	}
  done:
-	spin_unlock(&hcd_urb_list_lock);
+	spin_unlock_irqrestore(&hcd_urb_list_lock, flags);
 	return rc;
 }
 EXPORT_SYMBOL_GPL(usb_hcd_link_urb_to_ep);
@@ -1106,10 +1107,11 @@ EXPORT_SYMBOL_GPL(usb_hcd_check_unlink_urb);
  */
 void usb_hcd_unlink_urb_from_ep(struct usb_hcd *hcd, struct urb *urb)
 {
+	unsigned long flags;
 	/* clear all state linking urb to this dev (and hcd) */
-	spin_lock(&hcd_urb_list_lock);
+	spin_lock_irqsave(&hcd_urb_list_lock, flags);
 	list_del_init(&urb->urb_list);
-	spin_unlock(&hcd_urb_list_lock);
+	spin_unlock_irqrestore(&hcd_urb_list_lock, flags);
 }
 EXPORT_SYMBOL_GPL(usb_hcd_unlink_urb_from_ep);

--
Previous message: [thread] [date] [author]
Next message: [thread] [date] [author]

Messages in current thread:
[PATCH] USB: fix deadlock in HCD code, Jiri Kosina, (Wed May 21, 5:09 am)
Re: [PATCH] USB: fix deadlock in HCD code, Oliver Neukum, (Wed May 21, 6:21 am)
Re: [PATCH] USB: fix deadlock in HCD code, Jiri Kosina, (Wed May 21, 6:27 am)
Re: [PATCH] USB: fix deadlock in HCD code, Oliver Neukum, (Wed May 21, 6:32 am)
Re: [PATCH] USB: fix deadlock in HCD code, Jiri Kosina, (Wed May 21, 6:36 am)
Re: [PATCH] USB: fix deadlock in HCD code, Oliver Neukum, (Wed May 21, 6:40 am)
Re: [PATCH] USB: fix deadlock in HCD code, Oliver Neukum, (Wed May 21, 6:47 am)
Re: [PATCH] USB: fix deadlock in HCD code, Alan Stern, (Wed May 21, 7:13 am)
Re: [PATCH] USB: fix deadlock in HCD code, Jiri Kosina, (Wed May 21, 7:22 am)
Re: [PATCH] USB: fix deadlock in HCD code, David Vrabel, (Wed May 21, 7:29 am)
Re: [PATCH] USB: fix deadlock in HCD code, Oliver Neukum, (Wed May 21, 7:31 am)
Re: [PATCH] USB: fix deadlock in HCD code, Alan Stern, (Wed May 21, 7:42 am)
Re: [PATCH] USB: fix deadlock in HCD code, Alan Stern, (Wed May 21, 7:46 am)
Re: [PATCH] USB: fix deadlock in HCD code, David Vrabel, (Wed May 21, 7:53 am)
Re: [PATCH] USB: fix deadlock in HCD code, Alan Stern, (Wed May 21, 7:58 am)
Re: [PATCH] USB: fix deadlock in HCD code, Leonardo Chiquitto, (Wed May 21, 12:32 pm)
Re: [PATCH] USB: fix deadlock in HCD code, Oliver Neukum, (Wed May 21, 1:03 pm)
Re: [PATCH] USB: fix deadlock in HCD code, Peter Zijlstra, (Wed May 21, 3:26 pm)