From: Chris Wilson Date: Tue, 22 Oct 2019 11:21:11 +0000 (+0100) Subject: drm/i915/selftests: Synchronize checking active status with retirement X-Git-Tag: v5.5-rc1~128^2~19^2~128 X-Git-Url: https://asedeno.scripts.mit.edu/gitweb/?a=commitdiff_plain;h=f79520bb333792fb23a32352f83d8d59a525cec9;p=linux.git 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 Acked-by: Andi Shyti Link: https://patchwork.freedesktop.org/patch/msgid/20191022112111.9317-1-chris@chris-wilson.co.uk --- 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);