drm/i915/selftests: Live tests emit requests and so require rpm

As we emit requests or touch HW directly for some of the live tests, the
requirement is that we hold the rpm wakeref before doing so. We want a
mix of granularity since we will want to test runtime suspend, so try to
mark up only the critical sections where we need rpm for the live test.

Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=108002
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Reviewed-by: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20180920144934.16611-1-chris@chris-wilson.co.uk
This commit is contained in:
Chris Wilson 2018-09-20 15:49:34 +01:00
parent 8c01903c17
commit b8bdd9cc60
6 changed files with 33 additions and 0 deletions

View File

@ -298,6 +298,7 @@ static int igt_gem_coherency(void *arg)
values = offsets + ncachelines; values = offsets + ncachelines;
mutex_lock(&i915->drm.struct_mutex); mutex_lock(&i915->drm.struct_mutex);
intel_runtime_pm_get(i915);
for (over = igt_coherency_mode; over->name; over++) { for (over = igt_coherency_mode; over->name; over++) {
if (!over->set) if (!over->set)
continue; continue;
@ -375,6 +376,7 @@ static int igt_gem_coherency(void *arg)
} }
} }
unlock: unlock:
intel_runtime_pm_put(i915);
mutex_unlock(&i915->drm.struct_mutex); mutex_unlock(&i915->drm.struct_mutex);
kfree(offsets); kfree(offsets);
return err; return err;

View File

@ -119,6 +119,7 @@ static int live_nop_switch(void *arg)
return PTR_ERR(file); return PTR_ERR(file);
mutex_lock(&i915->drm.struct_mutex); mutex_lock(&i915->drm.struct_mutex);
intel_runtime_pm_get(i915);
ctx = kcalloc(nctx, sizeof(*ctx), GFP_KERNEL); ctx = kcalloc(nctx, sizeof(*ctx), GFP_KERNEL);
if (!ctx) { if (!ctx) {
@ -221,6 +222,7 @@ static int live_nop_switch(void *arg)
} }
out_unlock: out_unlock:
intel_runtime_pm_put(i915);
mutex_unlock(&i915->drm.struct_mutex); mutex_unlock(&i915->drm.struct_mutex);
mock_file_free(i915, file); mock_file_free(i915, file);
return err; return err;
@ -831,6 +833,8 @@ static int igt_switch_to_kernel_context(void *arg)
*/ */
mutex_lock(&i915->drm.struct_mutex); mutex_lock(&i915->drm.struct_mutex);
intel_runtime_pm_get(i915);
ctx = kernel_context(i915); ctx = kernel_context(i915);
if (IS_ERR(ctx)) { if (IS_ERR(ctx)) {
mutex_unlock(&i915->drm.struct_mutex); mutex_unlock(&i915->drm.struct_mutex);
@ -853,6 +857,8 @@ out_unlock:
GEM_TRACE_DUMP_ON(err); GEM_TRACE_DUMP_ON(err);
if (igt_flush_test(i915, I915_WAIT_LOCKED)) if (igt_flush_test(i915, I915_WAIT_LOCKED))
err = -EIO; err = -EIO;
intel_runtime_pm_put(i915);
mutex_unlock(&i915->drm.struct_mutex); mutex_unlock(&i915->drm.struct_mutex);
kernel_context_close(ctx); kernel_context_close(ctx);

View File

@ -342,6 +342,7 @@ static int live_nop_request(void *arg)
*/ */
mutex_lock(&i915->drm.struct_mutex); mutex_lock(&i915->drm.struct_mutex);
intel_runtime_pm_get(i915);
for_each_engine(engine, i915, id) { for_each_engine(engine, i915, id) {
struct i915_request *request = NULL; struct i915_request *request = NULL;
@ -402,6 +403,7 @@ static int live_nop_request(void *arg)
} }
out_unlock: out_unlock:
intel_runtime_pm_put(i915);
mutex_unlock(&i915->drm.struct_mutex); mutex_unlock(&i915->drm.struct_mutex);
return err; return err;
} }
@ -487,6 +489,7 @@ static int live_empty_request(void *arg)
*/ */
mutex_lock(&i915->drm.struct_mutex); mutex_lock(&i915->drm.struct_mutex);
intel_runtime_pm_get(i915);
batch = empty_batch(i915); batch = empty_batch(i915);
if (IS_ERR(batch)) { if (IS_ERR(batch)) {
@ -550,6 +553,7 @@ out_batch:
i915_vma_unpin(batch); i915_vma_unpin(batch);
i915_vma_put(batch); i915_vma_put(batch);
out_unlock: out_unlock:
intel_runtime_pm_put(i915);
mutex_unlock(&i915->drm.struct_mutex); mutex_unlock(&i915->drm.struct_mutex);
return err; return err;
} }
@ -644,6 +648,7 @@ static int live_all_engines(void *arg)
*/ */
mutex_lock(&i915->drm.struct_mutex); mutex_lock(&i915->drm.struct_mutex);
intel_runtime_pm_get(i915);
err = begin_live_test(&t, i915, __func__, ""); err = begin_live_test(&t, i915, __func__, "");
if (err) if (err)
@ -726,6 +731,7 @@ out_request:
i915_vma_unpin(batch); i915_vma_unpin(batch);
i915_vma_put(batch); i915_vma_put(batch);
out_unlock: out_unlock:
intel_runtime_pm_put(i915);
mutex_unlock(&i915->drm.struct_mutex); mutex_unlock(&i915->drm.struct_mutex);
return err; return err;
} }
@ -747,6 +753,7 @@ static int live_sequential_engines(void *arg)
*/ */
mutex_lock(&i915->drm.struct_mutex); mutex_lock(&i915->drm.struct_mutex);
intel_runtime_pm_get(i915);
err = begin_live_test(&t, i915, __func__, ""); err = begin_live_test(&t, i915, __func__, "");
if (err) if (err)
@ -853,6 +860,7 @@ out_request:
i915_request_put(request[id]); i915_request_put(request[id]);
} }
out_unlock: out_unlock:
intel_runtime_pm_put(i915);
mutex_unlock(&i915->drm.struct_mutex); mutex_unlock(&i915->drm.struct_mutex);
return err; return err;
} }

