summaryrefslogtreecommitdiff
path: root/drivers
diff options
context:
space:
mode:
authorChris Wilson <chris@chris-wilson.co.uk>2019-10-22 14:21:11 +0300
committerChris Wilson <chris@chris-wilson.co.uk>2019-10-22 23:12:23 +0300
commitf79520bb333792fb23a32352f83d8d59a525cec9 (patch)
tree59b94f3dba064ea10a63d15d0b83d29a8b847a69 /drivers
parent905da43c6a02b57232c1f087b94bc606f6376632 (diff)
downloadlinux-f79520bb333792fb23a32352f83d8d59a525cec9.tar.xz
drm/i915/selftests: Synchronize checking active status with retirement
If retirement is running on another thread, we may inspect the status of the i915_active before its retirement callback is complete. As we expect it to be running synchronously, we can wait for any callback to complete by acquiring the i915_active.mutex. Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> Acked-by: Andi Shyti <andi.shyti@intel.com> Link: https://patchwork.freedesktop.org/patch/msgid/20191022112111.9317-1-chris@chris-wilson.co.uk
Diffstat (limited to 'drivers')
-rw-r--r--drivers/gpu/drm/i915/gt/selftest_engine_heartbeat.c13
1 files changed, 13 insertions, 0 deletions
diff --git a/drivers/gpu/drm/i915/gt/selftest_engine_heartbeat.c b/drivers/gpu/drm/i915/gt/selftest_engine_heartbeat.c
index 1f5ab59ad6e7..5af27c37b65b 100644
--- a/drivers/gpu/drm/i915/gt/selftest_engine_heartbeat.c
+++ b/drivers/gpu/drm/i915/gt/selftest_engine_heartbeat.c
@@ -49,12 +49,20 @@ static struct pulse *pulse_create(void)
return p;
}
+static void pulse_unlock_wait(struct pulse *p)
+{
+ mutex_lock(&p->active.mutex);
+ mutex_unlock(&p->active.mutex);
+}
+
static int __live_idle_pulse(struct intel_engine_cs *engine,
int (*fn)(struct intel_engine_cs *cs))
{
struct pulse *p;
int err;
+ GEM_BUG_ON(!intel_engine_pm_is_awake(engine));
+
p = pulse_create();
if (!p)
return -ENOMEM;
@@ -73,16 +81,21 @@ static int __live_idle_pulse(struct intel_engine_cs *engine,
i915_active_release(&p->active);
GEM_BUG_ON(i915_active_is_idle(&p->active));
+ GEM_BUG_ON(llist_empty(&engine->barrier_tasks));
err = fn(engine);
if (err)
goto out;
+ GEM_BUG_ON(!llist_empty(&engine->barrier_tasks));
+
if (intel_gt_retire_requests_timeout(engine->gt, HZ / 5)) {
err = -ETIME;
goto out;
}
+ pulse_unlock_wait(p); /* synchronize with the retirement callback */
+
if (!i915_active_is_idle(&p->active)) {
pr_err("%s: heartbeat pulse did not flush idle tasks\n",
engine->name);