[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 <ch...@chris-wilson.co.uk>
Cc: Tvrtko Ursulin <tvrtko.ursu...@intel.com>
Cc: Joonas Lahtinen <joonas.lahti...@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.ursu...@intel.com>

Regards,

Tvrtko
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

Reply via email to