Re: [PATCH v3 2/3] media: uvcvideo: Do not halt the device after disconnect

From: Sergey Senozhatsky
Date: Wed Nov 22 2023 - 02:47:52 EST


On (23/11/21 19:53), Ricardo Ribalda wrote:
> diff --git a/drivers/media/usb/uvc/uvc_driver.c b/drivers/media/usb/uvc/uvc_driver.c
> index 08fcd2ffa727..413c32867617 100644
> --- a/drivers/media/usb/uvc/uvc_driver.c
> +++ b/drivers/media/usb/uvc/uvc_driver.c
> @@ -2257,6 +2257,8 @@ static void uvc_disconnect(struct usb_interface *intf)
> return;
>
> uvc_unregister_video(dev);
> + /* Barrier needed to synchronize with uvc_video_stop_streaming(). */
> + smp_store_release(&dev->disconnected, true);
> kref_put(&dev->ref, uvc_delete);
> }

[..]

> +void uvc_video_stop_streaming(struct uvc_streaming *stream)
> +{
> + uvc_video_stop_transfer(stream, 1);
> +
> + /*
> + * Barrier needed to synchronize with uvc_disconnect().
> + * We cannot call usb_* functions on a disconnected USB device.
> + */
> + if (!smp_load_acquire(&stream->dev->disconnected))
> + uvc_video_halt(stream);
> +
> uvc_video_clock_cleanup(stream);
> }

Can the following happen?

CPU0 CPU1
uvc_disconnect()
uvc_video_stop_streaming()
usb_set_intfdata()
uvc_unregister_video()

if (!smp_load(&dev->disconnected))
uvc_video_halt()

smp_store_release(&dev->disconnected, true);

kref_put(&dev->ref, uvc_delete);