[Intel-gfx] [PATCH igt] igt/gem_exec_schedule: Exercise preemption timeout

Antonio Argenziano antonio.argenziano at intel.com
Fri Apr 13 15:54:27 UTC 2018



On 13/04/18 07:14, Chris Wilson wrote:
> Set up a unpreemptible spinner such that the only way we can inject a
> high priority request onto the GPU is by resetting the spinner. The test
> fails if we trigger hangcheck rather than the fast timeout mechanism.
> 
> Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
> ---
>   lib/i915/gem_context.c    | 72 +++++++++++++++++++++++++++++++--------
>   lib/i915/gem_context.h    |  3 ++
>   lib/igt_dummyload.c       | 12 +++++--
>   lib/igt_dummyload.h       |  3 ++
>   tests/gem_exec_schedule.c | 34 ++++++++++++++++++
>   5 files changed, 106 insertions(+), 18 deletions(-)
> 

...

> @@ -449,8 +457,6 @@ void igt_spin_batch_end(igt_spin_t *spin)
>   	if (!spin)
>   		return;
>   
> -	igt_assert(*spin->batch == MI_ARB_CHK ||
> -		   *spin->batch == MI_BATCH_BUFFER_END);

I am not sure why we needed this, but it seems safe to remove.

>   	*spin->batch = MI_BATCH_BUFFER_END;
>   	__sync_synchronize();
>   }

> diff --git a/tests/gem_exec_schedule.c b/tests/gem_exec_schedule.c
> index 6ff15b6ef..93254945b 100644
> --- a/tests/gem_exec_schedule.c
> +++ b/tests/gem_exec_schedule.c
> @@ -656,6 +656,37 @@ static void preemptive_hang(int fd, unsigned ring)
>   	gem_context_destroy(fd, ctx[HI]);
>   }
>   
> +static void preempt_timeout(int fd, unsigned ring)
> +{
> +	igt_spin_t *spin[3];
> +	uint32_t ctx;
> +
> +	igt_require(__gem_context_set_preempt_timeout(fd, 0, 0));
> +
> +	ctx = gem_context_create(fd);
> +	gem_context_set_priority(fd, ctx, MIN_PRIO);
> +	spin[0] = __igt_spin_batch_new_hang(fd, ctx, ring);
> +	spin[1] = __igt_spin_batch_new_hang(fd, ctx, ring);
> +	gem_context_destroy(fd, ctx);
> +
> +	ctx = gem_context_create(fd);
> +	gem_context_set_priority(fd, ctx, MAX_PRIO);
> +	gem_context_set_preempt_timeout(fd, ctx, 1000 * 1000);
> +	spin[2] = __igt_spin_batch_new(fd, ctx, ring, 0);
> +	gem_context_destroy(fd, ctx);
> +
> +	igt_spin_batch_end(spin[2]);
> +	gem_sync(fd, spin[2]->handle);

Does this guarantee that spin[1] did not overtake spin[2]?

Thanks,
Antonio

> +
> +	/* spin[0] is kicked, leaving spin[1] running */
> +
> +	igt_assert(gem_bo_busy(fd, spin[1]->handle));
> +
> +	igt_spin_batch_free(fd, spin[2]);
> +	igt_spin_batch_free(fd, spin[1]);
> +	igt_spin_batch_free(fd, spin[0]);
> +}
> +
>   static void deep(int fd, unsigned ring)
>   {
>   #define XS 8
> @@ -1120,6 +1151,9 @@ igt_main
>   					igt_subtest_f("preempt-self-%s", e->name)
>   						preempt_self(fd, e->exec_id | e->flags);
>   
> +					igt_subtest_f("preempt-timeout-%s", e->name)
> +						preempt_timeout(fd, e->exec_id | e->flags);
> +
>   					igt_subtest_f("preempt-other-%s", e->name)
>   						preempt_other(fd, e->exec_id | e->flags, 0);
>   
> 


More information about the Intel-gfx mailing list