[libcamera-devel] [PATCH v2] libcamera: device_enumerator: Don't stop if one device fails

Laurent Pinchart laurent.pinchart at ideasonboard.com
Mon Feb 17 12:03:24 CET 2020


If one device fails to enumerate, which isn't supposed to happen under
normal conditions, both the sysfs and the udev enumerators stop
enumeration of further devices. This potentially prevents working
devices from being detected and handled. Fix it by skipping the faulty
device.

Signed-off-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>
---
Changes since v1:

- Add more warning messages to DeviceEnumeratorUdev
- Use media->deviceNode() and print the driver name where appropriate
---
 src/libcamera/device_enumerator_sysfs.cpp | 16 +++++++--------
 src/libcamera/device_enumerator_udev.cpp  | 25 ++++++++++++++++-------
 2 files changed, 26 insertions(+), 15 deletions(-)

diff --git a/src/libcamera/device_enumerator_sysfs.cpp b/src/libcamera/device_enumerator_sysfs.cpp
index ad26affb38a3..197ca235879b 100644
--- a/src/libcamera/device_enumerator_sysfs.cpp
+++ b/src/libcamera/device_enumerator_sysfs.cpp
@@ -33,7 +33,6 @@ int DeviceEnumeratorSysfs::enumerate()
 {
 	struct dirent *ent;
 	DIR *dir;
-	int ret = 0;
 
 	static const char * const sysfs_dirs[] = {
 		"/sys/subsystem/media/devices",
@@ -74,14 +73,15 @@ int DeviceEnumeratorSysfs::enumerate()
 		}
 
 		std::shared_ptr<MediaDevice> media = createDevice(devnode);
-		if (!media) {
-			ret = -ENODEV;
-			break;
-		}
+		if (!media)
+			continue;
 
 		if (populateMediaDevice(media) < 0) {
-			ret = -ENODEV;
-			break;
+			LOG(DeviceEnumerator, Warning)
+				<< "Failed to populate media device "
+				<< media->deviceNode()
+				<< " (" << media->driver() << "), skipping";
+			continue;
 		}
 
 		addDevice(media);
@@ -89,7 +89,7 @@ int DeviceEnumeratorSysfs::enumerate()
 
 	closedir(dir);
 
-	return ret;
+	return 0;
 }
 
 int DeviceEnumeratorSysfs::populateMediaDevice(const std::shared_ptr<MediaDevice> &media)
diff --git a/src/libcamera/device_enumerator_udev.cpp b/src/libcamera/device_enumerator_udev.cpp
index b2c5fd221dcd..87638c59761c 100644
--- a/src/libcamera/device_enumerator_udev.cpp
+++ b/src/libcamera/device_enumerator_udev.cpp
@@ -82,8 +82,15 @@ int DeviceEnumeratorUdev::addUdevDevice(struct udev_device *dev)
 			return -ENODEV;
 
 		int ret = populateMediaDevice(media);
-		if (ret == 0)
-			addDevice(media);
+		if (ret < 0) {
+			LOG(DeviceEnumerator, Warning)
+				<< "Failed to populate media device "
+				<< media->deviceNode()
+				<< " (" << media->driver() << "), skipping";
+			return ret;
+		}
+
+		addDevice(media);
 		return 0;
 	}
 
@@ -141,14 +148,18 @@ int DeviceEnumeratorUdev::enumerate()
 		devnode = udev_device_get_devnode(dev);
 		if (!devnode) {
 			udev_device_unref(dev);
-			ret = -ENODEV;
-			goto done;
+			LOG(DeviceEnumerator, Warning)
+				<< "Failed to get device node for '"
+				<< syspath << "', skipping";
+			continue;
 		}
 
-		ret = addUdevDevice(dev);
+		if (addUdevDevice(dev) < 0)
+			LOG(DeviceEnumerator, Warning)
+				<< "Failed to add device for '"
+				<< syspath << "', skipping";
+
 		udev_device_unref(dev);
-		if (ret < 0)
-			break;
 	}
 
 done:
-- 
Regards,

Laurent Pinchart



More information about the libcamera-devel mailing list