Commit 6d728d92 authored by Chris Wilson's avatar Chris Wilson

drm/i915/selftests: Impose a timeout for request submission

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: default avatarChris Wilson <chris@chris-wilson.co.uk>
Reviewed-by: default avatarMaarten Lankhorst <maarten.lankhorst@linux.intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20200106114234.2529613-2-chris@chris-wilson.co.uk
parent a5799832
...@@ -527,13 +527,19 @@ static struct i915_request *nop_request(struct intel_engine_cs *engine) ...@@ -527,13 +527,19 @@ static struct i915_request *nop_request(struct intel_engine_cs *engine)
return rq; return rq;
} }
static void wait_for_submit(struct intel_engine_cs *engine, static int wait_for_submit(struct intel_engine_cs *engine,
struct i915_request *rq) struct i915_request *rq,
unsigned long timeout)
{ {
timeout += jiffies;
do { do {
cond_resched(); cond_resched();
intel_engine_flush_submission(engine); 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) static long timeslice_threshold(const struct intel_engine_cs *engine)
...@@ -601,7 +607,12 @@ static int live_timeslice_queue(void *arg) ...@@ -601,7 +607,12 @@ static int live_timeslice_queue(void *arg)
goto err_heartbeat; goto err_heartbeat;
} }
engine->schedule(rq, &attr); 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 */ /* ELSP[1]: nop request */
nop = nop_request(engine); nop = nop_request(engine);
...@@ -609,8 +620,13 @@ static int live_timeslice_queue(void *arg) ...@@ -609,8 +620,13 @@ static int live_timeslice_queue(void *arg)
err = PTR_ERR(nop); err = PTR_ERR(nop);
goto err_rq; goto err_rq;
} }
wait_for_submit(engine, nop); err = wait_for_submit(engine, nop, HZ / 2);
i915_request_put(nop); 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(i915_request_completed(rq));
GEM_BUG_ON(execlists_active(&engine->execlists) != rq); GEM_BUG_ON(execlists_active(&engine->execlists) != rq);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment