From: Hans Verkuil <hverkuil-cisco@xs4all.nl>
To: Sakari Ailus <sakari.ailus@linux.intel.com>
Cc: Laurent Pinchart <laurent.pinchart@ideasonboard.com>,
Tomasz Figa <tfiga@chromium.org>,
Ricardo Ribalda <ribalda@chromium.org>,
Mauro Carvalho Chehab <mchehab@kernel.org>,
Guenter Roeck <linux@roeck-us.net>,
Max Staudt <mstaudt@chromium.org>,
Alan Stern <stern@rowland.harvard.edu>,
linux-media@vger.kernel.org, linux-kernel@vger.kernel.org,
Sean Paul <seanpaul@chromium.org>
Subject: Re: [PATCH v4 1/4] media: uvcvideo: stop stream during unregister
Date: Mon, 17 Jun 2024 10:19:57 +0200 [thread overview]
Message-ID: <fc2738fd-5e24-4aea-82d0-e31e7b3b4e20@xs4all.nl> (raw)
In-Reply-To: <Zm_sN3Ta7MrjGrQL@kekkonen.localdomain>
On 17/06/2024 09:56, Sakari Ailus wrote:
> Hi Hans,
>
> On Mon, Jun 17, 2024 at 09:27:43AM +0200, Hans Verkuil wrote:
>> On 17/06/2024 01:58, Laurent Pinchart wrote:
>>> Hi Tomasz,
>>>
>>> On Thu, Jun 06, 2024 at 06:57:50PM +0900, Tomasz Figa wrote:
>>>> On Wed, Mar 27, 2024 at 5:24 PM Ricardo Ribalda wrote:
>>>>>
>>>>> uvc_unregister_video() can be called asynchronously from
>>>>> uvc_disconnect(). If the device is still streaming when that happens, a
>>>>> plethora of race conditions can happen.
>>>>>
>>>>> Make sure that the device has stopped streaming before exiting this
>>>>> function.
>>>>>
>>>>> If the user still holds handles to the driver's file descriptors, any
>>>>> ioctl will return -ENODEV from the v4l2 core.
>>>>>
>>>>> This change make uvc more consistent with the rest of the v4l2 drivers
>>>>> using the vb2_fop_* and vb2_ioctl_* helpers.
>>>>>
>>>>> Suggested-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
>>>>> Signed-off-by: Ricardo Ribalda <ribalda@chromium.org>
>>>>> ---
>>>>> drivers/media/usb/uvc/uvc_driver.c | 11 +++++++++++
>>>>> 1 file changed, 11 insertions(+)
>>>>
>>>> First of all, thanks for the patch. I have a question about the
>>>> problem being fixed here.
>>>>
>>>> Could you point out a specific race condition example that could
>>>> happen without this change?
>>>> From what I see in __video_do_ioctl((), no ioctls would be executed
>>>> anymore after the video node is unregistered.
>>>> Since the device is not present either, what asynchronous code paths
>>>> could be still triggered?
>>>
>>> I believe the issue is that some ioctls can be in progress while the
>>> device is unregistered. I'll let Ricardo confirm.
>>>
>>> I've tried to explain multiple times before that this should be handled
>>> in the V4L2 core, ideally with fixes in the cdev core too, as this issue
>>> affects all cdev drivers. I've pointed to related patches that have been
>>> posted for the cdev core. They need to be wrapped in V4L2 functions to
>>> make them easier to use for drivers. If we don't want to depend on those
>>> cdev changes, we can implement the "wrappers" with fixes limited to
>>> V4L2 until the cdev changes get merged (assuming someone would resurect
>>> them).
>>
>> But there is already a V4L2 wrapper for that: vb2_video_unregister_device().
>> It safely unregisters the video device, ensuring any in-flight ioctls finish
>> first, and it stops any video streaming.
>>
>> The only reason it can't be used in uvc for the video stream is that that
>> vb2_queue doesn't set the lock field (i.e. uses the core V4L2 serialization
>> mechanism). The metadata stream *does* set that field, so for that stream this
>> function can be used.
>>
>> While it would be nice to have this fixed in the cdev core part, that will
>> take very long, and we have a perfectly fine V4L2 helper for this already.
>
> It might not take *that* long to get there but it won't happen unless
> someone does it. Dan Williams posted a patch but his immediate problem was
> solved differently so there it remains
> <URL:https://lore.kernel.org/all/161117153248.2853729.2452425259045172318.stgit@dwillia2-desk3.amr.corp.intel.com/>.
>
> In the meantime vb_video_unregister_device() would seem to be the best
> choice.
Also note that even if these cdev improvements ever land, that doesn't remove
the need for vb2_video_unregister_device, since that also explicitly stops
any streaming that is in progress. Which is something you really want to do
when the device is unbound.
Regards,
Hans
next prev parent reply other threads:[~2024-06-17 8:20 UTC|newest]
Thread overview: 15+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-03-27 8:24 [PATCH v4 0/4] uvcvideo: Attempt N to land UVC race conditions fixes Ricardo Ribalda
2024-03-27 8:24 ` [PATCH v4 1/4] media: uvcvideo: stop stream during unregister Ricardo Ribalda
2024-05-28 7:55 ` Hans Verkuil
2024-06-06 10:04 ` Tomasz Figa
2024-06-06 11:57 ` Hans Verkuil
2024-06-12 3:25 ` Tomasz Figa
2024-06-06 9:57 ` Tomasz Figa
2024-06-16 23:58 ` Laurent Pinchart
2024-06-17 7:27 ` Hans Verkuil
2024-06-17 7:56 ` Sakari Ailus
2024-06-17 8:19 ` Hans Verkuil [this message]
2024-03-27 8:24 ` [PATCH v4 2/4] media: uvcvideo: Refactor the status irq API Ricardo Ribalda
2024-03-27 8:24 ` [PATCH v4 3/4] media: uvcvideo: Avoid race condition during unregister Ricardo Ribalda
2024-03-27 8:24 ` [PATCH v4 4/4] media: uvcvideo: Exit early if there is not int_urb Ricardo Ribalda
2024-03-27 11:04 ` [PATCH v4 0/4] uvcvideo: Attempt N to land UVC race conditions fixes Sergey Senozhatsky
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=fc2738fd-5e24-4aea-82d0-e31e7b3b4e20@xs4all.nl \
--to=hverkuil-cisco@xs4all.nl \
--cc=laurent.pinchart@ideasonboard.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-media@vger.kernel.org \
--cc=linux@roeck-us.net \
--cc=mchehab@kernel.org \
--cc=mstaudt@chromium.org \
--cc=ribalda@chromium.org \
--cc=sakari.ailus@linux.intel.com \
--cc=seanpaul@chromium.org \
--cc=stern@rowland.harvard.edu \
--cc=tfiga@chromium.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®