Through debugfs, we expose methods for igt to check and control use of
the fake-irq (for missed breadcrumb detection). Currently, we don't
disable the fake-irq immediately after noticing the bit being cleared,
presuming that we will idle soon enough. However, we can check within
the fake-irq worker and switch back to the slow hangcheck if we notice
that the user disabled the fake-irq.

Signed-off-by: Chris Wilson <[email protected]>
Cc: Tvrtko Ursulin <[email protected]>
---
 drivers/gpu/drm/i915/intel_breadcrumbs.c | 16 ++++++++++++----
 1 file changed, 12 insertions(+), 4 deletions(-)

diff --git a/drivers/gpu/drm/i915/intel_breadcrumbs.c 
b/drivers/gpu/drm/i915/intel_breadcrumbs.c
index 58c624f982d9..acd7412eacb8 100644
--- a/drivers/gpu/drm/i915/intel_breadcrumbs.c
+++ b/drivers/gpu/drm/i915/intel_breadcrumbs.c
@@ -130,11 +130,12 @@ static void intel_breadcrumbs_hangcheck(struct timer_list 
*t)
 
 static void intel_breadcrumbs_fake_irq(struct timer_list *t)
 {
-       struct intel_engine_cs *engine = from_timer(engine, t,
-                                                   breadcrumbs.fake_irq);
+       struct intel_engine_cs *engine =
+               from_timer(engine, t, breadcrumbs.fake_irq);
        struct intel_breadcrumbs *b = &engine->breadcrumbs;
 
-       /* The timer persists in case we cannot enable interrupts,
+       /*
+        * The timer persists in case we cannot enable interrupts,
         * or if we have previously seen seqno/interrupt incoherency
         * ("missed interrupt" syndrome, better known as a "missed breadcrumb").
         * Here the worker will wake up every jiffie in order to kick the
@@ -148,9 +149,16 @@ static void intel_breadcrumbs_fake_irq(struct timer_list 
*t)
        if (!b->irq_armed)
                return;
 
+       /* If the user has disabled the fake-irq, restore the hangchecking */
+       if (!test_bit(engine->id, &engine->i915->gpu_error.missed_irq_rings)) {
+               mod_timer(&b->hangcheck, wait_timeout());
+               return;
+       }
+
        mod_timer(&b->fake_irq, jiffies + 1);
 
-       /* Ensure that even if the GPU hangs, we get woken up.
+       /*
+        * 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
-- 
2.15.1

_______________________________________________
Intel-gfx mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

Reply via email to