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;
