[PATCH v2 i-g-t 2/2] tests/xe_eudebug_online: Adjust interrupt-other test

Piatkowski, Dominik Karol dominik.karol.piatkowski at intel.com
Fri Oct 4 06:01:14 UTC 2024


Hi Dominik,

> -----Original Message-----
> From: Grzegorzek, Dominik <dominik.grzegorzek at intel.com>
> Sent: Thursday, October 3, 2024 3:49 PM
> To: Piatkowski, Dominik Karol <dominik.karol.piatkowski at intel.com>; igt-
> dev at lists.freedesktop.org
> Cc: Kempczynski, Zbigniew <zbigniew.kempczynski at intel.com>; Sikora, Pawel
> <pawel.sikora at intel.com>; Manszewski, Christoph
> <christoph.manszewski at intel.com>; Cavitt, Jonathan
> <jonathan.cavitt at intel.com>
> Subject: Re: [PATCH v2 i-g-t 2/2] tests/xe_eudebug_online: Adjust interrupt-
> other test
> 
> Hi Dominik!
> 
> On Wed, 2024-10-02 at 13:29 +0200, Dominik Karol Piątkowski wrote:
> > This test fails due to preemption interfering with it.
> >
> > In order to fix it, set the preempt_timeout_us for engine_class used
> > in this test to maximum for the duration of the test.
> >
> > It is set to maximum inside test_gt_render_or_compute. If set before,
> > we would lack engine_class info. If set inside the test function, we
> > would need to pass original preempt_timeout_us value from there,
> > unnecessarily complicating the declaration of test function.
> >
> > It is restored in subsequent igt_fixture. This way, a proper cleanup
> > can be assured. If restored inside the test function or even
> > test_gt_render_or_compute section, any failed assert preceding cleanup
> > inside test function would prevent cleanup from happening. We cannot
> > allow that.
> >
> > In order to underline that the subsequent igt_fixture is related to
> > this test, both test_gt_render_or_compute and igt_fixture sections
> > were put inside igt_subtest_group, hopefully increasing readability.
> >
> > Signed-off-by: Dominik Karol Piątkowski
> > <dominik.karol.piatkowski at intel.com>
> > ---
> >  tests/intel/xe_eudebug_online.c | 45
> > +++++++++++++++++++++++++++++++--
> >  1 file changed, 43 insertions(+), 2 deletions(-)
> >
> > diff --git a/tests/intel/xe_eudebug_online.c
> > b/tests/intel/xe_eudebug_online.c index 68d1b786f..84736192f 100644
> > --- a/tests/intel/xe_eudebug_online.c
> > +++ b/tests/intel/xe_eudebug_online.c
> > @@ -16,6 +16,7 @@
> >  #include "xe/xe_ioctl.h"
> >  #include "xe/xe_query.h"
> >  #include "igt.h"
> > +#include "igt_sysfs.h"
> >  #include "intel_pat.h"
> >  #include "intel_mocs.h"
> >  #include "gpgpu_shader.h"
> > @@ -2201,6 +2202,30 @@ static struct drm_xe_engine_class_instance
> *pick_compute(int fd, int gt)
> >  	return NULL;
> >  }
> >
> > +static bool set_preempt_timeout_to_max(int fd, uint16_t engine_class,
> > +uint32_t *preempt_timeout) {
> > +	uint32_t preempt_timeout_max;
> > +
> > +	if (!xe_sysfs_engine_class_get_property(fd, 0, engine_class,
> "preempt_timeout_max",
> > +						&preempt_timeout_max))
> > +		return false;
> > +
> > +	if (!xe_sysfs_engine_class_set_property(fd, 0, engine_class,
> "preempt_timeout_us",
> > +						preempt_timeout_max,
> preempt_timeout))
> > +		return false;
> > +
> > +	return true;
> Minor nit, you could ommit second if:
> 	return xe_sysfs_engine_class_set_property(fd, 0, engine_class,
> "preempt_timeout_us",
> +						preempt_timeout_max,
> preempt_timeout))

Nice catch!

> > +}
> > +
> > +static bool restore_preempt_timeout(int fd, uint16_t engine_class,
> > +uint32_t preempt_timeout) {
> > +	if (!xe_sysfs_engine_class_set_property(fd, 0, engine_class,
> "preempt_timeout_us",
> > +						preempt_timeout, NULL))
> > +		return false;
> > +
> > +	return true;
> same as above.

Thanks!

> > +}
> > +
> >  #define test_gt_render_or_compute(t, fd, __hwe) \
> >  	igt_subtest_with_dynamic(t) \
> >  		for (int gt = 0; (__hwe = pick_compute(fd, gt)); gt++) \ @@ -
> 2212,6
> > +2237,8 @@ igt_main
> >  	struct drm_xe_engine_class_instance *hwe;
> >  	bool was_enabled;
> >  	int fd;
> > +	uint16_t engine_class = 0xFFFF;
> > +	uint32_t preempt_timeout = 0xFFFFFFFF;
> >
> >  	igt_fixture {
> >  		fd = drm_open_driver(DRIVER_XE);
> > @@ -2247,8 +2274,22 @@ igt_main
> >  	test_gt_render_or_compute("interrupt-other-debuggable", fd, hwe)
> >  		test_interrupt_other(fd, hwe, SHADER_LOOP);
> >
> > -	test_gt_render_or_compute("interrupt-other", fd, hwe)
> > -		test_interrupt_other(fd, hwe, SHADER_LOOP |
> DISABLE_DEBUG_MODE);
> > +	igt_subtest_group {
> > +		test_gt_render_or_compute("interrupt-other", fd, hwe) {
> > +			engine_class = hwe->engine_class;
> > +
> > +			igt_skip_on(!set_preempt_timeout_to_max(fd,
> engine_class,
> > +
> 	&preempt_timeout));
> > +
> > +			test_interrupt_other(fd, hwe, SHADER_LOOP |
> DISABLE_DEBUG_MODE);
> > +		}
> > +
> > +		igt_fixture {
> > +			if ((uint16_t)~engine_class && ~preempt_timeout)
> Maybe I'm not seeing sth but why do we need to cast it to uint16, isn't it
> already that type?

Considering the case of engine_class = 0xFFFF, when we do:

if (~engine_class) ...

it evaluates to:

if (0xFFFF0000) ...

hence the cast :)

Thanks,
Dominik Karol

> 
> Other than that it is:
> Reviewed-by: Dominik Grzegorzek <dominik.grzegorzek at intel.com>
> > +				if (!restore_preempt_timeout(fd,
> engine_class, preempt_timeout))
> > +					igt_warn("Cleanup of
> preempt_timeout failed!\n");
> > +		}
> > +	}
> >
> >  	test_gt_render_or_compute("interrupt-all-set-breakpoint", fd, hwe)
> >  		test_interrupt_all(fd, hwe, SHADER_LOOP |
> TRIGGER_RESUME_SET_BP);



More information about the igt-dev mailing list