drm/i915: Delay queuing hangcheck to wait-request
[cascardo/linux.git] / drivers / gpu / drm / i915 / i915_gem.c
index 1d98782..e0b1e28 100644 (file)
@@ -1532,6 +1532,15 @@ int __i915_wait_request(struct drm_i915_gem_request *req,
                        break;
                }
 
+               /* Ensure that even if the GPU hangs, we get woken up.
+                *
+                * However, note that if no one is waiting, we never notice
+                * a gpu hang. Eventually, we will have to wait for a resource
+                * held by the GPU and so trigger a hangcheck. In the most
+                * pathological case, this will be upon memory starvation!
+                */
+               i915_queue_hangcheck(dev_priv);
+
                timer.function = NULL;
                if (timeout || missed_irq(dev_priv, engine)) {
                        unsigned long expire;
@@ -2919,8 +2928,6 @@ void __i915_add_request(struct drm_i915_gem_request *request,
        /* Not allowed to fail! */
        WARN(ret, "emit|add_request failed: %d!\n", ret);
 
-       i915_queue_hangcheck(engine->i915);
-
        queue_delayed_work(dev_priv->wq,
                           &dev_priv->mm.retire_work,
                           round_jiffies_up_relative(HZ));
@@ -3264,8 +3271,8 @@ i915_gem_retire_requests(struct drm_i915_private *dev_priv)
 
        if (idle)
                mod_delayed_work(dev_priv->wq,
-                                  &dev_priv->mm.idle_work,
-                                  msecs_to_jiffies(100));
+                                &dev_priv->mm.idle_work,
+                                msecs_to_jiffies(100));
 
        return idle;
 }