Looks good, but 1. We still have spin_lock(&dev->lock); dev->driver->disconnect(&dev->gadget); spin_unlock(&dev->lock); in pch_udc_vbus_session() pch_udc_pcd_pullup(). And also there is lock around dev->driver->setup() in pch_udc_svc_control_out() pch_udc_svc_intf_interrupt() pch_udc_svc_cfg_interrupt(). Is it ok? 2. Deadlocks mentioned in my original report are still there: pch_udc_isr() spin_lock(&dev->lock); pch_udc_dev_isr(dev, dev_intr); pch_udc_svc_ur_interrupt(dev); empty_req_queue(ep); complete_req(ep, req, -ESHUTDOWN); spin_lock(&dev->lock); <--- deadlock if (dev->driver) { spin_lock(&dev->lock); } <--- deadlock -- Alexey On 28.09.2015 18:49, Felipe Balbi wrote: > gadget methods should be called without > spinlocks held. > > Reported-by: Alexey Khoroshilov <khoroshilov@xxxxxxxxx> > Signed-off-by: Felipe Balbi <balbi@xxxxxx> > --- > drivers/usb/gadget/udc/pch_udc.c | 8 ++++---- > 1 file changed, 4 insertions(+), 4 deletions(-) > > diff --git a/drivers/usb/gadget/udc/pch_udc.c b/drivers/usb/gadget/udc/pch_udc.c > index e5f4c5274298..3181fc9c1c49 100644 > --- a/drivers/usb/gadget/udc/pch_udc.c > +++ b/drivers/usb/gadget/udc/pch_udc.c > @@ -2747,18 +2747,18 @@ static void pch_udc_dev_isr(struct pch_udc_dev *dev, u32 dev_intr) > if (dev_intr & UDC_DEVINT_US) { > if (dev->driver > && dev->driver->suspend) { > - spin_lock(&dev->lock); > - dev->driver->suspend(&dev->gadget); > spin_unlock(&dev->lock); > + dev->driver->suspend(&dev->gadget); > + spin_lock(&dev->lock); > } > > vbus = pch_vbus_gpio_get_value(dev); > if ((dev->vbus_session == 0) > && (vbus != 1)) { > if (dev->driver && dev->driver->disconnect) { > - spin_lock(&dev->lock); > - dev->driver->disconnect(&dev->gadget); > spin_unlock(&dev->lock); > + dev->driver->disconnect(&dev->gadget); > + spin_lock(&dev->lock); > } > pch_udc_reconnect(dev); > } else if ((dev->vbus_session == 0) > -- To unsubscribe from this list: send the line "unsubscribe linux-usb" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html