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

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
Loading
Loading
Loading
Loading
+21 −5
Original line number Original line Diff line number Diff line
@@ -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)
			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)
			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);