From 0a393229479d61829a2f8671c1a46f533c76b385 Mon Sep 17 00:00:00 2001 From: Chris Wilson Date: Tue, 27 Mar 2018 14:44:30 +0100 Subject: igt/gem_ctx_isolation: Reset a scratch context 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 Cc: Tvrtko Ursulin Cc: Joonas Lahtinen Reviewed-by: Tvrtko Ursulin --- 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: -- cgit v1.2.3