summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris Wilson <chris@chris-wilson.co.uk>2018-03-27 14:44:30 +0100
committerChris Wilson <chris@chris-wilson.co.uk>2018-03-27 22:51:20 +0100
commit0a393229479d61829a2f8671c1a46f533c76b385 (patch)
tree9dd6297bb523e63a8afebf6b80ed5c4bbe38f9a5
parentd5657417d6e5ac67c5af17688246977de258bfaa (diff)
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 <chris@chris-wilson.co.uk> Cc: Tvrtko Ursulin <tvrtko.ursulin@intel.com> Cc: Joonas Lahtinen <joonas.lahtinen@linux.intel.com> Reviewed-by: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
-rw-r--r--tests/gem_ctx_isolation.c28
1 files changed, 27 insertions, 1 deletions
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: