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 <[email protected]>
> Signed-off-by: Felipe Balbi <[email protected]>
> ---
> 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 [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html