[PATCH 1/2] libcamera: v4l2_device: Retry ::ioctl on EINTR

Laurent Pinchart laurent.pinchart at ideasonboard.com
Fri Aug 2 14:01:50 CEST 2024


Hi Umang,

Thank you for the patch.

On Fri, Aug 02, 2024 at 12:54:15PM +0530, Umang Jain wrote:
> V4L userspace API documentation clearly mentions the handling of
> EINTR on ioctl(). Align with the xioctl() reference provided in [1].

I'll need a better rationale, cargo-cult programming isn't a good enough
explanation.

> Retry the ::ioctl() if failed with errno == EINTR. Use a do..while{}
> to check the return value of ::ioctl() and errno value. If the return
> value is found to be -1, and errno is set with EINTR, the ioctl() call
> should be retried.
> 
> [1]: https://docs.kernel.org/userspace-api/media/v4l/capture.c.html
> 
> Signed-off-by: Umang Jain <umang.jain at ideasonboard.com>
> ---
>  src/libcamera/v4l2_device.cpp | 8 +++++++-
>  1 file changed, 7 insertions(+), 1 deletion(-)
> 
> diff --git a/src/libcamera/v4l2_device.cpp b/src/libcamera/v4l2_device.cpp
> index 4a2048cf..2e92db0f 100644
> --- a/src/libcamera/v4l2_device.cpp
> +++ b/src/libcamera/v4l2_device.cpp
> @@ -454,11 +454,17 @@ int V4L2Device::setFrameStartEnabled(bool enable)
>   */
>  int V4L2Device::ioctl(unsigned long request, void *argp)
>  {
> +	int ret;
> +
> +	do {
> +		ret = ::ioctl(fd_.get(), request, argp);
> +	} while (ret == -1 && errno == EINTR);
> +
>  	/*
>  	 * Printing out an error message is usually better performed
>  	 * in the caller, which can provide more context.
>  	 */
> -	if (::ioctl(fd_.get(), request, argp) < 0)
> +	if (ret < 0)
>  		return -errno;
>  
>  	return 0;

-- 
Regards,

Laurent Pinchart


More information about the libcamera-devel mailing list