[igt-dev] [PATCH igt] igt/gem_ctx_isolation: Reset a scratch context

Tvrtko Ursulin tvrtko.ursulin at linux.intel.com
Tue Mar 27 15:41:14 UTC 2018


[resend for typo in cc]

On 27/03/2018 14:48, Chris Wilson wrote:
> If we inject a reset into the target context, there is a risk that the
> register state is never saved back to memory. The exact interaction
> between reset, the context image and the precise timing of our execution
> are not well defined. Since we cannot ensure that the context image
> remains valid, force a context switch prior to the reset.
> 
> Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=105270
> Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=105457
> Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=105545
> Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
> Cc: Tvrtko Ursulin <tvrtko.ursulin at intel.com>
> Cc: Joonas Lahtinen <joonas.lahtinen at linux.intel.com>
> ---
>   tests/gem_ctx_isolation.c | 28 +++++++++++++++++++++++++++-
>   1 file changed, 27 insertions(+), 1 deletion(-)
> 
> diff --git a/tests/gem_ctx_isolation.c b/tests/gem_ctx_isolation.c
> index d8109aa0..4968e367 100644
> --- a/tests/gem_ctx_isolation.c
> +++ b/tests/gem_ctx_isolation.c
> @@ -522,6 +522,32 @@ static void isolation(int fd,
>   #define S4 (4 << 8)
>   #define SLEEP_MASK (0xf << 8)
>   
> +static void inject_reset_context(int fd, unsigned int engine)
> +{
> +	igt_spin_t *spin;
> +	uint32_t ctx;
> +
> +	/*
> +	 * Force a context switch before triggering the reset, or else
> +	 * we risk corrupting the target context and we can't blame the
> +	 * HW for screwing up if the context was already broken.
> +	 */
> +
> +	ctx = gem_context_create(fd);
> +	if (gem_can_store_dword(fd, engine)) {
> +		spin = __igt_spin_batch_new_poll(fd, ctx, engine);
> +		igt_spin_busywait_until_running(spin);
> +	} else {
> +		spin = __igt_spin_batch_new(fd, ctx, engine, 0);
> +		usleep(1000); /* better than nothing */
> +	}
> +
> +	igt_force_gpu_reset(fd);
> +
> +	igt_spin_batch_free(fd, spin);
> +	gem_context_destroy(fd, ctx);
> +}
> +
>   static void preservation(int fd,
>   			 const struct intel_execution_engine2 *e,
>   			 unsigned int flags)
> @@ -558,7 +584,7 @@ static void preservation(int fd,
>   	igt_spin_batch_free(fd, spin);
>   
>   	if (flags & RESET)
> -		igt_force_gpu_reset(fd);
> +		inject_reset_context(fd, engine);
>   
>   	switch (flags & SLEEP_MASK) {
>   	case NOSLEEP:
> 

Reviewed-by: Tvrtko Ursulin <tvrtko.ursulin at intel.com>

Regards,

Tvrtko


More information about the igt-dev mailing list