drm/i915/selftests: Impose a timeout for request submission
authorChris Wilson <chris@chris-wilson.co.uk>
Mon, 6 Jan 2020 11:42:30 +0000 (11:42 +0000)
committerChris Wilson <chris@chris-wilson.co.uk>
Mon, 6 Jan 2020 14:38:55 +0000 (14:38 +0000)
Avoid spinning indefinitely waiting for the request to be submitted, and
instead apply a timeout. A secondary benefit is that the error message
will show which suspect is blocked.

Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Reviewed-by: Maarten Lankhorst <maarten.lankhorst@linux.intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20200106114234.2529613-2-chris@chris-wilson.co.uk
drivers/gpu/drm/i915/gt/selftest_lrc.c

index 627613d..d96604b 100644 (file)
@@ -527,13 +527,19 @@ static struct i915_request *nop_request(struct intel_engine_cs *engine)
        return rq;
 }
 
-static void wait_for_submit(struct intel_engine_cs *engine,
-                           struct i915_request *rq)
+static int wait_for_submit(struct intel_engine_cs *engine,
+                          struct i915_request *rq,
+                          unsigned long timeout)
 {
+       timeout += jiffies;
        do {
                cond_resched();
                intel_engine_flush_submission(engine);
-       } while (!i915_request_is_active(rq));
+               if (i915_request_is_active(rq))
+                       return 0;
+       } while (time_before(jiffies, timeout));
+
+       return -ETIME;
 }
 
 static long timeslice_threshold(const struct intel_engine_cs *engine)
@@ -601,7 +607,12 @@ static int live_timeslice_queue(void *arg)
                        goto err_heartbeat;
                }
                engine->schedule(rq, &attr);
-               wait_for_submit(engine, rq);
+               err = wait_for_submit(engine, rq, HZ / 2);
+               if (err) {
+                       pr_err("%s: Timed out trying to submit semaphores\n",
+                              engine->name);
+                       goto err_rq;
+               }
 
                /* ELSP[1]: nop request */
                nop = nop_request(engine);
@@ -609,8 +620,13 @@ static int live_timeslice_queue(void *arg)
                        err = PTR_ERR(nop);
                        goto err_rq;
                }
-               wait_for_submit(engine, nop);
+               err = wait_for_submit(engine, nop, HZ / 2);
                i915_request_put(nop);
+               if (err) {
+                       pr_err("%s: Timed out trying to submit nop\n",
+                              engine->name);
+                       goto err_rq;
+               }
 
                GEM_BUG_ON(i915_request_completed(rq));
                GEM_BUG_ON(execlists_active(&engine->execlists) != rq);