Message ID | 1388832951-11195-16-git-send-email-m.chehab@samsung.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Am 04.01.2014 11:55, schrieb Mauro Carvalho Chehab: > When em28xx extensions are loaded/removed, there are two locks: > > a single static em28xx_devlist_mutex that registers each extension > and the struct em28xx dev->lock. > > When extensions are registered, em28xx_devlist_mutex is taken first, > and then dev->lock. > > Be sure that, when extensions are being removed, the same order > will be used. > > Signed-off-by: Mauro Carvalho Chehab <m.chehab@samsung.com> > --- > drivers/media/usb/em28xx/em28xx-cards.c | 5 +++-- > drivers/media/usb/em28xx/em28xx-core.c | 2 ++ > 2 files changed, 5 insertions(+), 2 deletions(-) > > diff --git a/drivers/media/usb/em28xx/em28xx-cards.c b/drivers/media/usb/em28xx/em28xx-cards.c > index 4fe742429f2c..36aec50e5c3b 100644 > --- a/drivers/media/usb/em28xx/em28xx-cards.c > +++ b/drivers/media/usb/em28xx/em28xx-cards.c > @@ -3334,9 +3334,7 @@ static void em28xx_usb_disconnect(struct usb_interface *interface) > dev->disconnected = 1; > > if (dev->is_audio_only) { > - mutex_lock(&dev->lock); > em28xx_close_extension(dev); > - mutex_unlock(&dev->lock); > return; > } > > @@ -3355,10 +3353,13 @@ static void em28xx_usb_disconnect(struct usb_interface *interface) > em28xx_uninit_usb_xfer(dev, EM28XX_ANALOG_MODE); > em28xx_uninit_usb_xfer(dev, EM28XX_DIGITAL_MODE); > } > + mutex_unlock(&dev->lock); > > em28xx_close_extension(dev); > + > /* NOTE: must be called BEFORE the resources are released */ > > + mutex_lock(&dev->lock); > if (!dev->users) > em28xx_release_resources(dev); > > diff --git a/drivers/media/usb/em28xx/em28xx-core.c b/drivers/media/usb/em28xx/em28xx-core.c > index 2ad84ff1fc4f..97cc83c3c287 100644 > --- a/drivers/media/usb/em28xx/em28xx-core.c > +++ b/drivers/media/usb/em28xx/em28xx-core.c > @@ -1097,10 +1097,12 @@ void em28xx_close_extension(struct em28xx *dev) > const struct em28xx_ops *ops = NULL; > > mutex_lock(&em28xx_devlist_mutex); > + mutex_lock(&dev->lock); > list_for_each_entry(ops, &em28xx_extension_devlist, next) { > if (ops->fini) > ops->fini(dev); > } > + mutex_unlock(&dev->lock); > list_del(&dev->devlist); > mutex_unlock(&em28xx_devlist_mutex); > } Reviewed-by: Frank Schäfer <fschaefer.oss@googlemail.com> Thank you for fixing this issue. I will review the remaining patches this evening. -- To unsubscribe from this list: send the line "unsubscribe linux-media" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
diff --git a/drivers/media/usb/em28xx/em28xx-cards.c b/drivers/media/usb/em28xx/em28xx-cards.c index 4fe742429f2c..36aec50e5c3b 100644 --- a/drivers/media/usb/em28xx/em28xx-cards.c +++ b/drivers/media/usb/em28xx/em28xx-cards.c @@ -3334,9 +3334,7 @@ static void em28xx_usb_disconnect(struct usb_interface *interface) dev->disconnected = 1; if (dev->is_audio_only) { - mutex_lock(&dev->lock); em28xx_close_extension(dev); - mutex_unlock(&dev->lock); return; } @@ -3355,10 +3353,13 @@ static void em28xx_usb_disconnect(struct usb_interface *interface) em28xx_uninit_usb_xfer(dev, EM28XX_ANALOG_MODE); em28xx_uninit_usb_xfer(dev, EM28XX_DIGITAL_MODE); } + mutex_unlock(&dev->lock); em28xx_close_extension(dev); + /* NOTE: must be called BEFORE the resources are released */ + mutex_lock(&dev->lock); if (!dev->users) em28xx_release_resources(dev); diff --git a/drivers/media/usb/em28xx/em28xx-core.c b/drivers/media/usb/em28xx/em28xx-core.c index 2ad84ff1fc4f..97cc83c3c287 100644 --- a/drivers/media/usb/em28xx/em28xx-core.c +++ b/drivers/media/usb/em28xx/em28xx-core.c @@ -1097,10 +1097,12 @@ void em28xx_close_extension(struct em28xx *dev) const struct em28xx_ops *ops = NULL; mutex_lock(&em28xx_devlist_mutex); + mutex_lock(&dev->lock); list_for_each_entry(ops, &em28xx_extension_devlist, next) { if (ops->fini) ops->fini(dev); } + mutex_unlock(&dev->lock); list_del(&dev->devlist); mutex_unlock(&em28xx_devlist_mutex); }
When em28xx extensions are loaded/removed, there are two locks: a single static em28xx_devlist_mutex that registers each extension and the struct em28xx dev->lock. When extensions are registered, em28xx_devlist_mutex is taken first, and then dev->lock. Be sure that, when extensions are being removed, the same order will be used. Signed-off-by: Mauro Carvalho Chehab <m.chehab@samsung.com> --- drivers/media/usb/em28xx/em28xx-cards.c | 5 +++-- drivers/media/usb/em28xx/em28xx-core.c | 2 ++ 2 files changed, 5 insertions(+), 2 deletions(-)