View File

@ -142,6 +142,7 @@ static int igt_guc_clients(void *args)
GEM_BUG_ON(!HAS_GUC(dev_priv)); GEM_BUG_ON(!HAS_GUC(dev_priv));
mutex_lock(&dev_priv->drm.struct_mutex); mutex_lock(&dev_priv->drm.struct_mutex);
intel_runtime_pm_get(dev_priv);
guc = &dev_priv->guc; guc = &dev_priv->guc;
if (!guc) { if (!guc) {
@ -269,6 +270,7 @@ out:
guc_clients_create(guc); guc_clients_create(guc);
guc_clients_doorbell_init(guc); guc_clients_doorbell_init(guc);
unlock: unlock:
intel_runtime_pm_put(dev_priv);
mutex_unlock(&dev_priv->drm.struct_mutex); mutex_unlock(&dev_priv->drm.struct_mutex);
return err; return err;
} }
@ -287,6 +289,7 @@ static int igt_guc_doorbells(void *arg)
GEM_BUG_ON(!HAS_GUC(dev_priv)); GEM_BUG_ON(!HAS_GUC(dev_priv));
mutex_lock(&dev_priv->drm.struct_mutex); mutex_lock(&dev_priv->drm.struct_mutex);
intel_runtime_pm_get(dev_priv);
guc = &dev_priv->guc; guc = &dev_priv->guc;
if (!guc) { if (!guc) {
@ -379,6 +382,7 @@ out:
guc_client_free(clients[i]); guc_client_free(clients[i]);
} }
unlock: unlock:
intel_runtime_pm_put(dev_priv);
mutex_unlock(&dev_priv->drm.struct_mutex); mutex_unlock(&dev_priv->drm.struct_mutex);
return err; return err;
} }

View File

