diff mbox series

v4l2-compliance: Fix V4L2_CTRL_WHICH_DEF_VAL in multi_classes

Message ID 20210310212450.1220416-1-ribalda@chromium.org (mailing list archive)
State New, archived
Headers show
Series v4l2-compliance: Fix V4L2_CTRL_WHICH_DEF_VAL in multi_classes | expand

Commit Message

Ricardo Ribalda March 10, 2021, 9:24 p.m. UTC
If there are multiple classes, the ioctl should fail.

Fixes: 0884b19adada ("v4l2-compliance: add test for V4L2_CTRL_WHICH_DEF_VAL")
Signed-off-by: Ricardo Ribalda <ribalda@chromium.org>
---
 utils/v4l2-compliance/v4l2-test-controls.cpp | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

Comments

Hans Verkuil March 11, 2021, 12:56 p.m. UTC | #1
On 10/03/2021 22:24, Ricardo Ribalda wrote:
> If there are multiple classes, the ioctl should fail.

It shouldn't matter if there are multiple classes or not, it should
work.

What is the exact error you get with which driver?

Regards,

	Hans

> 
> Fixes: 0884b19adada ("v4l2-compliance: add test for V4L2_CTRL_WHICH_DEF_VAL")
> Signed-off-by: Ricardo Ribalda <ribalda@chromium.org>
> ---
>  utils/v4l2-compliance/v4l2-test-controls.cpp | 5 ++++-
>  1 file changed, 4 insertions(+), 1 deletion(-)
> 
> diff --git a/utils/v4l2-compliance/v4l2-test-controls.cpp b/utils/v4l2-compliance/v4l2-test-controls.cpp
> index 9a68b7e847b0..79982bc15054 100644
> --- a/utils/v4l2-compliance/v4l2-test-controls.cpp
> +++ b/utils/v4l2-compliance/v4l2-test-controls.cpp
> @@ -793,7 +793,10 @@ int testExtendedControls(struct node *node)
>  	ctrls.which = V4L2_CTRL_WHICH_DEF_VAL;
>  	fail_on_test(!doioctl(node, VIDIOC_S_EXT_CTRLS, &ctrls));
>  	fail_on_test(!doioctl(node, VIDIOC_TRY_EXT_CTRLS, &ctrls));
> -	fail_on_test(doioctl(node, VIDIOC_G_EXT_CTRLS, &ctrls));
> +	if (multiple_classes)
> +		fail_on_test(!doioctl(node, VIDIOC_G_EXT_CTRLS, &ctrls));
> +	else
> +		fail_on_test(doioctl(node, VIDIOC_G_EXT_CTRLS, &ctrls));
>  	return 0;
>  }
>  
>
Ricardo Ribalda March 11, 2021, 1:06 p.m. UTC | #2
Hi Hans

Thanks for your review!


On Thu, Mar 11, 2021 at 1:57 PM Hans Verkuil <hverkuil-cisco@xs4all.nl> wrote:
>
> On 10/03/2021 22:24, Ricardo Ribalda wrote:
> > If there are multiple classes, the ioctl should fail.
>
> It shouldn't matter if there are multiple classes or not, it should
> work.

I believe this is the part of the kernel that is triggering the issue:

https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/drivers/media/v4l2-core/v4l2-ioctl.c#n929

I can send a patch if that is not the intended behaviour ;)

