Hi Sergey On Wed, 22 Nov 2023 at 08:21, Sergey Senozhatsky <senozhatsky@xxxxxxxxxxxx> wrote: > > On (23/11/21 19:53), Ricardo Ribalda wrote: > > uvc_status_stop() handles properly the race conditions with the > > asynchronous worker. > > Let's use uvc_status_stop() for all the code paths that require stopping > > it. > > > > Signed-off-by: Ricardo Ribalda <ribalda@xxxxxxxxxxxx> > > --- > > drivers/media/usb/uvc/uvc_ctrl.c | 4 ---- > > drivers/media/usb/uvc/uvc_status.c | 2 +- > > 2 files changed, 1 insertion(+), 5 deletions(-) > > > > diff --git a/drivers/media/usb/uvc/uvc_ctrl.c b/drivers/media/usb/uvc/uvc_ctrl.c > > index e59a463c2761..8e22a07e3e7b 100644 > > --- a/drivers/media/usb/uvc/uvc_ctrl.c > > +++ b/drivers/media/usb/uvc/uvc_ctrl.c > > @@ -2765,10 +2765,6 @@ void uvc_ctrl_cleanup_device(struct uvc_device *dev) > > struct uvc_entity *entity; > > unsigned int i; > > > > - /* Can be uninitialized if we are aborting on probe error. */ > > - if (dev->async_ctrl.work.func) > > - cancel_work_sync(&dev->async_ctrl.work); > > - > > /* Free controls and control mappings for all entities. */ > > list_for_each_entry(entity, &dev->entities, list) { > > for (i = 0; i < entity->ncontrols; ++i) { > > diff --git a/drivers/media/usb/uvc/uvc_status.c b/drivers/media/usb/uvc/uvc_status.c > > index a78a88c710e2..0208612a9f12 100644 > > --- a/drivers/media/usb/uvc/uvc_status.c > > +++ b/drivers/media/usb/uvc/uvc_status.c > > @@ -292,7 +292,7 @@ int uvc_status_init(struct uvc_device *dev) > > > > void uvc_status_unregister(struct uvc_device *dev) > > { > > - usb_kill_urb(dev->int_urb); > > + uvc_status_stop(dev); > > Sort of feels like this needs dev->lock somewhere here. Should we move 3/3 > to the head of the series? > > The question is, can this be called in parallel with uvc_v4l2_release(), > for instance? I can be called in parallel with uvc_v4l2_release(), but uvc_status_stop() is thread-safe and does not take any locks after: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=619d9b710cf06f7a00a17120ca92333684ac45a8 So this "should" be good. key-word here is should :P > > > uvc_input_unregister(dev); > > } -- Ricardo Ribalda