Messages in this thread Patch in this message | | | From | Robert Baldyga <> | Subject | [PATCH] usb: gadget: composite: unlock spinlock before usb_gadget_disconnect() | Date | Fri, 13 Jun 2014 13:28:13 +0200 |
| |
usb_gadget_disconnect() shouldn't be called under spinlock to avoid spinlock recursion. Function usb_gadget_disconnect() calls pullup(), which is callback from UDC driver, usually calling composite_disconnect(). This function wants to lock spinlock used in usb_function_deactivate() causing spinlock recursion.
Signed-off-by: Robert Baldyga <r.baldyga@samsung.com> --- drivers/usb/gadget/composite.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-)
diff --git a/drivers/usb/gadget/composite.c b/drivers/usb/gadget/composite.c index d41103e..77cae4b 100644 --- a/drivers/usb/gadget/composite.c +++ b/drivers/usb/gadget/composite.c @@ -260,8 +260,11 @@ int usb_function_deactivate(struct usb_function *function) spin_lock_irqsave(&cdev->lock, flags); - if (cdev->deactivations == 0) + if (cdev->deactivations == 0) { + spin_unlock_irqrestore(&cdev->lock, flags); status = usb_gadget_disconnect(cdev->gadget); + spin_lock_irqsave(&cdev->lock, flags); + } if (status == 0) cdev->deactivations++; -- 1.9.1
| |