/* Check that all controls are from the same control class. */
for (i = 0; i < c->count; i++) {
if (V4L2_CTRL_ID2WHICH(c->controls[i].id) != c->which) {
c->error_idx = i;
return 0;

>
> What is the exact error you get with which driver?

I am trying to fix uvc compliance

 fail: v4l2-test-controls.cpp(813): doioctl(node, VIDIOC_G_EXT_CTRLS, &ctrls)
test VIDIOC_G/S/TRY_EXT_CTRLS: FAIL


>
> Regards,

Best regards!

>
>         Hans
>
> >
> > Fixes: 0884b19adada ("v4l2-compliance: add test for V4L2_CTRL_WHICH_DEF_VAL")
> > Signed-off-by: Ricardo Ribalda <ribalda@chromium.org>
> > ---
> >  utils/v4l2-compliance/v4l2-test-controls.cpp | 5 ++++-
> >  1 file changed, 4 insertions(+), 1 deletion(-)
> >
> > diff --git a/utils/v4l2-compliance/v4l2-test-controls.cpp b/utils/v4l2-compliance/v4l2-test-controls.cpp
> > index 9a68b7e847b0..79982bc15054 100644
> > --- a/utils/v4l2-compliance/v4l2-test-controls.cpp
> > +++ b/utils/v4l2-compliance/v4l2-test-controls.cpp
> > @@ -793,7 +793,10 @@ int testExtendedControls(struct node *node)
> >       ctrls.which = V4L2_CTRL_WHICH_DEF_VAL;
> >       fail_on_test(!doioctl(node, VIDIOC_S_EXT_CTRLS, &ctrls));
> >       fail_on_test(!doioctl(node, VIDIOC_TRY_EXT_CTRLS, &ctrls));
> > -     fail_on_test(doioctl(node, VIDIOC_G_EXT_CTRLS, &ctrls));
> > +     if (multiple_classes)
> > +             fail_on_test(!doioctl(node, VIDIOC_G_EXT_CTRLS, &ctrls));
> > +     else
> > +             fail_on_test(doioctl(node, VIDIOC_G_EXT_CTRLS, &ctrls));
> >       return 0;
> >  }
> >
> >
>
Hans Verkuil March 11, 2021, 1:17 p.m. UTC | #3
On 11/03/2021 14:06, Ricardo Ribalda wrote:
> Hi Hans
> 
> Thanks for your review!
> 
> 
> On Thu, Mar 11, 2021 at 1:57 PM Hans Verkuil <hverkuil-cisco@xs4all.nl> wrote:
>>
>> On 10/03/2021 22:24, Ricardo Ribalda wrote:
>>> If there are multiple classes, the ioctl should fail.
>>
>> It shouldn't matter if there are multiple classes or not, it should
>> work.
> 
> I believe this is the part of the kernel that is triggering the issue:
> 
> https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/drivers/media/v4l2-core/v4l2-ioctl.c#n929
> 
> I can send a patch if that is not the intended behaviour ;)
> 
> /* Check that all controls are from the same control class. */
> for (i = 0; i < c->count; i++) {
> if (V4L2_CTRL_ID2WHICH(c->controls[i].id) != c->which) {
> c->error_idx = i;
> return 0;

Ah, and this is only called for drivers that do not use the control framework.

This is a bug, just before that for-loop it says:

        if (!c->which)
                return 1;

This should be:

	if (!c->which || c->which == V4L2_CTRL_WHICH_DEF_VAL)
                return 1;
	if (c->which == V4L2_CTRL_WHICH_REQUEST_VAL)
		return 0;

Regards,

	Hans

> 
>>
>> What is the exact error you get with which driver?
> 
> I am trying to fix uvc compliance
> 
>  fail: v4l2-test-controls.cpp(813): doioctl(node, VIDIOC_G_EXT_CTRLS, &ctrls)
> test VIDIOC_G/S/TRY_EXT_CTRLS: FAIL
> 
> 
>>
>> Regards,
> 
> Best regards!
> 
>>
>>         Hans
>>
>>>
>>> Fixes: 0884b19adada ("v4l2-compliance: add test for V4L2_CTRL_WHICH_DEF_VAL")
>>> Signed-off-by: Ricardo Ribalda <ribalda@chromium.org>
>>> ---
>>>  utils/v4l2-compliance/v4l2-test-controls.cpp | 5 ++++-
>>>  1 file changed, 4 insertions(+), 1 deletion(-)
>>>
>>> diff --git a/utils/v4l2-compliance/v4l2-test-controls.cpp b/utils/v4l2-compliance/v4l2-test-controls.cpp
>>> index 9a68b7e847b0..79982bc15054 100644
>>> --- a/utils/v4l2-compliance/v4l2-test-controls.cpp
>>> +++ b/utils/v4l2-compliance/v4l2-test-controls.cpp
>>> @@ -793,7 +793,10 @@ int testExtendedControls(struct node *node)
>>>       ctrls.which = V4L2_CTRL_WHICH_DEF_VAL;
>>>       fail_on_test(!doioctl(node, VIDIOC_S_EXT_CTRLS, &ctrls));
>>>       fail_on_test(!doioctl(node, VIDIOC_TRY_EXT_CTRLS, &ctrls));
>>> -     fail_on_test(doioctl(node, VIDIOC_G_EXT_CTRLS, &ctrls));
>>> +     if (multiple_classes)
>>> +             fail_on_test(!doioctl(node, VIDIOC_G_EXT_CTRLS, &ctrls));
>>> +     else
>>> +             fail_on_test(doioctl(node, VIDIOC_G_EXT_CTRLS, &ctrls));
>>>       return 0;
>>>  }
>>>
>>>
>>
> 
>
Ricardo Ribalda March 11, 2021, 1:19 p.m. UTC | #4
On Thu, Mar 11, 2021 at 2:17 PM Hans Verkuil <hverkuil-cisco@xs4all.nl> wrote:
>
> On 11/03/2021 14:06, Ricardo Ribalda wrote:
> > Hi Hans
> >
> > Thanks for your review!
> >
> >
> > On Thu, Mar 11, 2021 at 1:57 PM Hans Verkuil <hverkuil-cisco@xs4all.nl> wrote:
> >>
> >> On 10/03/2021 22:24, Ricardo Ribalda wrote:
> >>> If there are multiple classes, the ioctl should fail.
> >>
> >> It shouldn't matter if there are multiple classes or not, it should
> >> work.
> >
> > I believe this is the part of the kernel that is triggering the issue:
> >
> > https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/drivers/media/v4l2-core/v4l2-ioctl.c#n929
> >
> > I can send a patch if that is not the intended behaviour ;)
> >
> > /* Check that all controls are from the same control class. */
> > for (i = 0; i < c->count; i++) {
> > if (V4L2_CTRL_ID2WHICH(c->controls[i].id) != c->which) {
> > c->error_idx = i;
> > return 0;
>
> Ah, and this is only called for drivers that do not use the control framework.
>
> This is a bug, just before that for-loop it says:
>
>         if (!c->which)
>                 return 1;
>
> This should be:
>
>         if (!c->which || c->which == V4L2_CTRL_WHICH_DEF_VAL)
>                 return 1;
>         if (c->which == V4L2_CTRL_WHICH_REQUEST_VAL)
>                 return 0;

Can I send a patch for that?

>
> Regards,
>
>         Hans
>
> >
> >>
> >> What is the exact error you get with which driver?
> >
> > I am trying to fix uvc compliance
> >
> >  fail: v4l2-test-controls.cpp(813): doioctl(node, VIDIOC_G_EXT_CTRLS, &ctrls)
> > test VIDIOC_G/S/TRY_EXT_CTRLS: FAIL
> >
> >
> >>
> >> Regards,
> >
> > Best regards!
> >
> >>
> >>         Hans
> >>
> >>>
> >>> Fixes: 0884b19adada ("v4l2-compliance: add test for V4L2_CTRL_WHICH_DEF_VAL")
> >>> Signed-off-by: Ricardo Ribalda <ribalda@chromium.org>
> >>> ---
> >>>  utils/v4l2-compliance/v4l2-test-controls.cpp | 5 ++++-
> >>>  1 file changed, 4 insertions(+), 1 deletion(-)
> >>>
> >>> diff --git a/utils/v4l2-compliance/v4l2-test-controls.cpp b/utils/v4l2-compliance/v4l2-test-controls.cpp
> >>> index 9a68b7e847b0..79982bc15054 100644
> >>> --- a/utils/v4l2-compliance/v4l2-test-controls.cpp
> >>> +++ b/utils/v4l2-compliance/v4l2-test-controls.cpp
> >>> @@ -793,7 +793,10 @@ int testExtendedControls(struct node *node)
> >>>       ctrls.which = V4L2_CTRL_WHICH_DEF_VAL;
> >>>       fail_on_test(!doioctl(node, VIDIOC_S_EXT_CTRLS, &ctrls));
> >>>       fail_on_test(!doioctl(node, VIDIOC_TRY_EXT_CTRLS, &ctrls));
> >>> -     fail_on_test(doioctl(node, VIDIOC_G_EXT_CTRLS, &ctrls));
> >>> +     if (multiple_classes)
> >>> +             fail_on_test(!doioctl(node, VIDIOC_G_EXT_CTRLS, &ctrls));
> >>> +     else
> >>> +             fail_on_test(doioctl(node, VIDIOC_G_EXT_CTRLS, &ctrls));
> >>>       return 0;
> >>>  }
> >>>
> >>>
> >>
> >
> >
>
diff mbox series

Patch

diff --git a/utils/v4l2-compliance/v4l2-test-controls.cpp b/utils/v4l2-compliance/v4l2-test-controls.cpp
index 9a68b7e847b0..79982bc15054 100644
--- a/utils/v4l2-compliance/v4l2-test-controls.cpp
+++ b/utils/v4l2-compliance/v4l2-test-controls.cpp
@@ -793,7 +793,10 @@  int testExtendedControls(struct node *node)
 	ctrls.which = V4L2_CTRL_WHICH_DEF_VAL;
 	fail_on_test(!doioctl(node, VIDIOC_S_EXT_CTRLS, &ctrls));
 	fail_on_test(!doioctl(node, VIDIOC_TRY_EXT_CTRLS, &ctrls));
-	fail_on_test(doioctl(node, VIDIOC_G_EXT_CTRLS, &ctrls));
+	if (multiple_classes)
+		fail_on_test(!doioctl(node, VIDIOC_G_EXT_CTRLS, &ctrls));
+	else
+		fail_on_test(doioctl(node, VIDIOC_G_EXT_CTRLS, &ctrls));
 	return 0;
 }