[PATCH]: Fix deadlock in USBIP driver (staging), linux-2.6.34-rc5

Previous thread: [PATCH] Documentation/cred.txt: spinlock no longer implies rcu_read_lock by Serge E. Hallyn on Friday, April 23, 2010 - 5:45 pm. (2 messages)

Next thread: [ANNOUNCE] Git 1.7.0.6 by Junio C Hamano on Friday, April 23, 2010 - 6:24 pm. (1 message)
From: Eric Lescouet
Date: Friday, April 23, 2010 - 5:55 pm

Resent with hopefully everything ...

When detaching a port from the client side (usbip --detach 0),
the event thread, on the server side, is going to deadlock.
The "eh" server thread is getting USBIP_EH_RESET event and calls:
  -> stub_device_reset() -> usb_reset_device()
the USB framework is then calling back _in the same "eh" thread_ :
  -> stub_disconnect() -> usbip_stop_eh() -> wait_for_completion()
the "eh" thread is being asleep forever, waiting for its own completion.
This patch checks if "eh" is the current thread, in usbip_stop_eh().

Signed-off-by: Eric Lescouet <eric@lescouet.org>
---

diff -Nur linux-2.6.34-rc5/drivers/staging/usbip/usbip_event.c linux-2.6.34-rc5.new/drivers/staging/usbip/usbip_event.c
--- linux-2.6.34-rc5/drivers/staging/usbip/usbip_event.c	2010-04-20 01:29:56.000000000 +0200
+++ linux-2.6.34-rc5.new/drivers/staging/usbip/usbip_event.c	2010-04-22 19:19:52.997889126 +0200
@@ -117,6 +117,9 @@
 {
 	struct usbip_task *eh = &ud->eh;
 
+	if (eh->thread == current)
+		return; /* do not wait for myself */
+
 	wait_for_completion(&eh->thread_done);
 	usbip_dbg_eh("usbip_eh has finished\n");
 }
--

Previous thread: [PATCH] Documentation/cred.txt: spinlock no longer implies rcu_read_lock by Serge E. Hallyn on Friday, April 23, 2010 - 5:45 pm. (2 messages)

Next thread: [ANNOUNCE] Git 1.7.0.6 by Junio C Hamano on Friday, April 23, 2010 - 6:24 pm. (1 message)