In order to test how fast the heartbeat can respond, we measure with the
interval set to its minimum. Before we measure though, we want to be
sure we start with a fresh pulse, and so wait until any old one is
complete. During that wait though, we were continually flushing the
work, and so continually re-evaluating to see if the pulse was complete,
and each attempt would count as an unresponsive system. If the engine
did not complete the request in the couple of busy-spins, it would flag
an error. This is unfortunate, so let's not busy-spin waiting for the
old heartbeat, but terminate it and start afresh.

Signed-off-by: Chris Wilson <[email protected]>
---
 drivers/gpu/drm/i915/gt/selftest_engine_heartbeat.c | 13 +++++++------
 1 file changed, 7 insertions(+), 6 deletions(-)

diff --git a/drivers/gpu/drm/i915/gt/selftest_engine_heartbeat.c 
b/drivers/gpu/drm/i915/gt/selftest_engine_heartbeat.c
index e73854dd2fe0..b88aa35ad75b 100644
--- a/drivers/gpu/drm/i915/gt/selftest_engine_heartbeat.c
+++ b/drivers/gpu/drm/i915/gt/selftest_engine_heartbeat.c
@@ -215,16 +215,17 @@ static int __live_heartbeat_fast(struct intel_engine_cs 
*engine)
                goto err_pm;
 
        for (i = 0; i < ARRAY_SIZE(times); i++) {
-               /* Manufacture a tick */
                do {
-                       while (READ_ONCE(engine->heartbeat.systole))
-                               flush_delayed_work(&engine->heartbeat.work);
+                       /* Manufacture a tick */
+                       intel_engine_park_heartbeat(engine);
+                       GEM_BUG_ON(engine->heartbeat.systole);
+                       engine->serial++; /*  pretend we are not idle! */
+                       intel_engine_unpark_heartbeat(engine);
 
-                       engine->serial++; /* quick, pretend we are not idle! */
                        flush_delayed_work(&engine->heartbeat.work);
                        if (!delayed_work_pending(&engine->heartbeat.work)) {
-                               pr_err("%s: heartbeat did not start\n",
-                                      engine->name);
+                               pr_err("%s: heartbeat %d did not start\n",
+                                      engine->name, i);
                                err = -EINVAL;
                                goto err_pm;
                        }
-- 
2.20.1

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

Reply via email to