Re: [PATCH] usb: gadget: pch-udc: fix lock

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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



[Index of Archives]     [Linux Media]     [Linux Input]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [Old Linux USB Devel Archive]

  Powered by Linux