[PATCH 9/9] media: uvcvideo: Support granular power saving for compat syscalls

Ricardo Ribalda posted 9 patches 8 months, 2 weeks ago
There is a newer version of this series
[PATCH 9/9] media: uvcvideo: Support granular power saving for compat syscalls
Posted by Ricardo Ribalda 8 months, 2 weeks ago
Right now we cannot support granular power saving on compat syscalls
because the VIDIOC_*32 NRs defines are not accessible to drivers.

Use the video_translate_cmd() helper to convert the compat syscall NRs
into syscall NRs.

Signed-off-by: Ricardo Ribalda <ribalda@chromium.org>
---
 drivers/media/usb/uvc/uvc_v4l2.c     | 9 ++-------
 drivers/media/v4l2-core/v4l2-ioctl.c | 3 ++-
 include/media/v4l2-ioctl.h           | 1 +
 3 files changed, 5 insertions(+), 8 deletions(-)

diff --git a/drivers/media/usb/uvc/uvc_v4l2.c b/drivers/media/usb/uvc/uvc_v4l2.c
index fcb1b79c214849ce4da96a86a688d777b32cc688..048ee7e01808c8944f9bd46e5df2931b9c146ad5 100644
--- a/drivers/media/usb/uvc/uvc_v4l2.c
+++ b/drivers/media/usb/uvc/uvc_v4l2.c
@@ -1282,15 +1282,10 @@ static long uvc_v4l2_pm_ioctl(struct file *file,
 static long uvc_v4l2_unlocked_ioctl(struct file *file,
 				    unsigned int cmd, unsigned long arg)
 {
-	/*
-	 * For now, we do not support granular power saving for compat
-	 * syscalls.
-	 */
-	if (in_compat_syscall())
-		return uvc_v4l2_pm_ioctl(file, cmd, arg);
+	unsigned int converted_cmd = video_translate_cmd(cmd);
 
 	/* The following IOCTLs do need to turn on the camera. */
-	switch (cmd) {
+	switch (converted_cmd) {
 	case UVCIOC_CTRL_QUERY:
 	case VIDIOC_G_CTRL:
 	case VIDIOC_G_EXT_CTRLS:
diff --git a/drivers/media/v4l2-core/v4l2-ioctl.c b/drivers/media/v4l2-core/v4l2-ioctl.c
index 650dc1956f73d2f1943b56c42140c7b8d757259f..6fbd28f911cf23eec43ef1adcf64bd46ef067c81 100644
--- a/drivers/media/v4l2-core/v4l2-ioctl.c
+++ b/drivers/media/v4l2-core/v4l2-ioctl.c
@@ -3245,7 +3245,7 @@ static int check_array_args(unsigned int cmd, void *parg, size_t *array_size,
 	return ret;
 }
 
-static unsigned int video_translate_cmd(unsigned int cmd)
+unsigned int video_translate_cmd(unsigned int cmd)
 {
 #if !defined(CONFIG_64BIT) && defined(CONFIG_COMPAT_32BIT_TIME)
 	switch (cmd) {
@@ -3266,6 +3266,7 @@ static unsigned int video_translate_cmd(unsigned int cmd)
 
 	return cmd;
 }
+EXPORT_SYMBOL(video_translate_cmd);
 
 static int video_get_user(void __user *arg, void *parg,
 			  unsigned int real_cmd, unsigned int cmd,
diff --git a/include/media/v4l2-ioctl.h b/include/media/v4l2-ioctl.h
index c6ec87e88dfef9e6cfe1d1fb587c1600882fb14d..437b9f90714c62e0ba434ce47391ef64d88110aa 100644
--- a/include/media/v4l2-ioctl.h
+++ b/include/media/v4l2-ioctl.h
@@ -687,6 +687,7 @@ int v4l2_compat_get_array_args(struct file *file, void *mbuf,
 int v4l2_compat_put_array_args(struct file *file, void __user *user_ptr,
 			       void *mbuf, size_t array_size,
 			       unsigned int cmd, void *arg);
+unsigned int video_translate_cmd(unsigned int cmd);
 
 /**
  * typedef v4l2_kioctl - Typedef used to pass an ioctl handler.

-- 
2.49.0.1266.g31b7d2e469-goog
Re: [PATCH 9/9] media: uvcvideo: Support granular power saving for compat syscalls
Posted by Hans de Goede 8 months, 1 week ago
Hi Ricardo,

On 28-May-25 19:58, Ricardo Ribalda wrote:
> Right now we cannot support granular power saving on compat syscalls
> because the VIDIOC_*32 NRs defines are not accessible to drivers.
> 
> Use the video_translate_cmd() helper to convert the compat syscall NRs
> into syscall NRs.
> 
> Signed-off-by: Ricardo Ribalda <ribalda@chromium.org>
> ---
>  drivers/media/usb/uvc/uvc_v4l2.c     | 9 ++-------
>  drivers/media/v4l2-core/v4l2-ioctl.c | 3 ++-
>  include/media/v4l2-ioctl.h           | 1 +
>  3 files changed, 5 insertions(+), 8 deletions(-)
> 
> diff --git a/drivers/media/usb/uvc/uvc_v4l2.c b/drivers/media/usb/uvc/uvc_v4l2.c
> index fcb1b79c214849ce4da96a86a688d777b32cc688..048ee7e01808c8944f9bd46e5df2931b9c146ad5 100644
> --- a/drivers/media/usb/uvc/uvc_v4l2.c
> +++ b/drivers/media/usb/uvc/uvc_v4l2.c
> @@ -1282,15 +1282,10 @@ static long uvc_v4l2_pm_ioctl(struct file *file,
>  static long uvc_v4l2_unlocked_ioctl(struct file *file,
>  				    unsigned int cmd, unsigned long arg)
>  {
> -	/*
> -	 * For now, we do not support granular power saving for compat
> -	 * syscalls.
> -	 */
> -	if (in_compat_syscall())
> -		return uvc_v4l2_pm_ioctl(file, cmd, arg);
> +	unsigned int converted_cmd = video_translate_cmd(cmd);

It looks like something went wrong here and you did not test-compile this?
video_translate_cmd() is private to drivers/media/v4l2-core/v4l2-ioctl.c
so this should not compile.

You can use v4l2_compat_translate_cmd() but only when CONFIG_COMPAT is set
otherwise that symbol is not available.

Regards,

Hans



>  
>  	/* The following IOCTLs do need to turn on the camera. */
> -	switch (cmd) {
> +	switch (converted_cmd) {
>  	case UVCIOC_CTRL_QUERY:
>  	case VIDIOC_G_CTRL:
>  	case VIDIOC_G_EXT_CTRLS:
> diff --git a/drivers/media/v4l2-core/v4l2-ioctl.c b/drivers/media/v4l2-core/v4l2-ioctl.c
> index 650dc1956f73d2f1943b56c42140c7b8d757259f..6fbd28f911cf23eec43ef1adcf64bd46ef067c81 100644
> --- a/drivers/media/v4l2-core/v4l2-ioctl.c
> +++ b/drivers/media/v4l2-core/v4l2-ioctl.c
> @@ -3245,7 +3245,7 @@ static int check_array_args(unsigned int cmd, void *parg, size_t *array_size,
>  	return ret;
>  }
>  
> -static unsigned int video_translate_cmd(unsigned int cmd)
> +unsigned int video_translate_cmd(unsigned int cmd)
>  {
>  #if !defined(CONFIG_64BIT) && defined(CONFIG_COMPAT_32BIT_TIME)
>  	switch (cmd) {
> @@ -3266,6 +3266,7 @@ static unsigned int video_translate_cmd(unsigned int cmd)
>  
>  	return cmd;
>  }
> +EXPORT_SYMBOL(video_translate_cmd);
>  
>  static int video_get_user(void __user *arg, void *parg,
>  			  unsigned int real_cmd, unsigned int cmd,
> diff --git a/include/media/v4l2-ioctl.h b/include/media/v4l2-ioctl.h
> index c6ec87e88dfef9e6cfe1d1fb587c1600882fb14d..437b9f90714c62e0ba434ce47391ef64d88110aa 100644
> --- a/include/media/v4l2-ioctl.h
> +++ b/include/media/v4l2-ioctl.h
> @@ -687,6 +687,7 @@ int v4l2_compat_get_array_args(struct file *file, void *mbuf,
>  int v4l2_compat_put_array_args(struct file *file, void __user *user_ptr,
>  			       void *mbuf, size_t array_size,
>  			       unsigned int cmd, void *arg);
> +unsigned int video_translate_cmd(unsigned int cmd);
>  
>  /**
>   * typedef v4l2_kioctl - Typedef used to pass an ioctl handler.
>
Re: [PATCH 9/9] media: uvcvideo: Support granular power saving for compat syscalls
Posted by Ricardo Ribalda 8 months, 1 week ago
Hi Hans

On Mon, 2 Jun 2025 at 12:11, Hans de Goede <hansg@kernel.org> wrote:
>
> Hi Ricardo,
>
> On 28-May-25 19:58, Ricardo Ribalda wrote:
> > Right now we cannot support granular power saving on compat syscalls
> > because the VIDIOC_*32 NRs defines are not accessible to drivers.
> >
> > Use the video_translate_cmd() helper to convert the compat syscall NRs
> > into syscall NRs.
> >
> > Signed-off-by: Ricardo Ribalda <ribalda@chromium.org>
> > ---
> >  drivers/media/usb/uvc/uvc_v4l2.c     | 9 ++-------
> >  drivers/media/v4l2-core/v4l2-ioctl.c | 3 ++-
> >  include/media/v4l2-ioctl.h           | 1 +
> >  3 files changed, 5 insertions(+), 8 deletions(-)
> >
> > diff --git a/drivers/media/usb/uvc/uvc_v4l2.c b/drivers/media/usb/uvc/uvc_v4l2.c
> > index fcb1b79c214849ce4da96a86a688d777b32cc688..048ee7e01808c8944f9bd46e5df2931b9c146ad5 100644
> > --- a/drivers/media/usb/uvc/uvc_v4l2.c
> > +++ b/drivers/media/usb/uvc/uvc_v4l2.c
> > @@ -1282,15 +1282,10 @@ static long uvc_v4l2_pm_ioctl(struct file *file,
> >  static long uvc_v4l2_unlocked_ioctl(struct file *file,
> >                                   unsigned int cmd, unsigned long arg)
> >  {
> > -     /*
> > -      * For now, we do not support granular power saving for compat
> > -      * syscalls.
> > -      */
> > -     if (in_compat_syscall())
> > -             return uvc_v4l2_pm_ioctl(file, cmd, arg);
> > +     unsigned int converted_cmd = video_translate_cmd(cmd);
>
> It looks like something went wrong here and you did not test-compile this?
> video_translate_cmd() is private to drivers/media/v4l2-core/v4l2-ioctl.c
> so this should not compile.

Hmm... Actually I am pretty sure that I tested it on real hardware.

Did you miss the EXPORT_SYMBOL() on the patch?

>
> You can use v4l2_compat_translate_cmd() but only when CONFIG_COMPAT is set
> otherwise that symbol is not available.

I tried now without CONFIG_COMPAT and it built fine.

>
> Regards,
>
> Hans
>
>
>
> >
> >       /* The following IOCTLs do need to turn on the camera. */
> > -     switch (cmd) {
> > +     switch (converted_cmd) {
> >       case UVCIOC_CTRL_QUERY:
> >       case VIDIOC_G_CTRL:
> >       case VIDIOC_G_EXT_CTRLS:
> > diff --git a/drivers/media/v4l2-core/v4l2-ioctl.c b/drivers/media/v4l2-core/v4l2-ioctl.c
> > index 650dc1956f73d2f1943b56c42140c7b8d757259f..6fbd28f911cf23eec43ef1adcf64bd46ef067c81 100644
> > --- a/drivers/media/v4l2-core/v4l2-ioctl.c
> > +++ b/drivers/media/v4l2-core/v4l2-ioctl.c
> > @@ -3245,7 +3245,7 @@ static int check_array_args(unsigned int cmd, void *parg, size_t *array_size,
> >       return ret;
> >  }
> >
> > -static unsigned int video_translate_cmd(unsigned int cmd)
> > +unsigned int video_translate_cmd(unsigned int cmd)
> >  {
> >  #if !defined(CONFIG_64BIT) && defined(CONFIG_COMPAT_32BIT_TIME)
> >       switch (cmd) {
> > @@ -3266,6 +3266,7 @@ static unsigned int video_translate_cmd(unsigned int cmd)
> >
> >       return cmd;
> >  }
> > +EXPORT_SYMBOL(video_translate_cmd);
> >
> >  static int video_get_user(void __user *arg, void *parg,
> >                         unsigned int real_cmd, unsigned int cmd,
> > diff --git a/include/media/v4l2-ioctl.h b/include/media/v4l2-ioctl.h
> > index c6ec87e88dfef9e6cfe1d1fb587c1600882fb14d..437b9f90714c62e0ba434ce47391ef64d88110aa 100644
> > --- a/include/media/v4l2-ioctl.h
> > +++ b/include/media/v4l2-ioctl.h
> > @@ -687,6 +687,7 @@ int v4l2_compat_get_array_args(struct file *file, void *mbuf,
> >  int v4l2_compat_put_array_args(struct file *file, void __user *user_ptr,
> >                              void *mbuf, size_t array_size,
> >                              unsigned int cmd, void *arg);
> > +unsigned int video_translate_cmd(unsigned int cmd);
> >
> >  /**
> >   * typedef v4l2_kioctl - Typedef used to pass an ioctl handler.
> >
>


-- 
Ricardo Ribalda
Re: [PATCH 9/9] media: uvcvideo: Support granular power saving for compat syscalls
Posted by Hans de Goede 8 months, 1 week ago
Hi Ricardo,

On 2-Jun-25 12:27, Ricardo Ribalda wrote:
> Hi Hans
> 
> On Mon, 2 Jun 2025 at 12:11, Hans de Goede <hansg@kernel.org> wrote:
>>
>> Hi Ricardo,
>>
>> On 28-May-25 19:58, Ricardo Ribalda wrote:
>>> Right now we cannot support granular power saving on compat syscalls
>>> because the VIDIOC_*32 NRs defines are not accessible to drivers.
>>>
>>> Use the video_translate_cmd() helper to convert the compat syscall NRs
>>> into syscall NRs.
>>>
>>> Signed-off-by: Ricardo Ribalda <ribalda@chromium.org>
>>> ---
>>>  drivers/media/usb/uvc/uvc_v4l2.c     | 9 ++-------
>>>  drivers/media/v4l2-core/v4l2-ioctl.c | 3 ++-
>>>  include/media/v4l2-ioctl.h           | 1 +
>>>  3 files changed, 5 insertions(+), 8 deletions(-)
>>>
>>> diff --git a/drivers/media/usb/uvc/uvc_v4l2.c b/drivers/media/usb/uvc/uvc_v4l2.c
>>> index fcb1b79c214849ce4da96a86a688d777b32cc688..048ee7e01808c8944f9bd46e5df2931b9c146ad5 100644
>>> --- a/drivers/media/usb/uvc/uvc_v4l2.c
>>> +++ b/drivers/media/usb/uvc/uvc_v4l2.c
>>> @@ -1282,15 +1282,10 @@ static long uvc_v4l2_pm_ioctl(struct file *file,
>>>  static long uvc_v4l2_unlocked_ioctl(struct file *file,
>>>                                   unsigned int cmd, unsigned long arg)
>>>  {
>>> -     /*
>>> -      * For now, we do not support granular power saving for compat
>>> -      * syscalls.
>>> -      */
>>> -     if (in_compat_syscall())
>>> -             return uvc_v4l2_pm_ioctl(file, cmd, arg);
>>> +     unsigned int converted_cmd = video_translate_cmd(cmd);
>>
>> It looks like something went wrong here and you did not test-compile this?
>> video_translate_cmd() is private to drivers/media/v4l2-core/v4l2-ioctl.c
>> so this should not compile.
> 
> Hmm... Actually I am pretty sure that I tested it on real hardware.
> 
> Did you miss the EXPORT_SYMBOL() on the patch?

Ah yes I did miss that, sorry.

For the next time please split core changes out into their own
separate patches.

In this case I think the core changes are not necessary instead
you can just do:

	unsigned int converted_cmd = cmd;

#ifdef CONFIG_COMPAT
	converted_cmd = v4l2_compat_translate_cmd(cmd);
#endif

Regards,

Hans




> 
>>
>> You can use v4l2_compat_translate_cmd() but only when CONFIG_COMPAT is set
>> otherwise that symbol is not available.
> 
> I tried now without CONFIG_COMPAT and it built fine.
> 
>>
>> Regards,
>>
>> Hans
>>
>>
>>
>>>
>>>       /* The following IOCTLs do need to turn on the camera. */
>>> -     switch (cmd) {
>>> +     switch (converted_cmd) {
>>>       case UVCIOC_CTRL_QUERY:
>>>       case VIDIOC_G_CTRL:
>>>       case VIDIOC_G_EXT_CTRLS:
>>> diff --git a/drivers/media/v4l2-core/v4l2-ioctl.c b/drivers/media/v4l2-core/v4l2-ioctl.c
>>> index 650dc1956f73d2f1943b56c42140c7b8d757259f..6fbd28f911cf23eec43ef1adcf64bd46ef067c81 100644
>>> --- a/drivers/media/v4l2-core/v4l2-ioctl.c
>>> +++ b/drivers/media/v4l2-core/v4l2-ioctl.c
>>> @@ -3245,7 +3245,7 @@ static int check_array_args(unsigned int cmd, void *parg, size_t *array_size,
>>>       return ret;
>>>  }
>>>
>>> -static unsigned int video_translate_cmd(unsigned int cmd)
>>> +unsigned int video_translate_cmd(unsigned int cmd)
>>>  {
>>>  #if !defined(CONFIG_64BIT) && defined(CONFIG_COMPAT_32BIT_TIME)
>>>       switch (cmd) {
>>> @@ -3266,6 +3266,7 @@ static unsigned int video_translate_cmd(unsigned int cmd)
>>>
>>>       return cmd;
>>>  }
>>> +EXPORT_SYMBOL(video_translate_cmd);
>>>
>>>  static int video_get_user(void __user *arg, void *parg,
>>>                         unsigned int real_cmd, unsigned int cmd,
>>> diff --git a/include/media/v4l2-ioctl.h b/include/media/v4l2-ioctl.h
>>> index c6ec87e88dfef9e6cfe1d1fb587c1600882fb14d..437b9f90714c62e0ba434ce47391ef64d88110aa 100644
>>> --- a/include/media/v4l2-ioctl.h
>>> +++ b/include/media/v4l2-ioctl.h
>>> @@ -687,6 +687,7 @@ int v4l2_compat_get_array_args(struct file *file, void *mbuf,
>>>  int v4l2_compat_put_array_args(struct file *file, void __user *user_ptr,
>>>                              void *mbuf, size_t array_size,
>>>                              unsigned int cmd, void *arg);
>>> +unsigned int video_translate_cmd(unsigned int cmd);
>>>
>>>  /**
>>>   * typedef v4l2_kioctl - Typedef used to pass an ioctl handler.
>>>
>>
> 
>
Re: [PATCH 9/9] media: uvcvideo: Support granular power saving for compat syscalls
Posted by Ricardo Ribalda 8 months, 1 week ago
On Mon, 2 Jun 2025 at 13:07, Hans de Goede <hansg@kernel.org> wrote:
>
> Hi Ricardo,
>
> On 2-Jun-25 12:27, Ricardo Ribalda wrote:
> > Hi Hans
> >
> > On Mon, 2 Jun 2025 at 12:11, Hans de Goede <hansg@kernel.org> wrote:
> >>
> >> Hi Ricardo,
> >>
> >> On 28-May-25 19:58, Ricardo Ribalda wrote:
> >>> Right now we cannot support granular power saving on compat syscalls
> >>> because the VIDIOC_*32 NRs defines are not accessible to drivers.
> >>>
> >>> Use the video_translate_cmd() helper to convert the compat syscall NRs
> >>> into syscall NRs.
> >>>
> >>> Signed-off-by: Ricardo Ribalda <ribalda@chromium.org>
> >>> ---
> >>>  drivers/media/usb/uvc/uvc_v4l2.c     | 9 ++-------
> >>>  drivers/media/v4l2-core/v4l2-ioctl.c | 3 ++-
> >>>  include/media/v4l2-ioctl.h           | 1 +
> >>>  3 files changed, 5 insertions(+), 8 deletions(-)
> >>>
> >>> diff --git a/drivers/media/usb/uvc/uvc_v4l2.c b/drivers/media/usb/uvc/uvc_v4l2.c
> >>> index fcb1b79c214849ce4da96a86a688d777b32cc688..048ee7e01808c8944f9bd46e5df2931b9c146ad5 100644
> >>> --- a/drivers/media/usb/uvc/uvc_v4l2.c
> >>> +++ b/drivers/media/usb/uvc/uvc_v4l2.c
> >>> @@ -1282,15 +1282,10 @@ static long uvc_v4l2_pm_ioctl(struct file *file,
> >>>  static long uvc_v4l2_unlocked_ioctl(struct file *file,
> >>>                                   unsigned int cmd, unsigned long arg)
> >>>  {
> >>> -     /*
> >>> -      * For now, we do not support granular power saving for compat
> >>> -      * syscalls.
> >>> -      */
> >>> -     if (in_compat_syscall())
> >>> -             return uvc_v4l2_pm_ioctl(file, cmd, arg);
> >>> +     unsigned int converted_cmd = video_translate_cmd(cmd);
> >>
> >> It looks like something went wrong here and you did not test-compile this?
> >> video_translate_cmd() is private to drivers/media/v4l2-core/v4l2-ioctl.c
> >> so this should not compile.
> >
> > Hmm... Actually I am pretty sure that I tested it on real hardware.
> >
> > Did you miss the EXPORT_SYMBOL() on the patch?
>
> Ah yes I did miss that, sorry.

My bad, I doubt it till the last second if I should split it or not :)

>
> For the next time please split core changes out into their own
> separate patches.
>
> In this case I think the core changes are not necessary instead
> you can just do:
>
>         unsigned int converted_cmd = cmd;
>
> #ifdef CONFIG_COMPAT
>         converted_cmd = v4l2_compat_translate_cmd(cmd);
> #endif

I believe this should work as well:

unsigned int converted_cmd = cmd;
if (in_compat_syscall())
  converted_cmd = v4l2_compat_translate_cmd(cmd);

the compiler knows that CONFIG_COMPAT=n means in_compat_syscall() will
be always fails.

If it is ok with you (and it actually works :) ) I will use this version.

Regards

>
> Regards,
>
> Hans
>
>
>
>
> >
> >>
> >> You can use v4l2_compat_translate_cmd() but only when CONFIG_COMPAT is set
> >> otherwise that symbol is not available.
> >
> > I tried now without CONFIG_COMPAT and it built fine.
> >
> >>
> >> Regards,
> >>
> >> Hans
> >>
> >>
> >>
> >>>
> >>>       /* The following IOCTLs do need to turn on the camera. */
> >>> -     switch (cmd) {
> >>> +     switch (converted_cmd) {
> >>>       case UVCIOC_CTRL_QUERY:
> >>>       case VIDIOC_G_CTRL:
> >>>       case VIDIOC_G_EXT_CTRLS:
> >>> diff --git a/drivers/media/v4l2-core/v4l2-ioctl.c b/drivers/media/v4l2-core/v4l2-ioctl.c
> >>> index 650dc1956f73d2f1943b56c42140c7b8d757259f..6fbd28f911cf23eec43ef1adcf64bd46ef067c81 100644
> >>> --- a/drivers/media/v4l2-core/v4l2-ioctl.c
> >>> +++ b/drivers/media/v4l2-core/v4l2-ioctl.c
> >>> @@ -3245,7 +3245,7 @@ static int check_array_args(unsigned int cmd, void *parg, size_t *array_size,
> >>>       return ret;
> >>>  }
> >>>
> >>> -static unsigned int video_translate_cmd(unsigned int cmd)
> >>> +unsigned int video_translate_cmd(unsigned int cmd)
> >>>  {
> >>>  #if !defined(CONFIG_64BIT) && defined(CONFIG_COMPAT_32BIT_TIME)
> >>>       switch (cmd) {
> >>> @@ -3266,6 +3266,7 @@ static unsigned int video_translate_cmd(unsigned int cmd)
> >>>
> >>>       return cmd;
> >>>  }
> >>> +EXPORT_SYMBOL(video_translate_cmd);
> >>>
> >>>  static int video_get_user(void __user *arg, void *parg,
> >>>                         unsigned int real_cmd, unsigned int cmd,
> >>> diff --git a/include/media/v4l2-ioctl.h b/include/media/v4l2-ioctl.h
> >>> index c6ec87e88dfef9e6cfe1d1fb587c1600882fb14d..437b9f90714c62e0ba434ce47391ef64d88110aa 100644
> >>> --- a/include/media/v4l2-ioctl.h
> >>> +++ b/include/media/v4l2-ioctl.h
> >>> @@ -687,6 +687,7 @@ int v4l2_compat_get_array_args(struct file *file, void *mbuf,
> >>>  int v4l2_compat_put_array_args(struct file *file, void __user *user_ptr,
> >>>                              void *mbuf, size_t array_size,
> >>>                              unsigned int cmd, void *arg);
> >>> +unsigned int video_translate_cmd(unsigned int cmd);
> >>>
> >>>  /**
> >>>   * typedef v4l2_kioctl - Typedef used to pass an ioctl handler.
> >>>
> >>
> >
> >
>


-- 
Ricardo Ribalda
Re: [PATCH 9/9] media: uvcvideo: Support granular power saving for compat syscalls
Posted by Hans de Goede 8 months, 1 week ago
On 2-Jun-25 13:11, Ricardo Ribalda wrote:
> On Mon, 2 Jun 2025 at 13:07, Hans de Goede <hansg@kernel.org> wrote:
>>
>> Hi Ricardo,
>>
>> On 2-Jun-25 12:27, Ricardo Ribalda wrote:
>>> Hi Hans
>>>
>>> On Mon, 2 Jun 2025 at 12:11, Hans de Goede <hansg@kernel.org> wrote:
>>>>
>>>> Hi Ricardo,
>>>>
>>>> On 28-May-25 19:58, Ricardo Ribalda wrote:
>>>>> Right now we cannot support granular power saving on compat syscalls
>>>>> because the VIDIOC_*32 NRs defines are not accessible to drivers.
>>>>>
>>>>> Use the video_translate_cmd() helper to convert the compat syscall NRs
>>>>> into syscall NRs.
>>>>>
>>>>> Signed-off-by: Ricardo Ribalda <ribalda@chromium.org>
>>>>> ---
>>>>>  drivers/media/usb/uvc/uvc_v4l2.c     | 9 ++-------
>>>>>  drivers/media/v4l2-core/v4l2-ioctl.c | 3 ++-
>>>>>  include/media/v4l2-ioctl.h           | 1 +
>>>>>  3 files changed, 5 insertions(+), 8 deletions(-)
>>>>>
>>>>> diff --git a/drivers/media/usb/uvc/uvc_v4l2.c b/drivers/media/usb/uvc/uvc_v4l2.c
>>>>> index fcb1b79c214849ce4da96a86a688d777b32cc688..048ee7e01808c8944f9bd46e5df2931b9c146ad5 100644
>>>>> --- a/drivers/media/usb/uvc/uvc_v4l2.c
>>>>> +++ b/drivers/media/usb/uvc/uvc_v4l2.c
>>>>> @@ -1282,15 +1282,10 @@ static long uvc_v4l2_pm_ioctl(struct file *file,
>>>>>  static long uvc_v4l2_unlocked_ioctl(struct file *file,
>>>>>                                   unsigned int cmd, unsigned long arg)
>>>>>  {
>>>>> -     /*
>>>>> -      * For now, we do not support granular power saving for compat
>>>>> -      * syscalls.
>>>>> -      */
>>>>> -     if (in_compat_syscall())
>>>>> -             return uvc_v4l2_pm_ioctl(file, cmd, arg);
>>>>> +     unsigned int converted_cmd = video_translate_cmd(cmd);
>>>>
>>>> It looks like something went wrong here and you did not test-compile this?
>>>> video_translate_cmd() is private to drivers/media/v4l2-core/v4l2-ioctl.c
>>>> so this should not compile.
>>>
>>> Hmm... Actually I am pretty sure that I tested it on real hardware.
>>>
>>> Did you miss the EXPORT_SYMBOL() on the patch?
>>
>> Ah yes I did miss that, sorry.
> 
> My bad, I doubt it till the last second if I should split it or not :)
> 
>>
>> For the next time please split core changes out into their own
>> separate patches.
>>
>> In this case I think the core changes are not necessary instead
>> you can just do:
>>
>>         unsigned int converted_cmd = cmd;
>>
>> #ifdef CONFIG_COMPAT
>>         converted_cmd = v4l2_compat_translate_cmd(cmd);
>> #endif
> 
> I believe this should work as well:
> 
> unsigned int converted_cmd = cmd;
> if (in_compat_syscall())
>   converted_cmd = v4l2_compat_translate_cmd(cmd);
> 
> the compiler knows that CONFIG_COMPAT=n means in_compat_syscall() will
> be always fails.
> 
> If it is ok with you (and it actually works :) ) I will use this version.

I agree that that is cleaner/better and I also think it should work,
so lets go with that.

Regards,

Hans



>>>> You can use v4l2_compat_translate_cmd() but only when CONFIG_COMPAT is set
>>>> otherwise that symbol is not available.
>>>
>>> I tried now without CONFIG_COMPAT and it built fine.
>>>
>>>>
>>>> Regards,
>>>>
>>>> Hans
>>>>
>>>>
>>>>
>>>>>
>>>>>       /* The following IOCTLs do need to turn on the camera. */
>>>>> -     switch (cmd) {
>>>>> +     switch (converted_cmd) {
>>>>>       case UVCIOC_CTRL_QUERY:
>>>>>       case VIDIOC_G_CTRL:
>>>>>       case VIDIOC_G_EXT_CTRLS:
>>>>> diff --git a/drivers/media/v4l2-core/v4l2-ioctl.c b/drivers/media/v4l2-core/v4l2-ioctl.c
>>>>> index 650dc1956f73d2f1943b56c42140c7b8d757259f..6fbd28f911cf23eec43ef1adcf64bd46ef067c81 100644
>>>>> --- a/drivers/media/v4l2-core/v4l2-ioctl.c
>>>>> +++ b/drivers/media/v4l2-core/v4l2-ioctl.c
>>>>> @@ -3245,7 +3245,7 @@ static int check_array_args(unsigned int cmd, void *parg, size_t *array_size,
>>>>>       return ret;
>>>>>  }
>>>>>
>>>>> -static unsigned int video_translate_cmd(unsigned int cmd)
>>>>> +unsigned int video_translate_cmd(unsigned int cmd)
>>>>>  {
>>>>>  #if !defined(CONFIG_64BIT) && defined(CONFIG_COMPAT_32BIT_TIME)
>>>>>       switch (cmd) {
>>>>> @@ -3266,6 +3266,7 @@ static unsigned int video_translate_cmd(unsigned int cmd)
>>>>>
>>>>>       return cmd;
>>>>>  }
>>>>> +EXPORT_SYMBOL(video_translate_cmd);
>>>>>
>>>>>  static int video_get_user(void __user *arg, void *parg,
>>>>>                         unsigned int real_cmd, unsigned int cmd,
>>>>> diff --git a/include/media/v4l2-ioctl.h b/include/media/v4l2-ioctl.h
>>>>> index c6ec87e88dfef9e6cfe1d1fb587c1600882fb14d..437b9f90714c62e0ba434ce47391ef64d88110aa 100644
>>>>> --- a/include/media/v4l2-ioctl.h
>>>>> +++ b/include/media/v4l2-ioctl.h
>>>>> @@ -687,6 +687,7 @@ int v4l2_compat_get_array_args(struct file *file, void *mbuf,
>>>>>  int v4l2_compat_put_array_args(struct file *file, void __user *user_ptr,
>>>>>                              void *mbuf, size_t array_size,
>>>>>                              unsigned int cmd, void *arg);
>>>>> +unsigned int video_translate_cmd(unsigned int cmd);
>>>>>
>>>>>  /**
>>>>>   * typedef v4l2_kioctl - Typedef used to pass an ioctl handler.
>>>>>
>>>>
>>>
>>>
>>
> 
>
Re: [PATCH 9/9] media: uvcvideo: Support granular power saving for compat syscalls
Posted by Ricardo Ribalda 8 months, 1 week ago
Hi Hans

On Mon, 2 Jun 2025 at 13:24, Hans de Goede <hansg@kernel.org> wrote:
>
> On 2-Jun-25 13:11, Ricardo Ribalda wrote:
> > On Mon, 2 Jun 2025 at 13:07, Hans de Goede <hansg@kernel.org> wrote:
> >>
> >> Hi Ricardo,
> >>
> >> On 2-Jun-25 12:27, Ricardo Ribalda wrote:
> >>> Hi Hans
> >>>
> >>> On Mon, 2 Jun 2025 at 12:11, Hans de Goede <hansg@kernel.org> wrote:
> >>>>
> >>>> Hi Ricardo,
> >>>>
> >>>> On 28-May-25 19:58, Ricardo Ribalda wrote:
> >>>>> Right now we cannot support granular power saving on compat syscalls
> >>>>> because the VIDIOC_*32 NRs defines are not accessible to drivers.
> >>>>>
> >>>>> Use the video_translate_cmd() helper to convert the compat syscall NRs
> >>>>> into syscall NRs.
> >>>>>
> >>>>> Signed-off-by: Ricardo Ribalda <ribalda@chromium.org>
> >>>>> ---
> >>>>>  drivers/media/usb/uvc/uvc_v4l2.c     | 9 ++-------
> >>>>>  drivers/media/v4l2-core/v4l2-ioctl.c | 3 ++-
> >>>>>  include/media/v4l2-ioctl.h           | 1 +
> >>>>>  3 files changed, 5 insertions(+), 8 deletions(-)
> >>>>>
> >>>>> diff --git a/drivers/media/usb/uvc/uvc_v4l2.c b/drivers/media/usb/uvc/uvc_v4l2.c
> >>>>> index fcb1b79c214849ce4da96a86a688d777b32cc688..048ee7e01808c8944f9bd46e5df2931b9c146ad5 100644
> >>>>> --- a/drivers/media/usb/uvc/uvc_v4l2.c
> >>>>> +++ b/drivers/media/usb/uvc/uvc_v4l2.c
> >>>>> @@ -1282,15 +1282,10 @@ static long uvc_v4l2_pm_ioctl(struct file *file,
> >>>>>  static long uvc_v4l2_unlocked_ioctl(struct file *file,
> >>>>>                                   unsigned int cmd, unsigned long arg)
> >>>>>  {
> >>>>> -     /*
> >>>>> -      * For now, we do not support granular power saving for compat
> >>>>> -      * syscalls.
> >>>>> -      */
> >>>>> -     if (in_compat_syscall())
> >>>>> -             return uvc_v4l2_pm_ioctl(file, cmd, arg);
> >>>>> +     unsigned int converted_cmd = video_translate_cmd(cmd);
> >>>>
> >>>> It looks like something went wrong here and you did not test-compile this?
> >>>> video_translate_cmd() is private to drivers/media/v4l2-core/v4l2-ioctl.c
> >>>> so this should not compile.
> >>>
> >>> Hmm... Actually I am pretty sure that I tested it on real hardware.
> >>>
> >>> Did you miss the EXPORT_SYMBOL() on the patch?
> >>
> >> Ah yes I did miss that, sorry.
> >
> > My bad, I doubt it till the last second if I should split it or not :)
> >
> >>
> >> For the next time please split core changes out into their own
> >> separate patches.
> >>
> >> In this case I think the core changes are not necessary instead
> >> you can just do:
> >>
> >>         unsigned int converted_cmd = cmd;
> >>
> >> #ifdef CONFIG_COMPAT
> >>         converted_cmd = v4l2_compat_translate_cmd(cmd);
> >> #endif
> >
> > I believe this should work as well:
> >
> > unsigned int converted_cmd = cmd;
> > if (in_compat_syscall())
> >   converted_cmd = v4l2_compat_translate_cmd(cmd);
> >
> > the compiler knows that CONFIG_COMPAT=n means in_compat_syscall() will
> > be always fails.
> >
> > If it is ok with you (and it actually works :) ) I will use this version.
>
> I agree that that is cleaner/better and I also think it should work,
> so lets go with that.

Actually, v4l2_compat_translate_cmd() does not seem to be EXPORT_SYMBOL()ed

So I still need to do some changes in the core.
(It also does not handle COMPAT_32BIT_TIME... but in this case it
seems to be the same).


Any preference between what to use: v4l2_compat_translate_cmd() vs
video_translate_cmd()?

Thanks!
>
> Regards,
>
> Hans
>
>
>
> >>>> You can use v4l2_compat_translate_cmd() but only when CONFIG_COMPAT is set
> >>>> otherwise that symbol is not available.
> >>>
> >>> I tried now without CONFIG_COMPAT and it built fine.
> >>>
> >>>>
> >>>> Regards,
> >>>>
> >>>> Hans
> >>>>
> >>>>
> >>>>
> >>>>>
> >>>>>       /* The following IOCTLs do need to turn on the camera. */
> >>>>> -     switch (cmd) {
> >>>>> +     switch (converted_cmd) {
> >>>>>       case UVCIOC_CTRL_QUERY:
> >>>>>       case VIDIOC_G_CTRL:
> >>>>>       case VIDIOC_G_EXT_CTRLS:
> >>>>> diff --git a/drivers/media/v4l2-core/v4l2-ioctl.c b/drivers/media/v4l2-core/v4l2-ioctl.c
> >>>>> index 650dc1956f73d2f1943b56c42140c7b8d757259f..6fbd28f911cf23eec43ef1adcf64bd46ef067c81 100644
> >>>>> --- a/drivers/media/v4l2-core/v4l2-ioctl.c
> >>>>> +++ b/drivers/media/v4l2-core/v4l2-ioctl.c
> >>>>> @@ -3245,7 +3245,7 @@ static int check_array_args(unsigned int cmd, void *parg, size_t *array_size,
> >>>>>       return ret;
> >>>>>  }
> >>>>>
> >>>>> -static unsigned int video_translate_cmd(unsigned int cmd)
> >>>>> +unsigned int video_translate_cmd(unsigned int cmd)
> >>>>>  {
> >>>>>  #if !defined(CONFIG_64BIT) && defined(CONFIG_COMPAT_32BIT_TIME)
> >>>>>       switch (cmd) {
> >>>>> @@ -3266,6 +3266,7 @@ static unsigned int video_translate_cmd(unsigned int cmd)
> >>>>>
> >>>>>       return cmd;
> >>>>>  }
> >>>>> +EXPORT_SYMBOL(video_translate_cmd);
> >>>>>
> >>>>>  static int video_get_user(void __user *arg, void *parg,
> >>>>>                         unsigned int real_cmd, unsigned int cmd,
> >>>>> diff --git a/include/media/v4l2-ioctl.h b/include/media/v4l2-ioctl.h
> >>>>> index c6ec87e88dfef9e6cfe1d1fb587c1600882fb14d..437b9f90714c62e0ba434ce47391ef64d88110aa 100644
> >>>>> --- a/include/media/v4l2-ioctl.h
> >>>>> +++ b/include/media/v4l2-ioctl.h
> >>>>> @@ -687,6 +687,7 @@ int v4l2_compat_get_array_args(struct file *file, void *mbuf,
> >>>>>  int v4l2_compat_put_array_args(struct file *file, void __user *user_ptr,
> >>>>>                              void *mbuf, size_t array_size,
> >>>>>                              unsigned int cmd, void *arg);
> >>>>> +unsigned int video_translate_cmd(unsigned int cmd);
> >>>>>
> >>>>>  /**
> >>>>>   * typedef v4l2_kioctl - Typedef used to pass an ioctl handler.
> >>>>>
> >>>>
> >>>
> >>>
> >>
> >
> >
>


-- 
Ricardo Ribalda
Re: [PATCH 9/9] media: uvcvideo: Support granular power saving for compat syscalls
Posted by Hans de Goede 8 months, 1 week ago
Hi,

On 2-Jun-25 13:40, Ricardo Ribalda wrote:
> Hi Hans
> 
> On Mon, 2 Jun 2025 at 13:24, Hans de Goede <hansg@kernel.org> wrote:
>>
>> On 2-Jun-25 13:11, Ricardo Ribalda wrote:
>>> On Mon, 2 Jun 2025 at 13:07, Hans de Goede <hansg@kernel.org> wrote:
>>>>
>>>> Hi Ricardo,
>>>>
>>>> On 2-Jun-25 12:27, Ricardo Ribalda wrote:
>>>>> Hi Hans
>>>>>
>>>>> On Mon, 2 Jun 2025 at 12:11, Hans de Goede <hansg@kernel.org> wrote:
>>>>>>
>>>>>> Hi Ricardo,
>>>>>>
>>>>>> On 28-May-25 19:58, Ricardo Ribalda wrote:
>>>>>>> Right now we cannot support granular power saving on compat syscalls
>>>>>>> because the VIDIOC_*32 NRs defines are not accessible to drivers.
>>>>>>>
>>>>>>> Use the video_translate_cmd() helper to convert the compat syscall NRs
>>>>>>> into syscall NRs.
>>>>>>>
>>>>>>> Signed-off-by: Ricardo Ribalda <ribalda@chromium.org>
>>>>>>> ---
>>>>>>>  drivers/media/usb/uvc/uvc_v4l2.c     | 9 ++-------
>>>>>>>  drivers/media/v4l2-core/v4l2-ioctl.c | 3 ++-
>>>>>>>  include/media/v4l2-ioctl.h           | 1 +
>>>>>>>  3 files changed, 5 insertions(+), 8 deletions(-)
>>>>>>>
>>>>>>> diff --git a/drivers/media/usb/uvc/uvc_v4l2.c b/drivers/media/usb/uvc/uvc_v4l2.c
>>>>>>> index fcb1b79c214849ce4da96a86a688d777b32cc688..048ee7e01808c8944f9bd46e5df2931b9c146ad5 100644
>>>>>>> --- a/drivers/media/usb/uvc/uvc_v4l2.c
>>>>>>> +++ b/drivers/media/usb/uvc/uvc_v4l2.c
>>>>>>> @@ -1282,15 +1282,10 @@ static long uvc_v4l2_pm_ioctl(struct file *file,
>>>>>>>  static long uvc_v4l2_unlocked_ioctl(struct file *file,
>>>>>>>                                   unsigned int cmd, unsigned long arg)
>>>>>>>  {
>>>>>>> -     /*
>>>>>>> -      * For now, we do not support granular power saving for compat
>>>>>>> -      * syscalls.
>>>>>>> -      */
>>>>>>> -     if (in_compat_syscall())
>>>>>>> -             return uvc_v4l2_pm_ioctl(file, cmd, arg);
>>>>>>> +     unsigned int converted_cmd = video_translate_cmd(cmd);
>>>>>>
>>>>>> It looks like something went wrong here and you did not test-compile this?
>>>>>> video_translate_cmd() is private to drivers/media/v4l2-core/v4l2-ioctl.c
>>>>>> so this should not compile.
>>>>>
>>>>> Hmm... Actually I am pretty sure that I tested it on real hardware.
>>>>>
>>>>> Did you miss the EXPORT_SYMBOL() on the patch?
>>>>
>>>> Ah yes I did miss that, sorry.
>>>
>>> My bad, I doubt it till the last second if I should split it or not :)
>>>
>>>>
>>>> For the next time please split core changes out into their own
>>>> separate patches.
>>>>
>>>> In this case I think the core changes are not necessary instead
>>>> you can just do:
>>>>
>>>>         unsigned int converted_cmd = cmd;
>>>>
>>>> #ifdef CONFIG_COMPAT
>>>>         converted_cmd = v4l2_compat_translate_cmd(cmd);
>>>> #endif
>>>
>>> I believe this should work as well:
>>>
>>> unsigned int converted_cmd = cmd;
>>> if (in_compat_syscall())
>>>   converted_cmd = v4l2_compat_translate_cmd(cmd);
>>>
>>> the compiler knows that CONFIG_COMPAT=n means in_compat_syscall() will
>>> be always fails.
>>>
>>> If it is ok with you (and it actually works :) ) I will use this version.
>>
>> I agree that that is cleaner/better and I also think it should work,
>> so lets go with that.
> 
> Actually, v4l2_compat_translate_cmd() does not seem to be EXPORT_SYMBOL()ed
> 
> So I still need to do some changes in the core.
> (It also does not handle COMPAT_32BIT_TIME... but in this case it
> seems to be the same).
> 
> 
> Any preference between what to use: v4l2_compat_translate_cmd() vs
> video_translate_cmd()?

v4l2_compat_translate_cmd() is already exposed in include/media/v4l2-ioctl.h
so I think it is best to go with that function.

Regards,

Hans