[patch 35/46] USB: gadget: cdc-acm deadlock fix

Previous message: [thread] [date] [author]
Next message: [thread] [date] [author]
From: Greg KH
Date: Monday, November 17, 2008 - 12:16 am

2.6.27-stable review patch.  If anyone has any objections, please let us know.

------------------

From: David Brownell <dbrownell@users.sourceforge.net>

commit e50ae572b33646656fa7037541613834dcadedfb upstream.

This fixes a deadlock appearing with some USB peripheral drivers
when running CDC ACM gadget code.

The newish (2.6.27) CDC ACM event notification mechanism sends
messages (IN to the host) which are short enough to fit in most
FIFOs.  That means that with some peripheral controller drivers
(evidently not the ones used to verify the notification code!!)
the completion callback can be issued before queue() returns.

The deadlock would come because the completion callback and the
event-issuing code shared a spinlock.  Fix is trivial:  drop
that lock while queueing the message.

Signed-off-by: David Brownell <dbrownell@users.sourceforge.net>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>

---
 drivers/usb/gadget/f_acm.c |    4 ++++
 1 file changed, 4 insertions(+)

--- a/drivers/usb/gadget/f_acm.c
+++ b/drivers/usb/gadget/f_acm.c
@@ -463,7 +463,11 @@ static int acm_cdc_notify(struct f_acm *
 	notify->wLength = cpu_to_le16(length);
 	memcpy(buf, data, length);
 
+	/* ep_queue() can complete immediately if it fills the fifo... */
+	spin_unlock(&acm->lock);
 	status = usb_ep_queue(ep, req, GFP_ATOMIC);
+	spin_lock(&acm->lock);
+
 	if (status < 0) {
 		ERROR(acm->port.func.config->cdev,
 				"acm ttyGS%d can't notify serial state, %d\n",

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

Messages in current thread:
[patch 00/46] 2.6.27.7-stable review, Greg KH, (Mon Nov 17, 12:13 am)
[patch 14/46] rtl8187: Add Abocom USB ID, Greg KH, (Mon Nov 17, 12:15 am)
[patch 21/46] r8169: select MII in Kconfig, Greg KH, (Mon Nov 17, 12:15 am)
[patch 26/46] S390: cpu topology: fix locking, Greg KH, (Mon Nov 17, 12:15 am)
[patch 35/46] USB: gadget: cdc-acm deadlock fix, Greg KH, (Mon Nov 17, 12:16 am)
[patch 37/46] USB: Fix PS3 USB shutdown problems, Greg KH, (Mon Nov 17, 12:16 am)
[patch 39/46] USB: EHCI: fix divide-by-zero bug, Greg KH, (Mon Nov 17, 12:16 am)
[patch 42/46] ACPI: EC: revert msleep patch, Greg KH, (Mon Nov 17, 12:17 am)
[patch 43/46] ACPI: EC: wait for last write gpe, Greg KH, (Mon Nov 17, 12:17 am)
[patch 44/46] ACPI: EC: restart failed command, Greg KH, (Mon Nov 17, 12:17 am)
Re: [patch 25/46] V4L/DVB (9624): CVE-2008-5033: fix OOPS ..., Mauro Carvalho Chehab, (Mon Nov 17, 6:31 am)
Re: [stable] [patch 24/46] Fix broken ownership of /proc/s ..., Rafael J. Wysocki, (Mon Nov 17, 3:25 pm)