Hello usb-devel,

potential deadlock was at usb serial gadget (SMP case), please merge.
(I haven't checked the latest serial.c changes so not sure whether this is not fixed already)


Adjust dev->dev_lock spinlock lock/unlock calls to be safe for SMP case.

Signed-off-by: Eugeny S. Mints <[EMAIL PROTECTED]>

A short explanation:

the following sequence may lead to a deadlock in SMP case:

gs_send()->usb_up_queue()->(in case a request is satisfied immidiatly)->gs_write_complete()

for ex for pxa2xx_udc.c: usb_up_queue()->pxa2xx_ep_queue()->write_fifo()->done()->gs_write_complete() (through req.complete pointer)

Eugeny
--- a/drivers/usb/gadget/serial.c       2004-12-25 00:35:24.000000000 +0300
+++ b/drivers/usb/gadget/serial.c       2005-04-27 20:42:43.000000000 +0400
@@ -1260,12 +1260,15 @@
 gs_debug_level(3, "gs_send: len=%d, 0x%2.2x 0x%2.2x 0x%2.2x ...\n", len, 
*((unsigned char *)req->buf), *((unsigned char *)req->buf+1), *((unsigned char 
*)req->buf+2));
                        list_del(&req_entry->re_entry);
                        req->length = len;
+                       spin_unlock_irqrestore(&dev->dev_lock, flags);
                        if ((ret=usb_ep_queue(ep, req, GFP_ATOMIC))) {
                                printk(KERN_ERR
                                "gs_send: cannot queue read request, ret=%d\n",
                                        ret);
+                               spin_lock_irqsave(&dev->dev_lock, flags);
                                break;
                        }
+                       spin_lock_irqsave(&dev->dev_lock, flags);
                } else {
                        break;
                }

Reply via email to