mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
From: Hans Verkuil <hverkuil-cisco@xs4all.nl>
To: Laurent Pinchart <laurent.pinchart@ideasonboard.com>,
	Ricardo Ribalda <ribalda@chromium.org>
Cc: Hans de Goede <hdegoede@redhat.com>,
	Mauro Carvalho Chehab <mchehab@kernel.org>,
	Guennadi Liakhovetski <guennadi.liakhovetski@intel.com>,
	Mauro Carvalho Chehab <mchehab+samsung@kernel.org>,
	linux-media@vger.kernel.org, linux-kernel@vger.kernel.org,
	stable@vger.kernel.org
Subject: Re: [PATCH v2 2/4] media: uvcvideo: Do not set an async control owned by other fh
Date: Fri, 29 Nov 2024 14:10:41 +0100	[thread overview]
Message-ID: <e6eeb2fc-7951-4ef2-afc5-5147d78ec2e8@xs4all.nl> (raw)
In-Reply-To: <20241129110640.GB4108@pendragon.ideasonboard.com>

On 29/11/2024 12:06, Laurent Pinchart wrote:
> On Fri, Nov 29, 2024 at 11:59:27AM +0100, Ricardo Ribalda wrote:
>> On Fri, 29 Nov 2024 at 11:36, Hans Verkuil wrote:
>>> On 28/11/2024 23:33, Laurent Pinchart wrote:
>>>> On Thu, Nov 28, 2024 at 11:28:29PM +0100, Ricardo Ribalda wrote:
>>>>> On Thu, 28 Nov 2024 at 23:22, Laurent Pinchart wrote:
>>>>>>
>>>>>> Hi Ricardo,
>>>>>>
>>>>>> (CC'ing Hans Verkuil)
>>>>>>
>>>>>> Thank you for the patch.
>>>>>>
>>>>>> On Wed, Nov 27, 2024 at 12:14:50PM +0000, Ricardo Ribalda wrote:
>>>>>>> If a file handle is waiting for a response from an async control, avoid
>>>>>>> that other file handle operate with it.
>>>>>>>
>>>>>>> Without this patch, the first file handle will never get the event
>>>>>>> associated with that operation, which can lead to endless loops in
>>>>>>> applications. Eg:
>>>>>>> If an application A wants to change the zoom and to know when the
>>>>>>> operation has completed:
>>>>>>> it will open the video node, subscribe to the zoom event, change the
>>>>>>> control and wait for zoom to finish.
>>>>>>> If before the zoom operation finishes, another application B changes
>>>>>>> the zoom, the first app A will loop forever.
>>>>>>
>>>>>> Hans, the V4L2 specification isn't very clear on this. I see pros and
>>>>>> cons for both behaviours, with a preference for the current behaviour,
>>>>>> as with this patch the control will remain busy until the file handle is
>>>>>> closed if the device doesn't send the control event for any reason. What
>>>>>> do you think ?
>>>>>
>>>>> Just one small clarification. The same file handler can change the
>>>>> value of the async control as many times as it wants, even if the
>>>>> operation has not finished.
>>>>>
>>>>> It will be other file handles that will get -EBUSY if they try to use
>>>>> an async control with an unfinished operation started by another fh.
>>>>
>>>> Yes, I should have been more precised. If the device doesn't send the
>>>> control event, then all other file handles will be prevented from
>>>> setting the control until the file handle that set it first gets closed.
>>>
>>> I think I need a bit more background here:
>>>
>>> First of all, what is an asynchronous control in UVC? I think that means
>>> you can set it, but it takes time for that operation to finish, so you
>>> get an event later when the operation is done. So zoom and similar operations
>>> are examples of that.
>>>
>>> And only when the operation finishes will the control event be sent, correct?
>>
>> You are correct.  This diagrams from the spec is more or less clear:
>> https://ibb.co/MDGn7F3
>>
>>> While the operation is ongoing, if you query the control value, is that reporting
>>> the current position or the final position?
>>
>> I'd expect hardware will return either the current position, the start
>> position or the final position. I could not find anything in the spec
>> that points in one direction or the others.
> 
> Figure 2-21 in UVC 1.5 indicates that the device should STALL the
> GET_CUR and SET_CUR requests if a state change is in progress.
> 
>> And in the driver I believe that we might have a bug handling this
>> case (will send a patch if I can confirm it)
>> the zoom is at 0 and you set it 10
>> if you read the value 2 times before the camera reaches value 10:
>> - First value will come from the hardware and the response will be cached
> 
> Only if the control doesn't have the auto-update flag set, so it will be
> device-dependent. As GET_CUR should stall that's not really relevant,
> except for the fact that devices may not stall the request.

OK, that helps a lot.

If an operation is in progress, then setting a new control value should
result in -EBUSY. Based on the description above, I gather that even the
same fh that made the request cannot update it while the operation is
ongoing?

Getting the control should just return the value that was set. I assume
that is cached in uvc?

Regards,

	Hans

> 
>> - Second value will be the cached one
>>
>> now the camera  is at zoom 10
>> If you read the value, you will read the cached value
>>
>>> E.g.: the zoom control is at value 0 and I set it to 10, then I poll the zoom control
>>> value: will that report the intermediate values until it reaches 10? And when it is
>>> at 10, the control event is sent?
>>>
>>>>>>> Cc: stable@vger.kernel.org
>>>>>>> Fixes: e5225c820c05 ("media: uvcvideo: Send a control event when a Control Change interrupt arrives")
>>>>>>> Signed-off-by: Ricardo Ribalda <ribalda@chromium.org>
>>>>>>> ---
>>>>>>>  drivers/media/usb/uvc/uvc_ctrl.c | 4 ++++
>>>>>>>  1 file changed, 4 insertions(+)
>>>>>>>
>>>>>>> diff --git a/drivers/media/usb/uvc/uvc_ctrl.c b/drivers/media/usb/uvc/uvc_ctrl.c
>>>>>>> index b6af4ff92cbd..3f8ae35cb3bc 100644
>>>>>>> --- a/drivers/media/usb/uvc/uvc_ctrl.c
>>>>>>> +++ b/drivers/media/usb/uvc/uvc_ctrl.c
>>>>>>> @@ -1955,6 +1955,10 @@ int uvc_ctrl_set(struct uvc_fh *handle,
>>>>>>>       if (!(ctrl->info.flags & UVC_CTRL_FLAG_SET_CUR))
>>>>>>>               return -EACCES;
>>>>>>>
>>>>>>> +     /* Other file handle is waiting a response from this async control. */
>>>>>>> +     if (ctrl->handle && ctrl->handle != handle)
>>>>>>> +             return -EBUSY;
>>>>>>> +
>>>>>>>       /* Clamp out of range values. */
>>>>>>>       switch (mapping->v4l2_type) {
>>>>>>>       case V4L2_CTRL_TYPE_INTEGER:
> 


  parent reply	other threads:[~2024-11-29 13:10 UTC|newest]

Thread overview: 50+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-11-27 12:14 [PATCH v2 0/4] media: uvcvideo: Two fixes for async controls Ricardo Ribalda
2024-11-27 12:14 ` [PATCH v2 1/4] media: uvcvideo: Remove dangling pointers Ricardo Ribalda
2024-11-28 22:16   ` Laurent Pinchart
2024-11-28 22:25     ` Ricardo Ribalda
2024-11-28 22:28       ` Laurent Pinchart
2024-11-29  0:21         ` Ricardo Ribalda
2024-11-29 21:22     ` Ricardo Ribalda
2024-11-27 12:14 ` [PATCH v2 2/4] media: uvcvideo: Do not set an async control owned by other fh Ricardo Ribalda
2024-11-28 22:22   ` Laurent Pinchart
2024-11-28 22:28     ` Ricardo Ribalda
2024-11-28 22:33       ` Laurent Pinchart
2024-11-29 10:36         ` Hans Verkuil
2024-11-29 10:59           ` Ricardo Ribalda
2024-11-29 11:06             ` Laurent Pinchart
2024-11-29 11:54               ` Ricardo Ribalda
2024-11-29 13:13                 ` Hans Verkuil
2024-11-29 13:41                   ` Ricardo Ribalda
2024-11-29 18:47                     ` Ricardo Ribalda
2024-11-29 22:03                       ` Laurent Pinchart
2024-11-29 22:18                         ` Ricardo Ribalda
2024-12-02  0:18                           ` Laurent Pinchart
2024-12-02  7:28                             ` Ricardo Ribalda
2024-12-02  8:38                               ` Laurent Pinchart
2024-12-02 10:11                                 ` Ricardo Ribalda
2024-12-02  8:05                             ` Hans Verkuil
2024-12-02  8:11                               ` Laurent Pinchart
2024-12-02  8:44                                 ` Hans Verkuil
2024-12-02 10:26                                   ` Hans de Goede
2024-12-02 10:50                                     ` Ricardo Ribalda
2024-12-02 12:19                                       ` Hans de Goede
2024-12-02 13:29                                         ` Ricardo Ribalda
2024-12-03 19:32                                           ` Laurent Pinchart
2024-12-04 13:46                                             ` Hans de Goede
2024-12-02 10:55                                     ` Hans Verkuil
2024-12-03 17:18                                       ` Laurent Pinchart
2024-12-04  7:59                                         ` Hans Verkuil
2024-12-04  8:04                                           ` Hans Verkuil
2024-12-04  9:13                                             ` Laurent Pinchart
2024-12-04  9:02                                           ` Laurent Pinchart
2024-11-29 13:10               ` Hans Verkuil [this message]
2024-11-29 13:32                 ` Hans Verkuil
2024-11-29 13:37                 ` Ricardo Ribalda
2024-11-29 21:47                   ` Laurent Pinchart
2024-11-29 11:01           ` Laurent Pinchart
2024-11-27 12:14 ` [PATCH v2 3/4] media: uvcvideo: Annotate lock requirements for uvc_ctrl_set Ricardo Ribalda
2024-11-28 21:51   ` Laurent Pinchart
2024-11-27 12:14 ` [PATCH v2 4/4] media: uvcvideo: Remove redundant NULL assignment Ricardo Ribalda
2024-11-28 21:26   ` Laurent Pinchart
2024-11-28 21:34     ` Ricardo Ribalda
2024-11-28 21:47       ` Laurent Pinchart

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=e6eeb2fc-7951-4ef2-afc5-5147d78ec2e8@xs4all.nl \
    --to=hverkuil-cisco@xs4all.nl \
    --cc=guennadi.liakhovetski@intel.com \
    --cc=hdegoede@redhat.com \
    --cc=laurent.pinchart@ideasonboard.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-media@vger.kernel.org \
    --cc=mchehab+samsung@kernel.org \
    --cc=mchehab@kernel.org \
    --cc=ribalda@chromium.org \
    --cc=stable@vger.kernel.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®