* [PATCH v4 0/2] tools/igt_power: fix Xe crash via drmtest path helpers
@ 2026-05-28 10:20 ` Sebastian Brzezinka
0 siblings, 0 replies; 14+ messages in thread
From: Sebastian Brzezinka @ 2026-05-26 11:39 UTC (permalink / raw)
To: igt-dev
Cc: Sebastian Brzezinka, kamil.konieczny, krzysztof.karas,
zbigniew.kempczynski, x.wang
igt_power opened its DRM device fd with a raw open() call, which skips
the Xe device cache initialisation performed by the drmtest open
helpers. This caused an assertion failure in xe_query the moment
igt_power_open() called into is_intel_dgfx() on a Xe device.
The fix is split into two patches. The first adds __drm_open_driver_path()
to lib/drmtest, a non-asserting helper that validates the fd is a real DRM
device (DRM_IOCTL_VERSION) before initialising the Xe cache. The second
switches igt_power to that helper and its matching __drm_close_driver(),
completely removing the direct Xe dependency from the tool.
v4:
- rename drm_open_driver_path to __drm_open_driver_path (no asserts/requires)
- add DRM_IOCTL_VERSION check to verify fd is a DRM device before proceeding
- split the single patch into two: lib helper addition and igt_power
v3:
- remove redundant if (fd >= 0) guards on both close call sites
v2:
- move Xe cache setup/teardown out of igt_power
- add drm_open_driver_path() and use __drm_close_driver()
- drop the direct xe/xe_query dependency from igt_power
Sebastian Brzezinka (2):
lib/drmtest: add __drm_open_driver_path()
tools/igt_power: fix crash on Xe devices by initializing xe_device
cache
lib/drmtest.c | 30 ++++++++++++++++++++++++++++++
lib/drmtest.h | 1 +
tools/igt_power.c | 6 +++---
3 files changed, 34 insertions(+), 3 deletions(-)
--
2.53.0
^ permalink raw reply [flat|nested] 14+ messages in thread
* [PATCH v4 1/2] lib/drmtest: add __drm_open_driver_path()
@ 2026-05-28 10:20 ` Sebastian Brzezinka
0 siblings, 0 replies; 14+ messages in thread
From: Sebastian Brzezinka @ 2026-05-26 11:39 UTC (permalink / raw)
To: igt-dev
Cc: Sebastian Brzezinka, kamil.konieczny, krzysztof.karas,
zbigniew.kempczynski, x.wang
Add __drm_open_driver_path() as a path-based DRM open helper. It opens
the given path with O_RDWR, verifies the resulting fd is a DRM device by
issuing DRM_IOCTL_VERSION via __get_drm_device_name() before proceeding
(returning -1 and closing on failure), logs the opened device path, and
populates the xe_device cache when the device is Xe.
The __ prefix signals that the function does not throw assertions or
igt_require() calls, consistent with the existing __drm_open_driver*
family.
Signed-off-by: Sebastian Brzezinka <sebastian.brzezinka@intel.com>
---
lib/drmtest.c | 30 ++++++++++++++++++++++++++++++
lib/drmtest.h | 1 +
2 files changed, 31 insertions(+)
diff --git a/lib/drmtest.c b/lib/drmtest.c
index 4a788ea7a..7007569d2 100644
--- a/lib/drmtest.c
+++ b/lib/drmtest.c
@@ -379,6 +379,36 @@ err:
return -1;
}
+/**
+ * __drm_open_driver_path:
+ * @path: DRM device node path
+ *
+ * Opens @path with O_RDWR and populates the xe_device cache for Xe fds.
+ *
+ * Returns: DRM file descriptor or -1 on error
+ */
+int __drm_open_driver_path(const char *path)
+{
+ char name[12] = "";
+ int fd;
+
+ fd = open(path, O_RDWR);
+ if (fd < 0)
+ return -1;
+
+ if (__get_drm_device_name(fd, name, sizeof(name) - 1)) {
+ close(fd);
+ return -1;
+ }
+
+ log_opened_device_path(path);
+
+ if (is_xe_device(fd))
+ xe_device_get(fd);
+
+ return fd;
+}
+
static struct {
int fd;
struct stat stat;
diff --git a/lib/drmtest.h b/lib/drmtest.h
index 37874d729..305bbc86b 100644
--- a/lib/drmtest.h
+++ b/lib/drmtest.h
@@ -123,6 +123,7 @@ int drm_open_driver_another(int idx, int chipset);
int drm_open_driver(int chipset);
int drm_open_driver_master(int chipset);
int drm_open_driver_render(int chipset);
+int __drm_open_driver_path(const char *path);
int __drm_open_driver_another(int idx, int chipset);
int __drm_open_driver(int chipset);
int __drm_open_driver_render(int chipset);
--
2.53.0
^ permalink raw reply related [flat|nested] 14+ messages in thread
* [PATCH v4 2/2] tools/igt_power: fix crash on Xe devices by initializing xe_device cache
@ 2026-05-28 10:20 ` Sebastian Brzezinka
0 siblings, 0 replies; 14+ messages in thread
From: Sebastian Brzezinka @ 2026-05-26 11:39 UTC (permalink / raw)
To: igt-dev
Cc: Sebastian Brzezinka, kamil.konieczny, krzysztof.karas,
zbigniew.kempczynski, x.wang
Opening a DRM device with plain open() does not initialize the Xe device
cache. When igt_power_open() calls is_intel_dgfx() -> xe_has_vram(),
it reaches find_in_cache() which asserts the cache entry exists, causing
a crash on Xe devices with: xe_query-CRITICAL: Failed assertion: xe_dev
Switch both open/close call sites to __drm_open_driver_path() and
__drm_close_driver() so that Xe cache setup and teardown are paired with
the fd lifecycle, keeping igt_power free of Xe-specific handling.
Signed-off-by: Sebastian Brzezinka <sebastian.brzezinka@intel.com>
---
tools/igt_power.c | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/tools/igt_power.c b/tools/igt_power.c
index 6dd180d34..97d95e7b4 100644
--- a/tools/igt_power.c
+++ b/tools/igt_power.c
@@ -38,7 +38,7 @@ static bool prepare(struct measurement *m)
int ret, fd = -1;
if (m->drm_device) {
- fd = open(m->drm_device, O_RDONLY);
+ fd = __drm_open_driver_path(m->drm_device);
if (fd < 0) {
fprintf(stderr, "Unable to open drm device %s (%d)\n",
m->drm_device, -errno);
@@ -54,12 +54,12 @@ static bool prepare(struct measurement *m)
else
fprintf(stderr, "Unable to open rapl domain %s (%d)\n",
m->rapl_domain, ret);
- close(fd);
+ __drm_close_driver(fd);
return false;
}
- close(fd);
+ __drm_close_driver(fd);
}
return true;
--
2.53.0
^ permalink raw reply related [flat|nested] 14+ messages in thread
* Re: [PATCH v4 1/2] lib/drmtest: add __drm_open_driver_path()
2026-05-28 10:20 ` [PATCH i-g-t " Sebastian Brzezinka
(?)
(?)
@ 2026-05-26 11:51 ` Jani Nikula
2026-05-26 11:59 ` Sebastian Brzezinka
-1 siblings, 1 reply; 14+ messages in thread
From: Jani Nikula @ 2026-05-26 11:51 UTC (permalink / raw)
To: Sebastian Brzezinka, igt-dev
Cc: Sebastian Brzezinka, kamil.konieczny, krzysztof.karas,
zbigniew.kempczynski, x.wang
On Tue, 26 May 2026, Sebastian Brzezinka <sebastian.brzezinka@intel.com> wrote:
> Add __drm_open_driver_path() as a path-based DRM open helper. It opens
> the given path with O_RDWR, verifies the resulting fd is a DRM device by
> issuing DRM_IOCTL_VERSION via __get_drm_device_name() before proceeding
> (returning -1 and closing on failure), logs the opened device path, and
> populates the xe_device cache when the device is Xe.
>
> The __ prefix signals that the function does not throw assertions or
> igt_require() calls, consistent with the existing __drm_open_driver*
> family.
FWIW, I think the __ prefix should indicate "implementation detail,
don't call directly" or something along those lines.
I think it's problematic to encourage tests to call __ prefixed
functions.
BR,
Jani.
>
> Signed-off-by: Sebastian Brzezinka <sebastian.brzezinka@intel.com>
> ---
> lib/drmtest.c | 30 ++++++++++++++++++++++++++++++
> lib/drmtest.h | 1 +
> 2 files changed, 31 insertions(+)
>
> diff --git a/lib/drmtest.c b/lib/drmtest.c
> index 4a788ea7a..7007569d2 100644
> --- a/lib/drmtest.c
> +++ b/lib/drmtest.c
> @@ -379,6 +379,36 @@ err:
> return -1;
> }
>
> +/**
> + * __drm_open_driver_path:
> + * @path: DRM device node path
> + *
> + * Opens @path with O_RDWR and populates the xe_device cache for Xe fds.
> + *
> + * Returns: DRM file descriptor or -1 on error
> + */
> +int __drm_open_driver_path(const char *path)
> +{
> + char name[12] = "";
> + int fd;
> +
> + fd = open(path, O_RDWR);
> + if (fd < 0)
> + return -1;
> +
> + if (__get_drm_device_name(fd, name, sizeof(name) - 1)) {
> + close(fd);
> + return -1;
> + }
> +
> + log_opened_device_path(path);
> +
> + if (is_xe_device(fd))
> + xe_device_get(fd);
> +
> + return fd;
> +}
> +
> static struct {
> int fd;
> struct stat stat;
> diff --git a/lib/drmtest.h b/lib/drmtest.h
> index 37874d729..305bbc86b 100644
> --- a/lib/drmtest.h
> +++ b/lib/drmtest.h
> @@ -123,6 +123,7 @@ int drm_open_driver_another(int idx, int chipset);
> int drm_open_driver(int chipset);
> int drm_open_driver_master(int chipset);
> int drm_open_driver_render(int chipset);
> +int __drm_open_driver_path(const char *path);
> int __drm_open_driver_another(int idx, int chipset);
> int __drm_open_driver(int chipset);
> int __drm_open_driver_render(int chipset);
--
Jani Nikula, Intel
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH v4 1/2] lib/drmtest: add __drm_open_driver_path()
2026-05-26 11:51 ` [PATCH v4 1/2] lib/drmtest: add __drm_open_driver_path() Jani Nikula
@ 2026-05-26 11:59 ` Sebastian Brzezinka
2026-05-26 12:07 ` Jani Nikula
0 siblings, 1 reply; 14+ messages in thread
From: Sebastian Brzezinka @ 2026-05-26 11:59 UTC (permalink / raw)
To: Jani Nikula, Sebastian Brzezinka, igt-dev
Cc: kamil.konieczny, krzysztof.karas, zbigniew.kempczynski, x.wang
Hi Jani,
On Tue May 26, 2026 at 1:51 PM CEST, Jani Nikula wrote:
> On Tue, 26 May 2026, Sebastian Brzezinka <sebastian.brzezinka@intel.com> wrote:
>> Add __drm_open_driver_path() as a path-based DRM open helper. It opens
>> the given path with O_RDWR, verifies the resulting fd is a DRM device by
>> issuing DRM_IOCTL_VERSION via __get_drm_device_name() before proceeding
>> (returning -1 and closing on failure), logs the opened device path, and
>> populates the xe_device cache when the device is Xe.
>>
>> The __ prefix signals that the function does not throw assertions or
>> igt_require() calls, consistent with the existing __drm_open_driver*
>> family.
>
> FWIW, I think the __ prefix should indicate "implementation detail,
> don't call directly" or something along those lines.
>
> I think it's problematic to encourage tests to call __ prefixed
> functions.
In general I agree with you, but in v3 Kamil comment on this:
```
>>Could you rename it into __drm_open_driver_path?
>>The idea is that all __functions should not throw asserts nor
>>require.
```
So I added an explanation in the comment.
--
Best regards,
Sebastian
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH v4 1/2] lib/drmtest: add __drm_open_driver_path()
2026-05-26 11:59 ` Sebastian Brzezinka
@ 2026-05-26 12:07 ` Jani Nikula
2026-05-27 13:22 ` Kamil Konieczny
0 siblings, 1 reply; 14+ messages in thread
From: Jani Nikula @ 2026-05-26 12:07 UTC (permalink / raw)
To: Sebastian Brzezinka, Sebastian Brzezinka, igt-dev
Cc: kamil.konieczny, krzysztof.karas, zbigniew.kempczynski, x.wang
On Tue, 26 May 2026, "Sebastian Brzezinka" <sebastian.brzezinka@intel.com> wrote:
> Hi Jani,
>
> On Tue May 26, 2026 at 1:51 PM CEST, Jani Nikula wrote:
>> On Tue, 26 May 2026, Sebastian Brzezinka <sebastian.brzezinka@intel.com> wrote:
>>> Add __drm_open_driver_path() as a path-based DRM open helper. It opens
>>> the given path with O_RDWR, verifies the resulting fd is a DRM device by
>>> issuing DRM_IOCTL_VERSION via __get_drm_device_name() before proceeding
>>> (returning -1 and closing on failure), logs the opened device path, and
>>> populates the xe_device cache when the device is Xe.
>>>
>>> The __ prefix signals that the function does not throw assertions or
>>> igt_require() calls, consistent with the existing __drm_open_driver*
>>> family.
>>
>> FWIW, I think the __ prefix should indicate "implementation detail,
>> don't call directly" or something along those lines.
>>
>> I think it's problematic to encourage tests to call __ prefixed
>> functions.
> In general I agree with you, but in v3 Kamil comment on this:
> ```
>>>Could you rename it into __drm_open_driver_path?
>>>The idea is that all __functions should not throw asserts nor
>>>require.
> ```
>
> So I added an explanation in the comment.
I obviously disagree with all of that, but *shrug*.
BR,
Jani.
--
Jani Nikula, Intel
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH v4 1/2] lib/drmtest: add __drm_open_driver_path()
2026-05-26 12:07 ` Jani Nikula
@ 2026-05-27 13:22 ` Kamil Konieczny
2026-05-27 14:22 ` Ville Syrjälä
2026-05-29 13:37 ` Gustavo Sousa
0 siblings, 2 replies; 14+ messages in thread
From: Kamil Konieczny @ 2026-05-27 13:22 UTC (permalink / raw)
To: Jani Nikula
Cc: Sebastian Brzezinka, igt-dev, krzysztof.karas,
zbigniew.kempczynski, x.wang, Ville Syrjälä
Hi Jani,
On 2026-05-26 at 15:07:57 +0300, Jani Nikula wrote:
> On Tue, 26 May 2026, "Sebastian Brzezinka" <sebastian.brzezinka@intel.com> wrote:
> > Hi Jani,
> >
> > On Tue May 26, 2026 at 1:51 PM CEST, Jani Nikula wrote:
> >> On Tue, 26 May 2026, Sebastian Brzezinka <sebastian.brzezinka@intel.com> wrote:
> >>> Add __drm_open_driver_path() as a path-based DRM open helper. It opens
> >>> the given path with O_RDWR, verifies the resulting fd is a DRM device by
> >>> issuing DRM_IOCTL_VERSION via __get_drm_device_name() before proceeding
> >>> (returning -1 and closing on failure), logs the opened device path, and
> >>> populates the xe_device cache when the device is Xe.
> >>>
> >>> The __ prefix signals that the function does not throw assertions or
> >>> igt_require() calls, consistent with the existing __drm_open_driver*
> >>> family.
> >>
> >> FWIW, I think the __ prefix should indicate "implementation detail,
> >> don't call directly" or something along those lines.
> >>
> >> I think it's problematic to encourage tests to call __ prefixed
> >> functions.
> > In general I agree with you, but in v3 Kamil comment on this:
> > ```
> >>>Could you rename it into __drm_open_driver_path?
> >>>The idea is that all __functions should not throw asserts nor
> >>>require.
> > ```
> >
> > So I added an explanation in the comment.
>
> I obviously disagree with all of that, but *shrug*.
We could implement separete lib functions for tools but
that will require duplicate effort.
The idea with __function is that it should be implemented
without any igt_assert nor igt_require so tools could use them.
We could go with function() but then developers could
later on change behaviour and break a tool.
Or we could add some suffix to a name? function_safe()?
Btw why tool/igt_power couldn't just read sysfs? Why does it
needs to open /dev/dri/card* to get any info? +cc Ville
Regards,
Kamil
>
> BR,
> Jani.
>
>
> --
> Jani Nikula, Intel
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH v4 1/2] lib/drmtest: add __drm_open_driver_path()
2026-05-27 13:22 ` Kamil Konieczny
@ 2026-05-27 14:22 ` Ville Syrjälä
2026-05-29 13:37 ` Gustavo Sousa
1 sibling, 0 replies; 14+ messages in thread
From: Ville Syrjälä @ 2026-05-27 14:22 UTC (permalink / raw)
To: Kamil Konieczny, Jani Nikula, Sebastian Brzezinka, igt-dev,
krzysztof.karas, zbigniew.kempczynski, x.wang
On Wed, May 27, 2026 at 03:22:47PM +0200, Kamil Konieczny wrote:
> Hi Jani,
> On 2026-05-26 at 15:07:57 +0300, Jani Nikula wrote:
> > On Tue, 26 May 2026, "Sebastian Brzezinka" <sebastian.brzezinka@intel.com> wrote:
> > > Hi Jani,
> > >
> > > On Tue May 26, 2026 at 1:51 PM CEST, Jani Nikula wrote:
> > >> On Tue, 26 May 2026, Sebastian Brzezinka <sebastian.brzezinka@intel.com> wrote:
> > >>> Add __drm_open_driver_path() as a path-based DRM open helper. It opens
> > >>> the given path with O_RDWR, verifies the resulting fd is a DRM device by
> > >>> issuing DRM_IOCTL_VERSION via __get_drm_device_name() before proceeding
> > >>> (returning -1 and closing on failure), logs the opened device path, and
> > >>> populates the xe_device cache when the device is Xe.
> > >>>
> > >>> The __ prefix signals that the function does not throw assertions or
> > >>> igt_require() calls, consistent with the existing __drm_open_driver*
> > >>> family.
> > >>
> > >> FWIW, I think the __ prefix should indicate "implementation detail,
> > >> don't call directly" or something along those lines.
> > >>
> > >> I think it's problematic to encourage tests to call __ prefixed
> > >> functions.
>
>
> > > In general I agree with you, but in v3 Kamil comment on this:
> > > ```
> > >>>Could you rename it into __drm_open_driver_path?
> > >>>The idea is that all __functions should not throw asserts nor
> > >>>require.
> > > ```
> > >
> > > So I added an explanation in the comment.
> >
> > I obviously disagree with all of that, but *shrug*.
>
> We could implement separete lib functions for tools but
> that will require duplicate effort.
>
> The idea with __function is that it should be implemented
> without any igt_assert nor igt_require so tools could use them.
> We could go with function() but then developers could
> later on change behaviour and break a tool.
>
> Or we could add some suffix to a name? function_safe()?
>
> Btw why tool/igt_power couldn't just read sysfs? Why does it
> needs to open /dev/dri/card* to get any info? +cc Ville
It opens the device just because lib/igt_power and its
dependencies want the fd.
--
Ville Syrjälä
Intel
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH v4 0/2] tools/igt_power: fix Xe crash via drmtest path helpers
2026-05-28 10:20 ` [PATCH i-g-t " Sebastian Brzezinka
(?)
(?)
@ 2026-05-27 14:32 ` Kamil Konieczny
-1 siblings, 0 replies; 14+ messages in thread
From: Kamil Konieczny @ 2026-05-27 14:32 UTC (permalink / raw)
To: Sebastian Brzezinka
Cc: igt-dev, krzysztof.karas, zbigniew.kempczynski, x.wang
Hi Sebastian,
On 2026-05-26 at 13:39:52 +0200, Sebastian Brzezinka wrote:
Please keep i-g-t string after PATCH, so it will look like:
[PATCH i-g-t v4 0/2] tools/igt_power: fix Xe crash via drmtest path
Maybe that is a reason why it is not on igt patchwork?
Regards,
Kamil
> igt_power opened its DRM device fd with a raw open() call, which skips
> the Xe device cache initialisation performed by the drmtest open
> helpers. This caused an assertion failure in xe_query the moment
> igt_power_open() called into is_intel_dgfx() on a Xe device.
>
> The fix is split into two patches. The first adds __drm_open_driver_path()
> to lib/drmtest, a non-asserting helper that validates the fd is a real DRM
> device (DRM_IOCTL_VERSION) before initialising the Xe cache. The second
> switches igt_power to that helper and its matching __drm_close_driver(),
> completely removing the direct Xe dependency from the tool.
>
> v4:
> - rename drm_open_driver_path to __drm_open_driver_path (no asserts/requires)
> - add DRM_IOCTL_VERSION check to verify fd is a DRM device before proceeding
> - split the single patch into two: lib helper addition and igt_power
>
> v3:
> - remove redundant if (fd >= 0) guards on both close call sites
>
> v2:
> - move Xe cache setup/teardown out of igt_power
> - add drm_open_driver_path() and use __drm_close_driver()
> - drop the direct xe/xe_query dependency from igt_power
>
> Sebastian Brzezinka (2):
> lib/drmtest: add __drm_open_driver_path()
> tools/igt_power: fix crash on Xe devices by initializing xe_device
> cache
>
> lib/drmtest.c | 30 ++++++++++++++++++++++++++++++
> lib/drmtest.h | 1 +
> tools/igt_power.c | 6 +++---
> 3 files changed, 34 insertions(+), 3 deletions(-)
>
> --
> 2.53.0
>
^ permalink raw reply [flat|nested] 14+ messages in thread
* [PATCH i-g-t v4 0/2] tools/igt_power: fix Xe crash via drmtest path helpers
@ 2026-05-28 10:20 ` Sebastian Brzezinka
0 siblings, 0 replies; 14+ messages in thread
From: Sebastian Brzezinka @ 2026-05-28 10:20 UTC (permalink / raw)
To: igt-dev
Cc: Sebastian Brzezinka, kamil.konieczny, krzysztof.karas,
zbigniew.kempczynski, x.wang
igt_power opened its DRM device fd with a raw open() call, which skips
the Xe device cache initialisation performed by the drmtest open
helpers. This caused an assertion failure in xe_query the moment
igt_power_open() called into is_intel_dgfx() on a Xe device.
The fix is split into two patches. The first adds __drm_open_driver_path()
to lib/drmtest, a non-asserting helper that validates the fd is a real DRM
device (DRM_IOCTL_VERSION) before initialising the Xe cache. The second
switches igt_power to that helper and its matching __drm_close_driver(),
completely removing the direct Xe dependency from the tool.
v4:
- rename drm_open_driver_path to __drm_open_driver_path (no asserts/requires)
- add DRM_IOCTL_VERSION check to verify fd is a DRM device before proceeding
- split the single patch into two: lib helper addition and igt_power
v3:
- remove redundant if (fd >= 0) guards on both close call sites
v2:
- move Xe cache setup/teardown out of igt_power
- add drm_open_driver_path() and use __drm_close_driver()
- drop the direct xe/xe_query dependency from igt_power
Sebastian Brzezinka (2):
lib/drmtest: add __drm_open_driver_path()
tools/igt_power: fix crash on Xe devices by initializing xe_device
cache
lib/drmtest.c | 30 ++++++++++++++++++++++++++++++
lib/drmtest.h | 1 +
tools/igt_power.c | 6 +++---
3 files changed, 34 insertions(+), 3 deletions(-)
--
2.53.0
^ permalink raw reply [flat|nested] 14+ messages in thread
* [PATCH i-g-t v4 1/2] lib/drmtest: add __drm_open_driver_path()
@ 2026-05-28 10:20 ` Sebastian Brzezinka
0 siblings, 0 replies; 14+ messages in thread
From: Sebastian Brzezinka @ 2026-05-28 10:20 UTC (permalink / raw)
To: igt-dev
Cc: Sebastian Brzezinka, kamil.konieczny, krzysztof.karas,
zbigniew.kempczynski, x.wang
Add __drm_open_driver_path() as a path-based DRM open helper. It opens
the given path with O_RDWR, verifies the resulting fd is a DRM device by
issuing DRM_IOCTL_VERSION via __get_drm_device_name() before proceeding
(returning -1 and closing on failure), logs the opened device path, and
populates the xe_device cache when the device is Xe.
The __ prefix signals that the function does not throw assertions or
igt_require() calls, consistent with the existing __drm_open_driver*
family.
Signed-off-by: Sebastian Brzezinka <sebastian.brzezinka@intel.com>
---
lib/drmtest.c | 30 ++++++++++++++++++++++++++++++
lib/drmtest.h | 1 +
2 files changed, 31 insertions(+)
diff --git a/lib/drmtest.c b/lib/drmtest.c
index 4a788ea7a..7007569d2 100644
--- a/lib/drmtest.c
+++ b/lib/drmtest.c
@@ -379,6 +379,36 @@ err:
return -1;
}
+/**
+ * __drm_open_driver_path:
+ * @path: DRM device node path
+ *
+ * Opens @path with O_RDWR and populates the xe_device cache for Xe fds.
+ *
+ * Returns: DRM file descriptor or -1 on error
+ */
+int __drm_open_driver_path(const char *path)
+{
+ char name[12] = "";
+ int fd;
+
+ fd = open(path, O_RDWR);
+ if (fd < 0)
+ return -1;
+
+ if (__get_drm_device_name(fd, name, sizeof(name) - 1)) {
+ close(fd);
+ return -1;
+ }
+
+ log_opened_device_path(path);
+
+ if (is_xe_device(fd))
+ xe_device_get(fd);
+
+ return fd;
+}
+
static struct {
int fd;
struct stat stat;
diff --git a/lib/drmtest.h b/lib/drmtest.h
index 37874d729..305bbc86b 100644
--- a/lib/drmtest.h
+++ b/lib/drmtest.h
@@ -123,6 +123,7 @@ int drm_open_driver_another(int idx, int chipset);
int drm_open_driver(int chipset);
int drm_open_driver_master(int chipset);
int drm_open_driver_render(int chipset);
+int __drm_open_driver_path(const char *path);
int __drm_open_driver_another(int idx, int chipset);
int __drm_open_driver(int chipset);
int __drm_open_driver_render(int chipset);
--
2.53.0
^ permalink raw reply related [flat|nested] 14+ messages in thread
* [PATCH i-g-t v4 2/2] tools/igt_power: fix crash on Xe devices by initializing xe_device cache
@ 2026-05-28 10:20 ` Sebastian Brzezinka
0 siblings, 0 replies; 14+ messages in thread
From: Sebastian Brzezinka @ 2026-05-28 10:20 UTC (permalink / raw)
To: igt-dev
Cc: Sebastian Brzezinka, kamil.konieczny, krzysztof.karas,
zbigniew.kempczynski, x.wang
Opening a DRM device with plain open() does not initialize the Xe device
cache. When igt_power_open() calls is_intel_dgfx() -> xe_has_vram(),
it reaches find_in_cache() which asserts the cache entry exists, causing
a crash on Xe devices with: xe_query-CRITICAL: Failed assertion: xe_dev
Switch both open/close call sites to __drm_open_driver_path() and
__drm_close_driver() so that Xe cache setup and teardown are paired with
the fd lifecycle, keeping igt_power free of Xe-specific handling.
Signed-off-by: Sebastian Brzezinka <sebastian.brzezinka@intel.com>
---
tools/igt_power.c | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/tools/igt_power.c b/tools/igt_power.c
index 6dd180d34..97d95e7b4 100644
--- a/tools/igt_power.c
+++ b/tools/igt_power.c
@@ -38,7 +38,7 @@ static bool prepare(struct measurement *m)
int ret, fd = -1;
if (m->drm_device) {
- fd = open(m->drm_device, O_RDONLY);
+ fd = __drm_open_driver_path(m->drm_device);
if (fd < 0) {
fprintf(stderr, "Unable to open drm device %s (%d)\n",
m->drm_device, -errno);
@@ -54,12 +54,12 @@ static bool prepare(struct measurement *m)
else
fprintf(stderr, "Unable to open rapl domain %s (%d)\n",
m->rapl_domain, ret);
- close(fd);
+ __drm_close_driver(fd);
return false;
}
- close(fd);
+ __drm_close_driver(fd);
}
return true;
--
2.53.0
^ permalink raw reply related [flat|nested] 14+ messages in thread
* Re: [PATCH v4 1/2] lib/drmtest: add __drm_open_driver_path()
2026-05-28 10:20 ` [PATCH i-g-t " Sebastian Brzezinka
` (2 preceding siblings ...)
(?)
@ 2026-05-28 15:17 ` Kamil Konieczny
-1 siblings, 0 replies; 14+ messages in thread
From: Kamil Konieczny @ 2026-05-28 15:17 UTC (permalink / raw)
To: Sebastian Brzezinka
Cc: igt-dev, krzysztof.karas, zbigniew.kempczynski, x.wang
Hi Sebastian,
On 2026-05-26 at 13:39:53 +0200, Sebastian Brzezinka wrote:
> Add __drm_open_driver_path() as a path-based DRM open helper. It opens
> the given path with O_RDWR, verifies the resulting fd is a DRM device by
> issuing DRM_IOCTL_VERSION via __get_drm_device_name() before proceeding
> (returning -1 and closing on failure), logs the opened device path, and
> populates the xe_device cache when the device is Xe.
>
> The __ prefix signals that the function does not throw assertions or
> igt_require() calls, consistent with the existing __drm_open_driver*
> family.
>
> Signed-off-by: Sebastian Brzezinka <sebastian.brzezinka@intel.com>
> ---
> lib/drmtest.c | 30 ++++++++++++++++++++++++++++++
> lib/drmtest.h | 1 +
> 2 files changed, 31 insertions(+)
>
> diff --git a/lib/drmtest.c b/lib/drmtest.c
> index 4a788ea7a..7007569d2 100644
> --- a/lib/drmtest.c
> +++ b/lib/drmtest.c
> @@ -379,6 +379,36 @@ err:
> return -1;
> }
>
> +/**
> + * __drm_open_driver_path:
> + * @path: DRM device node path
> + *
> + * Opens @path with O_RDWR and populates the xe_device cache for Xe fds.
> + *
> + * Returns: DRM file descriptor or -1 on error
> + */
> +int __drm_open_driver_path(const char *path)
This should be
int drm_open_driver_path(const char *path)
see below.
> +{
> + char name[12] = "";
> + int fd;
> +
> + fd = open(path, O_RDWR);
> + if (fd < 0)
> + return -1;
> +
> + if (__get_drm_device_name(fd, name, sizeof(name) - 1)) {
> + close(fd);
> + return -1;
> + }
> +
Please verify here that name[0] != 0.
> + log_opened_device_path(path);
> +
> + if (is_xe_device(fd))
> + xe_device_get(fd);
xe_device_get() uses igt_assert() so use drm_open_driver_path()
as function name.
Regards,
Kamil
> +
> + return fd;
> +}
> +
> static struct {
> int fd;
> struct stat stat;
> diff --git a/lib/drmtest.h b/lib/drmtest.h
> index 37874d729..305bbc86b 100644
> --- a/lib/drmtest.h
> +++ b/lib/drmtest.h
> @@ -123,6 +123,7 @@ int drm_open_driver_another(int idx, int chipset);
> int drm_open_driver(int chipset);
> int drm_open_driver_master(int chipset);
> int drm_open_driver_render(int chipset);
> +int __drm_open_driver_path(const char *path);
> int __drm_open_driver_another(int idx, int chipset);
> int __drm_open_driver(int chipset);
> int __drm_open_driver_render(int chipset);
> --
> 2.53.0
>
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH v4 1/2] lib/drmtest: add __drm_open_driver_path()
2026-05-27 13:22 ` Kamil Konieczny
2026-05-27 14:22 ` Ville Syrjälä
@ 2026-05-29 13:37 ` Gustavo Sousa
1 sibling, 0 replies; 14+ messages in thread
From: Gustavo Sousa @ 2026-05-29 13:37 UTC (permalink / raw)
To: Kamil Konieczny, Jani Nikula
Cc: Sebastian Brzezinka, igt-dev, krzysztof.karas,
zbigniew.kempczynski, x.wang, Ville Syrjälä
Kamil Konieczny <kamil.konieczny@linux.intel.com> writes:
> Hi Jani,
> On 2026-05-26 at 15:07:57 +0300, Jani Nikula wrote:
>> On Tue, 26 May 2026, "Sebastian Brzezinka" <sebastian.brzezinka@intel.com> wrote:
>> > Hi Jani,
>> >
>> > On Tue May 26, 2026 at 1:51 PM CEST, Jani Nikula wrote:
>> >> On Tue, 26 May 2026, Sebastian Brzezinka <sebastian.brzezinka@intel.com> wrote:
>> >>> Add __drm_open_driver_path() as a path-based DRM open helper. It opens
>> >>> the given path with O_RDWR, verifies the resulting fd is a DRM device by
>> >>> issuing DRM_IOCTL_VERSION via __get_drm_device_name() before proceeding
>> >>> (returning -1 and closing on failure), logs the opened device path, and
>> >>> populates the xe_device cache when the device is Xe.
>> >>>
>> >>> The __ prefix signals that the function does not throw assertions or
>> >>> igt_require() calls, consistent with the existing __drm_open_driver*
>> >>> family.
>> >>
>> >> FWIW, I think the __ prefix should indicate "implementation detail,
>> >> don't call directly" or something along those lines.
>> >>
>> >> I think it's problematic to encourage tests to call __ prefixed
>> >> functions.
>
>
>> > In general I agree with you, but in v3 Kamil comment on this:
>> > ```
>> >>>Could you rename it into __drm_open_driver_path?
>> >>>The idea is that all __functions should not throw asserts nor
>> >>>require.
>> > ```
>> >
>> > So I added an explanation in the comment.
>>
>> I obviously disagree with all of that, but *shrug*.
>
> We could implement separete lib functions for tools but
> that will require duplicate effort.
>
> The idea with __function is that it should be implemented
> without any igt_assert nor igt_require so tools could use them.
> We could go with function() but then developers could
> later on change behaviour and break a tool.
>
> Or we could add some suffix to a name? function_safe()?
Given the number of assertions that already exist under lib/, perhaps
this would be somewhat hard to achieve, but I feel like we should go the
other way around: a suffix to denote that a function uses IGT
assertions.
I.o.w., do_something() would be usable from both test and tools code;
do_something_asserting() would be a version of the same function that
contains assertions.
"asserting" is a bit long for a prefix, we could try to come up with
something better.
--
Gustavo Sousa
>
> Btw why tool/igt_power couldn't just read sysfs? Why does it
> needs to open /dev/dri/card* to get any info? +cc Ville
>
> Regards,
> Kamil
>
>>
>> BR,
>> Jani.
>>
>>
>> --
>> Jani Nikula, Intel
^ permalink raw reply [flat|nested] 14+ messages in thread
end of thread, other threads:[~2026-05-29 13:37 UTC | newest]
Thread overview: 14+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-05-26 11:39 [PATCH v4 0/2] tools/igt_power: fix Xe crash via drmtest path helpers Sebastian Brzezinka
2026-05-28 10:20 ` [PATCH i-g-t " Sebastian Brzezinka
2026-05-26 11:39 ` [PATCH v4 1/2] lib/drmtest: add __drm_open_driver_path() Sebastian Brzezinka
2026-05-28 10:20 ` [PATCH i-g-t " Sebastian Brzezinka
2026-05-26 11:39 ` [PATCH v4 2/2] tools/igt_power: fix crash on Xe devices by initializing xe_device cache Sebastian Brzezinka
2026-05-28 10:20 ` [PATCH i-g-t " Sebastian Brzezinka
2026-05-26 11:51 ` [PATCH v4 1/2] lib/drmtest: add __drm_open_driver_path() Jani Nikula
2026-05-26 11:59 ` Sebastian Brzezinka
2026-05-26 12:07 ` Jani Nikula
2026-05-27 13:22 ` Kamil Konieczny
2026-05-27 14:22 ` Ville Syrjälä
2026-05-29 13:37 ` Gustavo Sousa
2026-05-28 15:17 ` Kamil Konieczny
2026-05-27 14:32 ` [PATCH v4 0/2] tools/igt_power: fix Xe crash via drmtest path helpers Kamil Konieczny
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.