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
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.
>
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
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.
>>>
>>
>
>
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
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.
>>>>>
>>>>
>>>
>>>
>>
>
>
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
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
© 2016 - 2026 Red Hat, Inc.