@ -221,6 +221,7 @@ static int live_sanitycheck(void *arg)
return 0; return 0;
mutex_lock(&i915->drm.struct_mutex); mutex_lock(&i915->drm.struct_mutex);
intel_runtime_pm_get(i915);
if (spinner_init(&spin, i915)) if (spinner_init(&spin, i915))
goto err_unlock; goto err_unlock;
@ -261,6 +262,7 @@ err_spin:
spinner_fini(&spin); spinner_fini(&spin);
err_unlock: err_unlock:
igt_flush_test(i915, I915_WAIT_LOCKED); igt_flush_test(i915, I915_WAIT_LOCKED);
intel_runtime_pm_put(i915);
mutex_unlock(&i915->drm.struct_mutex); mutex_unlock(&i915->drm.struct_mutex);
return err; return err;
} }
@ -278,6 +280,7 @@ static int live_preempt(void *arg)
return 0; return 0;
mutex_lock(&i915->drm.struct_mutex); mutex_lock(&i915->drm.struct_mutex);
intel_runtime_pm_get(i915);
if (spinner_init(&spin_hi, i915)) if (spinner_init(&spin_hi, i915))
goto err_unlock; goto err_unlock;
@ -350,6 +353,7 @@ err_spin_hi:
spinner_fini(&spin_hi); spinner_fini(&spin_hi);
err_unlock: err_unlock:
igt_flush_test(i915, I915_WAIT_LOCKED); igt_flush_test(i915, I915_WAIT_LOCKED);
intel_runtime_pm_put(i915);
mutex_unlock(&i915->drm.struct_mutex); mutex_unlock(&i915->drm.struct_mutex);
return err; return err;
} }
@ -368,6 +372,7 @@ static int live_late_preempt(void *arg)
return 0; return 0;
mutex_lock(&i915->drm.struct_mutex); mutex_lock(&i915->drm.struct_mutex);
intel_runtime_pm_get(i915);
if (spinner_init(&spin_hi, i915)) if (spinner_init(&spin_hi, i915))
goto err_unlock; goto err_unlock;
@ -440,6 +445,7 @@ err_spin_hi:
spinner_fini(&spin_hi); spinner_fini(&spin_hi);
err_unlock: err_unlock:
igt_flush_test(i915, I915_WAIT_LOCKED); igt_flush_test(i915, I915_WAIT_LOCKED);
intel_runtime_pm_put(i915);
mutex_unlock(&i915->drm.struct_mutex); mutex_unlock(&i915->drm.struct_mutex);
return err; return err;
@ -467,6 +473,7 @@ static int live_preempt_hang(void *arg)
return 0; return 0;
mutex_lock(&i915->drm.struct_mutex); mutex_lock(&i915->drm.struct_mutex);
intel_runtime_pm_get(i915);
if (spinner_init(&spin_hi, i915)) if (spinner_init(&spin_hi, i915))
goto err_unlock; goto err_unlock;
@ -561,6 +568,7 @@ err_spin_hi:
spinner_fini(&spin_hi); spinner_fini(&spin_hi);
err_unlock: err_unlock:
igt_flush_test(i915, I915_WAIT_LOCKED); igt_flush_test(i915, I915_WAIT_LOCKED);
intel_runtime_pm_put(i915);
mutex_unlock(&i915->drm.struct_mutex); mutex_unlock(&i915->drm.struct_mutex);
return err; return err;
} }

View File

@ -44,7 +44,9 @@ read_nonprivs(struct i915_gem_context *ctx, struct intel_engine_cs *engine)
if (err) if (err)
goto err_obj; goto err_obj;
intel_runtime_pm_get(engine->i915);
rq = i915_request_alloc(engine, ctx); rq = i915_request_alloc(engine, ctx);
intel_runtime_pm_put(engine->i915);
if (IS_ERR(rq)) { if (IS_ERR(rq)) {
err = PTR_ERR(rq); err = PTR_ERR(rq);
goto err_pin; goto err_pin;
@ -175,7 +177,10 @@ static int switch_to_scratch_context(struct intel_engine_cs *engine)
if (IS_ERR(ctx)) if (IS_ERR(ctx))
return PTR_ERR(ctx); return PTR_ERR(ctx);
intel_runtime_pm_get(engine->i915);
rq = i915_request_alloc(engine, ctx); rq = i915_request_alloc(engine, ctx);
intel_runtime_pm_put(engine->i915);
kernel_context_close(ctx); kernel_context_close(ctx);
if (IS_ERR(rq)) if (IS_ERR(rq))
return PTR_ERR(rq); return PTR_ERR(rq);