linux_dsm_epyc7002/drivers/media/usb
Daniel Axtens 10e1fdb958 media: uvcvideo: Refactor teardown of uvc on USB disconnect
Currently, disconnecting a USB webcam while it is in use prints out a
number of warnings, such as:

WARNING: CPU: 2 PID: 3118 at /build/linux-ezBi1T/linux-4.8.0/fs/sysfs/group.c:237 sysfs_remove_group+0x8b/0x90
sysfs group ffffffffa7cd0780 not found for kobject 'event13'

This has been noticed before. [0]

This is because of the order in which things are torn down.

If there are no streams active during a USB disconnect:

 - uvc_disconnect() is invoked via device_del() through the bus
   notifier mechanism.

 - this calls uvc_unregister_video().

 - uvc_unregister_video() unregisters the video device for each
   stream,

 - because there are no streams open, it calls uvc_delete()

 - uvc_delete() calls uvc_status_cleanup(), which cleans up the status
   input device.

 - uvc_delete() calls media_device_unregister(), which cleans up the
   media device

 - uvc_delete(), uvc_unregister_video() and uvc_disconnect() all
   return, and we end up back in device_del().

 - device_del() then cleans up the sysfs folder for the camera with
   dpm_sysfs_remove(). Because uvc_status_cleanup() and
   media_device_unregister() have already been called, this all works
   nicely.

If, on the other hand, there *are* streams active during a USB disconnect:

 - uvc_disconnect() is invoked

 - this calls uvc_unregister_video()

 - uvc_unregister_video() unregisters the video device for each
   stream,

 - uvc_unregister_video() and uvc_disconnect() return, and we end up
   back in device_del().

 - device_del() then cleans up the sysfs folder for the camera with
   dpm_sysfs_remove(). Because the status input device and the media
   device are children of the USB device, this also deletes their
   sysfs folders.

 - Sometime later, the final stream is closed, invoking uvc_release().

 - uvc_release() calls uvc_delete()

 - uvc_delete() calls uvc_status_cleanup(), which cleans up the status
   input device. Because the sysfs directory has already been removed,
   this causes a WARNing.

 - uvc_delete() calls media_device_unregister(), which cleans up the
   media device. Because the sysfs directory has already been removed,
   this causes another WARNing.

To fix this, we need to make sure the devices are always unregistered
before the end of uvc_disconnect(). To this, move the unregistration
into the disconnect path:

 - split uvc_status_cleanup() into two parts, one on disconnect that
   unregisters and one on delete that frees.

 - move v4l2_device_unregister() and media_device_unregister() into
   the disconnect path.

[0]: https://lkml.org/lkml/2016/12/8/657

[Renamed uvc_input_cleanup() to uvc_input_unregister()]

Signed-off-by: Daniel Axtens <dja@axtens.net>
Acked-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab+samsung@kernel.org>
2018-12-03 14:16:02 -05:00
..
airspy media: use strscpy() instead of strlcpy() 2018-09-11 13:32:17 -04:00
as102 media: fix usage of whitespaces and on indentation 2018-01-04 13:12:01 -05:00
au0828 media: vidioc_cropcap -> vidioc_g_pixelaspect 2018-11-20 13:57:21 -05:00
b2c2 media: move dvb kAPI headers to include/media 2017-12-28 13:16:01 -05:00
cpia2 media: cropcap/g_selection split 2018-11-20 13:37:18 -05:00
cx231xx media: vidioc_cropcap -> vidioc_g_pixelaspect 2018-11-20 13:57:21 -05:00
dvb-usb media: dib0700: fix spelling mistake "Amplifyer" -> "Amplifier" 2018-12-03 13:23:46 -05:00
dvb-usb-v2 media: usb: Use kmemdup instead of duplicating its function. 2018-12-03 13:27:17 -05:00
em28xx media updates for v4.20-rc1 2018-10-29 14:29:58 -07:00
go7007 media: use strscpy() instead of strlcpy() 2018-09-11 13:32:17 -04:00
gspca media: gspca: sq930x: use GFP_KERNEL in sd_dq_callback() 2018-09-12 08:01:30 -04:00
hackrf media: use strscpy() instead of strlcpy() 2018-09-11 13:32:17 -04:00
hdpvr media: replace strcpy() by strscpy() 2018-09-11 13:32:17 -04:00
msi2500 media updates for v4.20-rc1 2018-10-31 10:53:29 -07:00
pulse8-cec media: pulse8-cec: return 0 when invalidating the logical address 2018-11-23 05:49:11 -05:00
pvrusb2 media: vidioc_cropcap -> vidioc_g_pixelaspect 2018-11-20 13:57:21 -05:00
pwc media: replace strcpy() by strscpy() 2018-09-11 13:32:17 -04:00
rainshadow-cec media: replace strcpy() by strscpy() 2018-09-11 13:32:17 -04:00
s2255 media: use strscpy() instead of strlcpy() 2018-09-11 13:32:17 -04:00
siano media: siano: use GFP_DMA only for smssdio 2018-05-15 08:04:42 -04:00
stk1160 media: replace strcpy() by strscpy() 2018-09-11 13:32:17 -04:00
stkwebcam media: replace strcpy() by strscpy() 2018-09-11 13:32:17 -04:00
tm6000 media updates for v4.20-rc1 2018-10-31 10:53:29 -07:00
ttusb-budget media: replace strcpy() by strscpy() 2018-09-11 13:32:17 -04:00
ttusb-dec media: dvb: represent min/max/step/tolerance freqs in Hz 2018-08-02 18:10:48 -04:00
usbtv media: use strscpy() instead of strlcpy() 2018-09-11 13:32:17 -04:00
usbvision media: usbvision: remove time_in_irq 2018-09-12 08:02:25 -04:00
uvc media: uvcvideo: Refactor teardown of uvc on USB disconnect 2018-12-03 14:16:02 -05:00
zr364xx media: replace strcpy() by strscpy() 2018-09-11 13:32:17 -04:00
Kconfig [media] rainshadow-cec: new RainShadow Tech HDMI CEC driver 2017-04-10 12:42:10 -03:00
Makefile License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00