Merge tag 'drm-misc-next-2019-01-07-1' of git://anongit.freedesktop.org/drm/drm-misc...
[linux-2.6-block.git] / drivers / gpu / drm / i915 / selftests / intel_hangcheck.c
index 33494d922fab98b4906d9e29504854a1ee77ad5d..5910da3e7d7991f871342f733703dac28f01a1a5 100644 (file)
@@ -27,6 +27,7 @@
 #include "../i915_selftest.h"
 #include "i915_random.h"
 #include "igt_flush_test.h"
+#include "igt_reset.h"
 #include "igt_wedge_me.h"
 
 #include "mock_context.h"
@@ -308,6 +309,7 @@ static int igt_hang_sanitycheck(void *arg)
                goto unlock;
 
        for_each_engine(engine, i915, id) {
+               struct igt_wedge_me w;
                long timeout;
 
                if (!intel_engine_can_store_dword(engine))
@@ -328,9 +330,14 @@ static int igt_hang_sanitycheck(void *arg)
 
                i915_request_add(rq);
 
-               timeout = i915_request_wait(rq,
-                                           I915_WAIT_LOCKED,
-                                           MAX_SCHEDULE_TIMEOUT);
+               timeout = 0;
+               igt_wedge_on_timeout(&w, i915, HZ / 10 /* 100ms timeout*/)
+                       timeout = i915_request_wait(rq,
+                                                   I915_WAIT_LOCKED,
+                                                   MAX_SCHEDULE_TIMEOUT);
+               if (i915_terminally_wedged(&i915->gpu_error))
+                       timeout = -EIO;
+
                i915_request_put(rq);
 
                if (timeout < 0) {
@@ -348,40 +355,6 @@ unlock:
        return err;
 }
 
-static void global_reset_lock(struct drm_i915_private *i915)
-{
-       struct intel_engine_cs *engine;
-       enum intel_engine_id id;
-
-       pr_debug("%s: current gpu_error=%08lx\n",
-                __func__, i915->gpu_error.flags);
-
-       while (test_and_set_bit(I915_RESET_BACKOFF, &i915->gpu_error.flags))
-               wait_event(i915->gpu_error.reset_queue,
-                          !test_bit(I915_RESET_BACKOFF,
-                                    &i915->gpu_error.flags));
-
-       for_each_engine(engine, i915, id) {
-               while (test_and_set_bit(I915_RESET_ENGINE + id,
-                                       &i915->gpu_error.flags))
-                       wait_on_bit(&i915->gpu_error.flags,
-                                   I915_RESET_ENGINE + id,
-                                   TASK_UNINTERRUPTIBLE);
-       }
-}
-
-static void global_reset_unlock(struct drm_i915_private *i915)
-{
-       struct intel_engine_cs *engine;
-       enum intel_engine_id id;
-
-       for_each_engine(engine, i915, id)
-               clear_bit(I915_RESET_ENGINE + id, &i915->gpu_error.flags);
-
-       clear_bit(I915_RESET_BACKOFF, &i915->gpu_error.flags);
-       wake_up_all(&i915->gpu_error.reset_queue);
-}
-
 static int igt_global_reset(void *arg)
 {
        struct drm_i915_private *i915 = arg;
@@ -390,7 +363,7 @@ static int igt_global_reset(void *arg)
 
        /* Check that we can issue a global GPU reset */
 
-       global_reset_lock(i915);
+       igt_global_reset_lock(i915);
        set_bit(I915_RESET_HANDOFF, &i915->gpu_error.flags);
 
        mutex_lock(&i915->drm.struct_mutex);
@@ -405,7 +378,7 @@ static int igt_global_reset(void *arg)
        mutex_unlock(&i915->drm.struct_mutex);
 
        GEM_BUG_ON(test_bit(I915_RESET_HANDOFF, &i915->gpu_error.flags));
-       global_reset_unlock(i915);
+       igt_global_reset_unlock(i915);
 
        if (i915_terminally_wedged(&i915->gpu_error))
                err = -EIO;
@@ -936,7 +909,7 @@ static int igt_reset_wait(void *arg)
 
        /* Check that we detect a stuck waiter and issue a reset */
 
-       global_reset_lock(i915);
+       igt_global_reset_lock(i915);
 
        mutex_lock(&i915->drm.struct_mutex);
        err = hang_init(&h, i915);
@@ -988,7 +961,7 @@ fini:
        hang_fini(&h);
 unlock:
        mutex_unlock(&i915->drm.struct_mutex);
-       global_reset_unlock(i915);
+       igt_global_reset_unlock(i915);
 
        if (i915_terminally_wedged(&i915->gpu_error))
                return -EIO;
@@ -1066,7 +1039,7 @@ static int __igt_reset_evict_vma(struct drm_i915_private *i915,
 
        /* Check that we can recover an unbind stuck on a hanging request */
 
-       global_reset_lock(i915);
+       igt_global_reset_lock(i915);
 
        mutex_lock(&i915->drm.struct_mutex);
        err = hang_init(&h, i915);
@@ -1186,7 +1159,7 @@ fini:
        hang_fini(&h);
 unlock:
        mutex_unlock(&i915->drm.struct_mutex);
-       global_reset_unlock(i915);
+       igt_global_reset_unlock(i915);
 
        if (i915_terminally_wedged(&i915->gpu_error))
                return -EIO;
@@ -1266,7 +1239,7 @@ static int igt_reset_queue(void *arg)
 
        /* Check that we replay pending requests following a hang */
 
-       global_reset_lock(i915);
+       igt_global_reset_lock(i915);
 
        mutex_lock(&i915->drm.struct_mutex);
        err = hang_init(&h, i915);
@@ -1397,7 +1370,7 @@ fini:
        hang_fini(&h);
 unlock:
        mutex_unlock(&i915->drm.struct_mutex);
-       global_reset_unlock(i915);
+       igt_global_reset_unlock(i915);
 
        if (i915_terminally_wedged(&i915->gpu_error))
                return -EIO;