Re: [PATCH i-g-t 07/10] lib/xe: Add xe_wa_from_cache()
Matt Roper <[email protected]> Wed, 29 Jul 2026 15:20:05 -0700
| Newsgroups | org.freedesktop.lists.igt-dev |
|---|---|
| Message-ID | <[email protected]> |
On Tue, Jul 21, 2026 at 04:00:00PM -0300, Gustavo Sousa wrote: > An upcoming change will need to check if a workaround is enabled > during the creation of the xe_device struct, i.e., during the > execution of xe_device_get(). It is not possible to call xe_wa() in > that context because the struct is not yet cached and xe_wa() calling > xe_device_get() will cause an infinite recursion. > > Add the function xe_wa_from_cache() to allow checking for workarounds > in that specific scenario and make a note in the function's > documentation about its purpose. > > Signed-off-by: Gustavo Sousa <[email protected]> > --- > lib/xe/xe_wa.c | 34 ++++++++++++++++++++++++++++------ > lib/xe/xe_wa.h | 1 + > 2 files changed, 29 insertions(+), 6 deletions(-) > > diff --git a/lib/xe/xe_wa.c b/lib/xe/xe_wa.c > index 8c8f7156c21f..ac3dcf6ef1c1 100644 > --- a/lib/xe/xe_wa.c > +++ b/lib/xe/xe_wa.c > @@ -105,19 +105,28 @@ static bool debugfs_dump_has_wa(char *dump, const char *wa) > > /** > * xe_wa: Check if a workaround is enabled for the device. The function name needs to be updated in this comment. Otherwise, Reviewed-by: Matt Roper <[email protected]> > - * @fd: A drm file descriptor. > + * @xe_dev: Xe device where the cached data is stashed. > * @wa: Name of the workaround to be checked. > * > - * Return a boolean indicating whether the workaround is enabled. > - * On error, returns false and a warning is printed. > + * This function is like xe_wa(), but it receives the "incomplete" > + * (see next paragraph) xe_device struct directly instead of a drm > + * file descriptor. > + * > + * This function is only expected to be used in specific paths during > + * the initialization of a xe_device struct (i.e. during execution of > + * xe_device_get()), where the workaround cache is ready > + * (i.e. xe_wa_build_cache()), but the xe_device struct is not yet > + * fully built and cached (which is a requirement for xe_wa()). > */ > -bool xe_wa(int fd, const char *wa) > +bool xe_wa_from_cache(struct xe_device *xe_dev, const char *wa) > { > - char **dumps = xe_device_get(fd)->wa_cache; > + char **dumps; > > - if (igt_warn_on(!dumps)) > + if (igt_warn_on(!xe_dev->wa_cache)) > return false; > > + dumps = xe_dev->wa_cache; > + > for (char **dump = dumps; *dump; dump++) > if (debugfs_dump_has_wa(*dump, wa)) > return true; > @@ -125,6 +134,19 @@ bool xe_wa(int fd, const char *wa) > return false; > } > > +/** > + * xe_wa: Check if a workaround is enabled for the device. > + * @fd: A drm file descriptor. > + * @wa: Name of the workaround to be checked. > + * > + * Return a boolean indicating whether the workaround is enabled. > + * On error, returns false and a warning is printed. > + */ > +bool xe_wa(int fd, const char *wa) > +{ > + return xe_wa_from_cache(xe_device_get(fd), wa); > +} > + > /** > * xe_wa_build_cache: Build cached data for xe_wa(). > * @xe_dev: Xe device where the cache will be stashed. > diff --git a/lib/xe/xe_wa.h b/lib/xe/xe_wa.h > index aa1c50c0f9c9..2f141ae15016 100644 > --- a/lib/xe/xe_wa.h > +++ b/lib/xe/xe_wa.h > @@ -14,5 +14,6 @@ bool xe_wa(int fd, const char *wa); > > void xe_wa_build_cache(struct xe_device *xe_dev); > void xe_wa_free_cache(struct xe_device *xe_dev); > +bool xe_wa_from_cache(struct xe_device *xe_dev, const char *wa); > > #endif /* XE_WA_H */ > > -- > 2.55.0 > -- Matt Roper Graphics Software Engineer Linux GPU Platform Enablement Intel Corporation