Igt-dev Archive on lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH i-g-t v5] lib/drmtest: Create proper error report when open driver fails
@ 2026-05-06 16:09 Kamil Konieczny
  2026-05-06 18:08 ` ✓ i915.CI.BAT: success for lib/drmtest: Create proper error report when open driver fails (rev5) Patchwork
                   ` (5 more replies)
  0 siblings, 6 replies; 9+ messages in thread
From: Kamil Konieczny @ 2026-05-06 16:09 UTC (permalink / raw)
  To: igt-dev
  Cc: Kamil Konieczny, Ashutosh Dixit, Karthik B S,
	Zbigniew Kempczyński, Jani Nikula

When first try for opening driver fails then opening function is
searching for next available device. When that also fails
reporting is printing last errno which could mislead developer:

$ build/tests/kms_dp_aux_dev
IGT-Version: 2.3-NO-GIT (x86_64) (Linux: 6.17.0-19-generic x86_64)
Test requirement not met in function drm_open_driver, file ../lib/drmtest.c:754:
Test requirement: !(fd<0)
No known gpu found for chipset flags 0x4294965755 (any)
Last errno: 2, No such file or directory
SKIP (0.006s)

ls /dev/dri
by-path  card1  renderD128

The real problem here is lack of permissions as there was a card
but program could not open it. Break looking for a card as soon
as an error is different from ENOENT. It will create a proper
error report which will print:

Last errno: 13, Permission denied

v3: break only when errno actually happens in open() (Kamil)
v4: removed 'else', removed errno printing (Zbigniew)
v5: use explicit strerror() (Kamil)

Cc: Ashutosh Dixit <ashutosh.dixit@intel.com>
Cc: Karthik B S <karthik.b.s@intel.com>
Cc: "Zbigniew Kempczyński" <zbigniew.kempczynski@intel.com>
Cc: Jani Nikula <jani.nikula@intel.com>
Signed-off-by: Kamil Konieczny <kamil.konieczny@linux.intel.com>
---
 lib/drmtest.c          | 26 +++++++++++++++++++++-----
 lib/drmtest.h          |  2 +-
 lib/igt_sriov_device.c |  2 +-
 3 files changed, 23 insertions(+), 7 deletions(-)

diff --git a/lib/drmtest.c b/lib/drmtest.c
index 4a788ea7a..084737edf 100644
--- a/lib/drmtest.c
+++ b/lib/drmtest.c
@@ -323,6 +323,7 @@ static void log_opened_device_path(const char *device_path)
  * __drm_open_device:
  * @name: DRM node name
  * @chipset: OR'd flags for chipset to be opened
+ * @error: pointer for saving errno when open() fails
  *
  * Open a drm legacy device node with given @name and compatible with given
  * @chipset flag.
@@ -334,8 +335,10 @@ static void log_opened_device_path(const char *device_path)
  * name, even when driver was excluded by ANY or is not listed in known drivers.
  *
  * Returns: DRM file descriptor or -1 on error
+ *
+ * When open() succeeds, sets @error to zero otherwise to errno
  */
-int __drm_open_device(const char *name, unsigned int chipset)
+int __drm_open_device(const char *name, unsigned int chipset, int *error)
 {
 	const char *forced;
 	char dev_name[16] = "";
@@ -343,8 +346,15 @@ int __drm_open_device(const char *name, unsigned int chipset)
 	int fd;
 
 	fd = open(name, O_RDWR);
-	if (fd == -1)
+	if (fd == -1) {
+		if (error)
+			*error = errno;
+
 		return -1;
+	}
+
+	if (error)
+		*error = 0;
 
 	if (__get_drm_device_name(fd, dev_name, sizeof(dev_name) - 1) == -1)
 		goto err;
@@ -426,6 +436,7 @@ static bool _is_already_opened(const char *path, int as_idx)
 static int __search_and_open(const char *base, int offset, unsigned int chipset, int as_idx)
 {
 	const char *forced;
+	int err;
 
 	forced = forced_driver();
 	if (forced)
@@ -440,9 +451,14 @@ static int __search_and_open(const char *base, int offset, unsigned int chipset,
 		if (_is_already_opened(name, as_idx))
 			continue;
 
-		fd = __drm_open_device(name, chipset);
+		fd = __drm_open_device(name, chipset, &err);
 		if (fd != -1)
 			return fd;
+
+		if (err) {
+			igt_debug("Error at open %s %s\n", name, strerror(err));
+			break;
+		}
 	}
 
 	return -1;
@@ -500,13 +516,13 @@ static int __open_driver_exact(const char *name, unsigned int chipset)
 {
 	int fd;
 
-	fd = __drm_open_device(name, chipset);
+	fd = __drm_open_device(name, chipset, NULL);
 	if (fd != -1)
 		return fd;
 
 	drm_load_module(chipset);
 
-	return __drm_open_device(name, chipset);
+	return __drm_open_device(name, chipset, NULL);
 }
 
 /*
diff --git a/lib/drmtest.h b/lib/drmtest.h
index 37874d729..126feffda 100644
--- a/lib/drmtest.h
+++ b/lib/drmtest.h
@@ -117,7 +117,7 @@ unsigned int drm_get_chipset(int fd);
  */
 #define IS_ALIGNED(v, a)	(((v) & ((typeof(v))(a) - 1)) == 0)
 
-int __drm_open_device(const char *name, unsigned int chipset);
+int __drm_open_device(const char *name, unsigned int chipset, int *error);
 void drm_load_module(unsigned int chipset);
 int drm_open_driver_another(int idx, int chipset);
 int drm_open_driver(int chipset);
diff --git a/lib/igt_sriov_device.c b/lib/igt_sriov_device.c
index 1f4c3ac04..21d23298b 100644
--- a/lib/igt_sriov_device.c
+++ b/lib/igt_sriov_device.c
@@ -284,7 +284,7 @@ int igt_sriov_open_vf_drm_device(int pf, unsigned int vf_num)
 	if (!found)
 		return -1;
 
-	fd = __drm_open_device(dev_name, DRIVER_ANY);
+	fd = __drm_open_device(dev_name, DRIVER_ANY, NULL);
 	if (fd >= 0 && is_xe_device(fd))
 		xe_device_get(fd);
 
-- 
2.54.0


^ permalink raw reply related	[flat|nested] 9+ messages in thread

end of thread, other threads:[~2026-05-07 10:39 UTC | newest]

Thread overview: 9+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-05-06 16:09 [PATCH i-g-t v5] lib/drmtest: Create proper error report when open driver fails Kamil Konieczny
2026-05-06 18:08 ` ✓ i915.CI.BAT: success for lib/drmtest: Create proper error report when open driver fails (rev5) Patchwork
2026-05-06 18:21 ` ✓ Xe.CI.BAT: " Patchwork
2026-05-06 18:31 ` [PATCH i-g-t v5] lib/drmtest: Create proper error report when open driver fails Zbigniew Kempczyński
2026-05-06 19:53 ` ✗ Xe.CI.FULL: failure for lib/drmtest: Create proper error report when open driver fails (rev5) Patchwork
2026-05-07  0:10 ` ✗ i915.CI.Full: " Patchwork
2026-05-07  9:20 ` [PATCH i-g-t v5] lib/drmtest: Create proper error report when open driver fails Jani Nikula
2026-05-07 10:17   ` Kamil Konieczny
2026-05-07 10:39     ` Jani Nikula

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox