[PATCH i-g-t 3/3] tests/intel/xe_eu_stall: Use query IOCTL to check for EU stall support

Dixit, Ashutosh ashutosh.dixit at intel.com
Thu Jun 5 02:29:45 UTC 2025


On Wed, 04 Jun 2025 15:34:16 -0700, Dixit, Ashutosh wrote:
>
> On Tue, 03 Jun 2025 16:57:36 -0700, Harish Chegondi wrote:
> >
> > Use EU stall query IOCTL to check if EU stall monitoring feature is
> > available on the platform and if it is supported in the driver.
> > This would replace the checks in the test with those in the driver.
> >
> > Cc: Lukasz Laguna <lukasz.laguna at intel.com>
> > Cc: Ashutosh Dixit <ashutosh.dixit at intel.com>
> > Cc: Adam Miszczak <adam.miszczak at linux.intel.com>
> > Cc: Jakub Kolakowski <jakub1.kolakowski at intel.com>
> > Cc: Kamil Konieczny <kamil.konieczny at linux.intel.com>
> > Cc: Marcin Bernatowicz <marcin.bernatowicz at linux.intel.com>
> > Signed-off-by: Harish Chegondi <harish.chegondi at intel.com>
> > Resolves: https://gitlab.freedesktop.org/drm/xe/kernel/-/issues/5131
> > ---
> >  tests/intel/xe_eu_stall.c | 55 +++++++++++++++++++++------------------
> >  1 file changed, 30 insertions(+), 25 deletions(-)
> >
> > diff --git a/tests/intel/xe_eu_stall.c b/tests/intel/xe_eu_stall.c
> > index b3a0ee742..4e76018b6 100644
> > --- a/tests/intel/xe_eu_stall.c
> > +++ b/tests/intel/xe_eu_stall.c
> > @@ -74,6 +74,8 @@ static int stream_fd = -1;
> >
> >  static volatile bool child_is_running = true;
> >
> > +static struct drm_xe_query_eu_stall *query_eu_stall_data;
> > +
> >  /*
> >   * EU stall data format for PVC
> >   */
> > @@ -506,33 +508,12 @@ static void test_eustall(int drm_fd, uint32_t devid, bool blocking_read, int ite
> >		.properties_ptr = to_user_pointer(properties),
> >	};
> >
> > -	struct drm_xe_query_eu_stall *query_eu_stall_data;
> > -	struct drm_xe_device_query query = {
> > -		.extensions = 0,
> > -		.query = DRM_XE_DEVICE_QUERY_EU_STALL,
> > -		.size = 0,
> > -		.data = 0,
> > -	};
> > -
> >	igt_info("User buffer size: %u\n", p_user);
> >	if (p_args[0])
> >		igt_info("Workload: %s\n", p_args[0]);
> >	else
> >		igt_info("Workload: GPGPU fill\n");
> > -
> > -	igt_assert_eq(igt_ioctl(drm_fd, DRM_IOCTL_XE_DEVICE_QUERY, &query), 0);
> > -	igt_assert_neq(query.size, 0);
> > -
> > -	query_eu_stall_data = malloc(query.size);
> > -	igt_assert(query_eu_stall_data);
> > -
> > -	query.data = to_user_pointer(query_eu_stall_data);
> > -	igt_assert_eq(igt_ioctl(drm_fd, DRM_IOCTL_XE_DEVICE_QUERY, &query), 0);
> > -
> > -	igt_assert(query_eu_stall_data->num_sampling_rates > 0);
> > -	if (p_rate == 0)
> > -		properties[3] = query_eu_stall_data->sampling_rates[0];
> > -	igt_info("Sampling Rate: %lu\n", properties[3]);
> > +	igt_info("Sampling Rate: %lu\n", p_rate);
> >
> >	stream_fd = eu_stall_open(drm_fd, &props);
> >
> > @@ -660,18 +641,42 @@ static struct option long_options[] = {
> >
> >  igt_main_args("e:g:o:r:u:w:", long_options, help_str, opt_handler, NULL)
> >  {
> > -	int drm_fd;
> > +	bool blocking_read = true;
> > +	int drm_fd, ret;
> >	uint32_t devid;
> >	struct stat sb;
> > -	bool blocking_read = true;
> > +	struct drm_xe_device_query query = {
> > +		.extensions = 0,
> > +		.query = DRM_XE_DEVICE_QUERY_EU_STALL,
> > +		.size = 0,
> > +		.data = 0,
> > +	};
> >
> >	igt_fixture {
> >		drm_fd = drm_open_driver(DRIVER_XE);
> >		igt_require_fd(drm_fd);
> >		devid = intel_get_drm_devid(drm_fd);
> > -		igt_require(IS_PONTEVECCHIO(devid) || intel_graphics_ver(devid) >= IP_VER(20, 0));
> > +
> >		igt_require_f(igt_get_gpgpu_fillfunc(devid), "no gpgpu-fill function\n");
> >		igt_require_f(!stat(OBSERVATION_PARANOID, &sb), "no observation_paranoid file\n");
> > +
> > +		ret = igt_ioctl(drm_fd, DRM_IOCTL_XE_DEVICE_QUERY, &query);
> > +		igt_skip_on_f((ret == -1 && errno == ENODEV),
> > +			      "EU stall monitoring is not available on this platform\n");
> > +		igt_skip_on_f((ret == -1 && errno == EINVAL),
>
> inner brackets not needed...
>
> > +			      "EU stall monitoring is not supported in the driver\n");
> > +		igt_assert_neq(query.size, 0);
> > +
> > +		query_eu_stall_data = malloc(query.size);
> > +		igt_assert(query_eu_stall_data);
> > +
> > +		query.data = to_user_pointer(query_eu_stall_data);
> > +		igt_assert_eq(igt_ioctl(drm_fd, DRM_IOCTL_XE_DEVICE_QUERY, &query), 0);
> > +
> > +		igt_assert(query_eu_stall_data->num_sampling_rates > 0);
> > +		if (p_rate == 0)
> > +			p_rate = query_eu_stall_data->sampling_rates[0];
> > +
>
> Maybe cleaner to put all this query stuff into a function and calling the
> function from the fixture? Also, queries are generally cached in 'struct
> xe_device' so we could do the same here? See xe_device_get() and also
> xe_query_oa_units_new(). Since that's in the lib, make sure IGT still works
> even if the eu_stall query fails (see 851e62faf971).
>
> Also, another nit, use igt_require or igt_require_f instead of
> igt_skip_on_f? Though they are mostly NOT of each other so they are
> equivalent, so either is ok.

Changes suggested above are optional, but please consider if they are worth
making. If you do I'll review again. But for now I'll R-b this as is:

Reviewed-by: Ashutosh Dixit <ashutosh.dixit at intel.com>

Will need to spin another version of this series anyway, since this can't
be merged as is due to conflicts. So I'll wait for a v2. Thanks.


>
> >		if (output_file) {
> >			output = fopen(output_file, "w");
> >			igt_require(output);
> > --
> > 2.48.1
> >


More information about the igt-dev mailing list