Transition from calling the lower level intel_runtime_pm functions to using the GEM runtime_pm functions (i915_gem_unpark, i915_gem_park) now that they are decoupled from struct_mutex. This has the small advantage of reducing our overhead for request emission and ensuring that GEM state is locked awake during the tests (to reduce interference). Signed-off-by: Chris Wilson <chris@xxxxxxxxxxxxxxxxxx> --- drivers/gpu/drm/i915/selftests/huge_pages.c | 5 +- drivers/gpu/drm/i915/selftests/i915_active.c | 11 ++--- drivers/gpu/drm/i915/selftests/i915_gem.c | 5 +- .../drm/i915/selftests/i915_gem_coherency.c | 6 +-- .../gpu/drm/i915/selftests/i915_gem_context.c | 49 ++++++++----------- .../gpu/drm/i915/selftests/i915_gem_evict.c | 6 +-- .../gpu/drm/i915/selftests/i915_gem_object.c | 8 ++- drivers/gpu/drm/i915/selftests/i915_request.c | 33 ++++++------- .../gpu/drm/i915/selftests/i915_timeline.c | 21 ++++---- drivers/gpu/drm/i915/selftests/intel_guc.c | 9 ++-- .../gpu/drm/i915/selftests/intel_hangcheck.c | 19 ++++--- drivers/gpu/drm/i915/selftests/intel_lrc.c | 41 +++++++--------- .../drm/i915/selftests/intel_workarounds.c | 23 ++++----- 13 files changed, 105 insertions(+), 131 deletions(-) diff --git a/drivers/gpu/drm/i915/selftests/huge_pages.c b/drivers/gpu/drm/i915/selftests/huge_pages.c index 90721b54e7ae..1597a6e1f364 100644 --- a/drivers/gpu/drm/i915/selftests/huge_pages.c +++ b/drivers/gpu/drm/i915/selftests/huge_pages.c @@ -1753,7 +1753,6 @@ int i915_gem_huge_page_live_selftests(struct drm_i915_private *dev_priv) }; struct drm_file *file; struct i915_gem_context *ctx; - intel_wakeref_t wakeref; int err; if (!HAS_PPGTT(dev_priv)) { @@ -1769,7 +1768,7 @@ int i915_gem_huge_page_live_selftests(struct drm_i915_private *dev_priv) return PTR_ERR(file); mutex_lock(&dev_priv->drm.struct_mutex); - wakeref = intel_runtime_pm_get(dev_priv); + i915_gem_unpark(dev_priv); ctx = live_context(dev_priv, file); if (IS_ERR(ctx)) { @@ -1783,7 +1782,7 @@ int i915_gem_huge_page_live_selftests(struct drm_i915_private *dev_priv) err = i915_subtests(tests, ctx); out_unlock: - intel_runtime_pm_put(dev_priv, wakeref); + i915_gem_park(dev_priv); mutex_unlock(&dev_priv->drm.struct_mutex); mock_file_free(dev_priv, file); diff --git a/drivers/gpu/drm/i915/selftests/i915_active.c b/drivers/gpu/drm/i915/selftests/i915_active.c index 27d8f853111b..42bcceba175c 100644 --- a/drivers/gpu/drm/i915/selftests/i915_active.c +++ b/drivers/gpu/drm/i915/selftests/i915_active.c @@ -5,6 +5,7 @@ */ #include "../i915_selftest.h" +#include "../i915_gem_pm.h" #include "igt_flush_test.h" #include "lib_sw_fence.h" @@ -89,13 +90,12 @@ static int live_active_wait(void *arg) { struct drm_i915_private *i915 = arg; struct live_active active; - intel_wakeref_t wakeref; int err; /* Check that we get a callback when requests retire upon waiting */ + i915_gem_unpark(i915); mutex_lock(&i915->drm.struct_mutex); - wakeref = intel_runtime_pm_get(i915); err = __live_active_setup(i915, &active); @@ -109,8 +109,8 @@ static int live_active_wait(void *arg) if (igt_flush_test(i915, I915_WAIT_LOCKED)) err = -EIO; - intel_runtime_pm_put(i915, wakeref); mutex_unlock(&i915->drm.struct_mutex); + i915_gem_park(i915); return err; } @@ -118,13 +118,12 @@ static int live_active_retire(void *arg) { struct drm_i915_private *i915 = arg; struct live_active active; - intel_wakeref_t wakeref; int err; /* Check that we get a callback when requests are indirectly retired */ + i915_gem_unpark(i915); mutex_lock(&i915->drm.struct_mutex); - wakeref = intel_runtime_pm_get(i915); err = __live_active_setup(i915, &active); @@ -138,8 +137,8 @@ static int live_active_retire(void *arg) } i915_active_fini(&active.base); - intel_runtime_pm_put(i915, wakeref); mutex_unlock(&i915->drm.struct_mutex); + i915_gem_park(i915); return err; } diff --git a/drivers/gpu/drm/i915/selftests/i915_gem.c b/drivers/gpu/drm/i915/selftests/i915_gem.c index 50bb7bbd26d3..7d79f1fe6bbd 100644 --- a/drivers/gpu/drm/i915/selftests/i915_gem.c +++ b/drivers/gpu/drm/i915/selftests/i915_gem.c @@ -16,10 +16,9 @@ static int switch_to_context(struct drm_i915_private *i915, { struct intel_engine_cs *engine; enum intel_engine_id id; - intel_wakeref_t wakeref; int err = 0; - wakeref = intel_runtime_pm_get(i915); + i915_gem_unpark(i915); for_each_engine(engine, i915, id) { struct i915_request *rq; @@ -33,7 +32,7 @@ static int switch_to_context(struct drm_i915_private *i915, i915_request_add(rq); } - intel_runtime_pm_put(i915, wakeref); + i915_gem_park(i915); return err; } diff --git a/drivers/gpu/drm/i915/selftests/i915_gem_coherency.c b/drivers/gpu/drm/i915/selftests/i915_gem_coherency.c index e43630b40fce..497929238f02 100644 --- a/drivers/gpu/drm/i915/selftests/i915_gem_coherency.c +++ b/drivers/gpu/drm/i915/selftests/i915_gem_coherency.c @@ -279,7 +279,6 @@ static int igt_gem_coherency(void *arg) struct drm_i915_private *i915 = arg; const struct igt_coherency_mode *read, *write, *over; struct drm_i915_gem_object *obj; - intel_wakeref_t wakeref; unsigned long count, n; u32 *offsets, *values; int err = 0; @@ -298,8 +297,9 @@ static int igt_gem_coherency(void *arg) values = offsets + ncachelines; + i915_gem_unpark(i915); mutex_lock(&i915->drm.struct_mutex); - wakeref = intel_runtime_pm_get(i915); + for (over = igt_coherency_mode; over->name; over++) { if (!over->set) continue; @@ -377,8 +377,8 @@ static int igt_gem_coherency(void *arg) } } unlock: - intel_runtime_pm_put(i915, wakeref); mutex_unlock(&i915->drm.struct_mutex); + i915_gem_park(i915); kfree(offsets); return err; diff --git a/drivers/gpu/drm/i915/selftests/i915_gem_context.c b/drivers/gpu/drm/i915/selftests/i915_gem_context.c index 6ce366091e0b..b4039df633ec 100644 --- a/drivers/gpu/drm/i915/selftests/i915_gem_context.c +++ b/drivers/gpu/drm/i915/selftests/i915_gem_context.c @@ -24,6 +24,7 @@ #include <linux/prime_numbers.h> +#include "../i915_gem_pm.h" #include "../i915_reset.h" #include "../i915_selftest.h" #include "i915_random.h" @@ -45,7 +46,6 @@ static int live_nop_switch(void *arg) struct intel_engine_cs *engine; struct i915_gem_context **ctx; enum intel_engine_id id; - intel_wakeref_t wakeref; struct igt_live_test t; struct drm_file *file; unsigned long n; @@ -66,8 +66,8 @@ static int live_nop_switch(void *arg) if (IS_ERR(file)) return PTR_ERR(file); + i915_gem_unpark(i915); mutex_lock(&i915->drm.struct_mutex); - wakeref = intel_runtime_pm_get(i915); ctx = kcalloc(nctx, sizeof(*ctx), GFP_KERNEL); if (!ctx) { @@ -170,8 +170,8 @@ static int live_nop_switch(void *arg) } out_unlock: - intel_runtime_pm_put(i915, wakeref); mutex_unlock(&i915->drm.struct_mutex); + i915_gem_park(i915); mock_file_free(i915, file); return err; } @@ -514,6 +514,7 @@ static int igt_ctx_exec(void *arg) if (IS_ERR(file)) return PTR_ERR(file); + i915_gem_unpark(i915); mutex_lock(&i915->drm.struct_mutex); err = igt_live_test_begin(&t, i915, __func__, engine->name); @@ -525,7 +526,6 @@ static int igt_ctx_exec(void *arg) dw = 0; while (!time_after(jiffies, end_time)) { struct i915_gem_context *ctx; - intel_wakeref_t wakeref; ctx = live_context(i915, file); if (IS_ERR(ctx)) { @@ -541,8 +541,7 @@ static int igt_ctx_exec(void *arg) } } - with_intel_runtime_pm(i915, wakeref) - err = gpu_fill(obj, ctx, engine, dw); + err = gpu_fill(obj, ctx, engine, dw); if (err) { pr_err("Failed to fill dword %lu [%lu/%lu] with gpu (%s) in ctx %u [full-ppgtt? %s], err=%d\n", ndwords, dw, max_dwords(obj), @@ -579,6 +578,7 @@ static int igt_ctx_exec(void *arg) if (igt_live_test_end(&t)) err = -EIO; mutex_unlock(&i915->drm.struct_mutex); + i915_gem_park(i915); mock_file_free(i915, file); if (err) @@ -610,6 +610,7 @@ static int igt_shared_ctx_exec(void *arg) if (IS_ERR(file)) return PTR_ERR(file); + i915_gem_unpark(i915); mutex_lock(&i915->drm.struct_mutex); parent = live_context(i915, file); @@ -641,7 +642,6 @@ static int igt_shared_ctx_exec(void *arg) ncontexts = 0; while (!time_after(jiffies, end_time)) { struct i915_gem_context *ctx; - intel_wakeref_t wakeref; ctx = kernel_context(i915); if (IS_ERR(ctx)) { @@ -660,9 +660,7 @@ static int igt_shared_ctx_exec(void *arg) } } - err = 0; - with_intel_runtime_pm(i915, wakeref) - err = gpu_fill(obj, ctx, engine, dw); + err = gpu_fill(obj, ctx, engine, dw); if (err) { pr_err("Failed to fill dword %lu [%lu/%lu] with gpu (%s) in ctx %u [full-ppgtt? %s], err=%d\n", ndwords, dw, max_dwords(obj), @@ -702,6 +700,7 @@ static int igt_shared_ctx_exec(void *arg) err = -EIO; out_unlock: mutex_unlock(&i915->drm.struct_mutex); + i915_gem_park(i915); mock_file_free(i915, file); return err; @@ -1052,7 +1051,6 @@ __igt_ctx_sseu(struct drm_i915_private *i915, struct drm_i915_gem_object *obj; struct i915_gem_context *ctx; struct intel_sseu pg_sseu; - intel_wakeref_t wakeref; struct drm_file *file; int ret; @@ -1100,7 +1098,7 @@ __igt_ctx_sseu(struct drm_i915_private *i915, goto out_unlock; } - wakeref = intel_runtime_pm_get(i915); + i915_gem_unpark(i915); /* First set the default mask. */ ret = __sseu_test(i915, name, flags, ctx, engine, obj, default_sseu); @@ -1128,7 +1126,7 @@ __igt_ctx_sseu(struct drm_i915_private *i915, i915_gem_object_put(obj); - intel_runtime_pm_put(i915, wakeref); + i915_gem_park(i915); out_unlock: mutex_unlock(&i915->drm.struct_mutex); @@ -1191,6 +1189,7 @@ static int igt_ctx_readonly(void *arg) if (IS_ERR(file)) return PTR_ERR(file); + i915_gem_unpark(i915); mutex_lock(&i915->drm.struct_mutex); err = igt_live_test_begin(&t, i915, __func__, ""); @@ -1216,8 +1215,6 @@ static int igt_ctx_readonly(void *arg) unsigned int id; for_each_engine(engine, i915, id) { - intel_wakeref_t wakeref; - if (!intel_engine_can_store_dword(engine)) continue; @@ -1232,9 +1229,7 @@ static int igt_ctx_readonly(void *arg) i915_gem_object_set_readonly(obj); } - err = 0; - with_intel_runtime_pm(i915, wakeref) - err = gpu_fill(obj, ctx, engine, dw); + err = gpu_fill(obj, ctx, engine, dw); if (err) { pr_err("Failed to fill dword %lu [%lu/%lu] with gpu (%s) in ctx %u [full-ppgtt? %s], err=%d\n", ndwords, dw, max_dwords(obj), @@ -1275,6 +1270,7 @@ static int igt_ctx_readonly(void *arg) if (igt_live_test_end(&t)) err = -EIO; mutex_unlock(&i915->drm.struct_mutex); + i915_gem_park(i915); mock_file_free(i915, file); return err; @@ -1491,7 +1487,6 @@ static int igt_vm_isolation(void *arg) struct drm_i915_private *i915 = arg; struct i915_gem_context *ctx_a, *ctx_b; struct intel_engine_cs *engine; - intel_wakeref_t wakeref; struct igt_live_test t; struct drm_file *file; I915_RND_STATE(prng); @@ -1538,7 +1533,7 @@ static int igt_vm_isolation(void *arg) GEM_BUG_ON(ctx_b->ppgtt->vm.total != vm_total); vm_total -= I915_GTT_PAGE_SIZE; - wakeref = intel_runtime_pm_get(i915); + i915_gem_unpark(i915); count = 0; for_each_engine(engine, i915, id) { @@ -1583,7 +1578,7 @@ static int igt_vm_isolation(void *arg) count, RUNTIME_INFO(i915)->num_engines); out_rpm: - intel_runtime_pm_put(i915, wakeref); + i915_gem_park(i915); out_unlock: if (igt_live_test_end(&t)) err = -EIO; @@ -1622,6 +1617,7 @@ static int __igt_switch_to_kernel_context(struct drm_i915_private *i915, int err; if (!from_idle) { + i915_gem_unpark(i915); for_each_engine_masked(engine, i915, engines, tmp) { struct i915_request *rq; @@ -1631,6 +1627,7 @@ static int __igt_switch_to_kernel_context(struct drm_i915_private *i915, i915_request_add(rq); } + i915_gem_park(i915); } err = i915_gem_switch_to_kernel_context(i915, @@ -1674,7 +1671,6 @@ static int igt_switch_to_kernel_context(void *arg) struct intel_engine_cs *engine; struct i915_gem_context *ctx; enum intel_engine_id id; - intel_wakeref_t wakeref; int err; /* @@ -1685,7 +1681,6 @@ static int igt_switch_to_kernel_context(void *arg) */ mutex_lock(&i915->drm.struct_mutex); - wakeref = intel_runtime_pm_get(i915); ctx = kernel_context(i915); if (IS_ERR(ctx)) { @@ -1708,7 +1703,6 @@ static int igt_switch_to_kernel_context(void *arg) out_unlock: GEM_TRACE_DUMP_ON(err); - intel_runtime_pm_put(i915, wakeref); mutex_unlock(&i915->drm.struct_mutex); kernel_context_close(ctx); @@ -1729,7 +1723,6 @@ static int mock_context_barrier(void *arg) struct drm_i915_private *i915 = arg; struct i915_gem_context *ctx; struct i915_request *rq; - intel_wakeref_t wakeref; unsigned int counter; int err; @@ -1738,6 +1731,7 @@ static int mock_context_barrier(void *arg) * a request; useful for retiring old state after loading new. */ + i915_gem_unpark(i915); mutex_lock(&i915->drm.struct_mutex); ctx = mock_context(i915, "mock"); @@ -1772,9 +1766,7 @@ static int mock_context_barrier(void *arg) goto out; } - rq = ERR_PTR(-ENODEV); - with_intel_runtime_pm(i915, wakeref) - rq = i915_request_alloc(i915->engine[RCS0], ctx); + rq = i915_request_alloc(i915->engine[RCS0], ctx); if (IS_ERR(rq)) { pr_err("Request allocation failed!\n"); goto out; @@ -1816,6 +1808,7 @@ static int mock_context_barrier(void *arg) mock_context_close(ctx); unlock: mutex_unlock(&i915->drm.struct_mutex); + i915_gem_park(i915); return err; #undef pr_fmt #define pr_fmt(x) x diff --git a/drivers/gpu/drm/i915/selftests/i915_gem_evict.c b/drivers/gpu/drm/i915/selftests/i915_gem_evict.c index 9a9451846b33..c0cf26507915 100644 --- a/drivers/gpu/drm/i915/selftests/i915_gem_evict.c +++ b/drivers/gpu/drm/i915/selftests/i915_gem_evict.c @@ -23,6 +23,7 @@ */ #include "../i915_selftest.h" +#include "../i915_gem_pm.h" #include "lib_sw_fence.h" #include "mock_context.h" @@ -377,7 +378,6 @@ static int igt_evict_contexts(void *arg) struct drm_mm_node node; struct reserved *next; } *reserved = NULL; - intel_wakeref_t wakeref; struct drm_mm_node hole; unsigned long count; int err; @@ -396,8 +396,8 @@ static int igt_evict_contexts(void *arg) if (!HAS_FULL_PPGTT(i915)) return 0; + i915_gem_unpark(i915); mutex_lock(&i915->drm.struct_mutex); - wakeref = intel_runtime_pm_get(i915); /* Reserve a block so that we know we have enough to fit a few rq */ memset(&hole, 0, sizeof(hole)); @@ -508,8 +508,8 @@ static int igt_evict_contexts(void *arg) } if (drm_mm_node_allocated(&hole)) drm_mm_remove_node(&hole); - intel_runtime_pm_put(i915, wakeref); mutex_unlock(&i915->drm.struct_mutex); + i915_gem_park(i915); return err; } diff --git a/drivers/gpu/drm/i915/selftests/i915_gem_object.c b/drivers/gpu/drm/i915/selftests/i915_gem_object.c index c2b08fdf23cf..cd6590e01dec 100644 --- a/drivers/gpu/drm/i915/selftests/i915_gem_object.c +++ b/drivers/gpu/drm/i915/selftests/i915_gem_object.c @@ -576,8 +576,6 @@ static int igt_mmap_offset_exhaustion(void *arg) /* Now fill with busy dead objects that we expect to reap */ for (loop = 0; loop < 3; loop++) { - intel_wakeref_t wakeref; - if (i915_terminally_wedged(i915)) break; @@ -587,11 +585,11 @@ static int igt_mmap_offset_exhaustion(void *arg) goto out; } - err = 0; + i915_gem_unpark(i915); mutex_lock(&i915->drm.struct_mutex); - with_intel_runtime_pm(i915, wakeref) - err = make_obj_busy(obj); + err = make_obj_busy(obj); mutex_unlock(&i915->drm.struct_mutex); + i915_gem_park(i915); if (err) { pr_err("[loop %d] Failed to busy the object\n", loop); goto err_obj; diff --git a/drivers/gpu/drm/i915/selftests/i915_request.c b/drivers/gpu/drm/i915/selftests/i915_request.c index e6ffe2240126..665cafa82390 100644 --- a/drivers/gpu/drm/i915/selftests/i915_request.c +++ b/drivers/gpu/drm/i915/selftests/i915_request.c @@ -505,15 +505,15 @@ int i915_request_mock_selftests(void) SUBTEST(mock_breadcrumbs_smoketest), }; struct drm_i915_private *i915; - intel_wakeref_t wakeref; - int err = 0; + int err; i915 = mock_gem_device(); if (!i915) return -ENOMEM; - with_intel_runtime_pm(i915, wakeref) - err = i915_subtests(tests, i915); + i915_gem_unpark(i915); + err = i915_subtests(tests, i915); + i915_gem_park(i915); drm_dev_put(&i915->drm); @@ -524,7 +524,6 @@ static int live_nop_request(void *arg) { struct drm_i915_private *i915 = arg; struct intel_engine_cs *engine; - intel_wakeref_t wakeref; struct igt_live_test t; unsigned int id; int err = -ENODEV; @@ -534,8 +533,8 @@ static int live_nop_request(void *arg) * the overhead of submitting requests to the hardware. */ + i915_gem_unpark(i915); mutex_lock(&i915->drm.struct_mutex); - wakeref = intel_runtime_pm_get(i915); for_each_engine(engine, i915, id) { struct i915_request *request = NULL; @@ -596,8 +595,8 @@ static int live_nop_request(void *arg) } out_unlock: - intel_runtime_pm_put(i915, wakeref); mutex_unlock(&i915->drm.struct_mutex); + i915_gem_park(i915); return err; } @@ -669,7 +668,6 @@ static int live_empty_request(void *arg) { struct drm_i915_private *i915 = arg; struct intel_engine_cs *engine; - intel_wakeref_t wakeref; struct igt_live_test t; struct i915_vma *batch; unsigned int id; @@ -680,8 +678,8 @@ static int live_empty_request(void *arg) * the overhead of submitting requests to the hardware. */ + i915_gem_unpark(i915); mutex_lock(&i915->drm.struct_mutex); - wakeref = intel_runtime_pm_get(i915); batch = empty_batch(i915); if (IS_ERR(batch)) { @@ -745,8 +743,8 @@ static int live_empty_request(void *arg) i915_vma_unpin(batch); i915_vma_put(batch); out_unlock: - intel_runtime_pm_put(i915, wakeref); mutex_unlock(&i915->drm.struct_mutex); + i915_gem_park(i915); return err; } @@ -827,7 +825,6 @@ static int live_all_engines(void *arg) struct drm_i915_private *i915 = arg; struct intel_engine_cs *engine; struct i915_request *request[I915_NUM_ENGINES]; - intel_wakeref_t wakeref; struct igt_live_test t; struct i915_vma *batch; unsigned int id; @@ -838,8 +835,8 @@ static int live_all_engines(void *arg) * block doing so, and that they don't complete too soon. */ + i915_gem_unpark(i915); mutex_lock(&i915->drm.struct_mutex); - wakeref = intel_runtime_pm_get(i915); err = igt_live_test_begin(&t, i915, __func__, ""); if (err) @@ -922,8 +919,8 @@ static int live_all_engines(void *arg) i915_vma_unpin(batch); i915_vma_put(batch); out_unlock: - intel_runtime_pm_put(i915, wakeref); mutex_unlock(&i915->drm.struct_mutex); + i915_gem_park(i915); return err; } @@ -933,7 +930,6 @@ static int live_sequential_engines(void *arg) struct i915_request *request[I915_NUM_ENGINES] = {}; struct i915_request *prev = NULL; struct intel_engine_cs *engine; - intel_wakeref_t wakeref; struct igt_live_test t; unsigned int id; int err; @@ -944,8 +940,8 @@ static int live_sequential_engines(void *arg) * they are running on independent engines. */ + i915_gem_unpark(i915); mutex_lock(&i915->drm.struct_mutex); - wakeref = intel_runtime_pm_get(i915); err = igt_live_test_begin(&t, i915, __func__, ""); if (err) @@ -1052,8 +1048,8 @@ static int live_sequential_engines(void *arg) i915_request_put(request[id]); } out_unlock: - intel_runtime_pm_put(i915, wakeref); mutex_unlock(&i915->drm.struct_mutex); + i915_gem_park(i915); return err; } @@ -1104,7 +1100,6 @@ static int live_breadcrumbs_smoketest(void *arg) struct task_struct **threads; struct igt_live_test live; enum intel_engine_id id; - intel_wakeref_t wakeref; struct drm_file *file; unsigned int n; int ret = 0; @@ -1117,7 +1112,7 @@ static int live_breadcrumbs_smoketest(void *arg) * On real hardware this time. */ - wakeref = intel_runtime_pm_get(i915); + i915_gem_unpark(i915); file = mock_file(i915); if (IS_ERR(file)) { @@ -1224,7 +1219,7 @@ static int live_breadcrumbs_smoketest(void *arg) out_file: mock_file_free(i915, file); out_rpm: - intel_runtime_pm_put(i915, wakeref); + i915_gem_park(i915); return ret; } diff --git a/drivers/gpu/drm/i915/selftests/i915_timeline.c b/drivers/gpu/drm/i915/selftests/i915_timeline.c index 8e7bcaa1eb66..b04969ea74d3 100644 --- a/drivers/gpu/drm/i915/selftests/i915_timeline.c +++ b/drivers/gpu/drm/i915/selftests/i915_timeline.c @@ -7,6 +7,7 @@ #include <linux/prime_numbers.h> #include "../i915_selftest.h" +#include "../i915_gem_pm.h" #include "i915_random.h" #include "igt_flush_test.h" @@ -497,7 +498,6 @@ static int live_hwsp_engine(void *arg) struct i915_timeline **timelines; struct intel_engine_cs *engine; enum intel_engine_id id; - intel_wakeref_t wakeref; unsigned long count, n; int err = 0; @@ -512,8 +512,8 @@ static int live_hwsp_engine(void *arg) if (!timelines) return -ENOMEM; + i915_gem_unpark(i915); mutex_lock(&i915->drm.struct_mutex); - wakeref = intel_runtime_pm_get(i915); count = 0; for_each_engine(engine, i915, id) { @@ -556,8 +556,8 @@ static int live_hwsp_engine(void *arg) i915_timeline_put(tl); } - intel_runtime_pm_put(i915, wakeref); mutex_unlock(&i915->drm.struct_mutex); + i915_gem_park(i915); kvfree(timelines); @@ -572,7 +572,6 @@ static int live_hwsp_alternate(void *arg) struct i915_timeline **timelines; struct intel_engine_cs *engine; enum intel_engine_id id; - intel_wakeref_t wakeref; unsigned long count, n; int err = 0; @@ -588,8 +587,8 @@ static int live_hwsp_alternate(void *arg) if (!timelines) return -ENOMEM; + i915_gem_unpark(i915); mutex_lock(&i915->drm.struct_mutex); - wakeref = intel_runtime_pm_get(i915); count = 0; for (n = 0; n < NUM_TIMELINES; n++) { @@ -632,8 +631,8 @@ static int live_hwsp_alternate(void *arg) i915_timeline_put(tl); } - intel_runtime_pm_put(i915, wakeref); mutex_unlock(&i915->drm.struct_mutex); + i915_gem_park(i915); kvfree(timelines); @@ -647,7 +646,6 @@ static int live_hwsp_wrap(void *arg) struct intel_engine_cs *engine; struct i915_timeline *tl; enum intel_engine_id id; - intel_wakeref_t wakeref; int err = 0; /* @@ -655,8 +653,8 @@ static int live_hwsp_wrap(void *arg) * foreign GPU references. */ + i915_gem_unpark(i915); mutex_lock(&i915->drm.struct_mutex); - wakeref = intel_runtime_pm_get(i915); tl = i915_timeline_create(i915, NULL); if (IS_ERR(tl)) { @@ -747,8 +745,8 @@ static int live_hwsp_wrap(void *arg) out_free: i915_timeline_put(tl); out_rpm: - intel_runtime_pm_put(i915, wakeref); mutex_unlock(&i915->drm.struct_mutex); + i915_gem_park(i915); return err; } @@ -758,7 +756,6 @@ static int live_hwsp_recycle(void *arg) struct drm_i915_private *i915 = arg; struct intel_engine_cs *engine; enum intel_engine_id id; - intel_wakeref_t wakeref; unsigned long count; int err = 0; @@ -768,8 +765,8 @@ static int live_hwsp_recycle(void *arg) * want to confuse ourselves or the GPU. */ + i915_gem_unpark(i915); mutex_lock(&i915->drm.struct_mutex); - wakeref = intel_runtime_pm_get(i915); count = 0; for_each_engine(engine, i915, id) { @@ -823,8 +820,8 @@ static int live_hwsp_recycle(void *arg) out: if (igt_flush_test(i915, I915_WAIT_LOCKED)) err = -EIO; - intel_runtime_pm_put(i915, wakeref); mutex_unlock(&i915->drm.struct_mutex); + i915_gem_park(i915); return err; } diff --git a/drivers/gpu/drm/i915/selftests/intel_guc.c b/drivers/gpu/drm/i915/selftests/intel_guc.c index b05a21eaa8f4..e62073af4728 100644 --- a/drivers/gpu/drm/i915/selftests/intel_guc.c +++ b/drivers/gpu/drm/i915/selftests/intel_guc.c @@ -22,6 +22,7 @@ * */ +#include "../i915_gem_pm.h" #include "../i915_selftest.h" /* max doorbell number + negative test for each client type */ @@ -137,13 +138,11 @@ static bool client_doorbell_in_sync(struct intel_guc_client *client) static int igt_guc_clients(void *args) { struct drm_i915_private *dev_priv = args; - intel_wakeref_t wakeref; struct intel_guc *guc; int err = 0; GEM_BUG_ON(!HAS_GUC(dev_priv)); mutex_lock(&dev_priv->drm.struct_mutex); - wakeref = intel_runtime_pm_get(dev_priv); guc = &dev_priv->guc; if (!guc) { @@ -226,7 +225,6 @@ static int igt_guc_clients(void *args) guc_clients_create(guc); guc_clients_enable(guc); unlock: - intel_runtime_pm_put(dev_priv, wakeref); mutex_unlock(&dev_priv->drm.struct_mutex); return err; } @@ -239,14 +237,13 @@ static int igt_guc_clients(void *args) static int igt_guc_doorbells(void *arg) { struct drm_i915_private *dev_priv = arg; - intel_wakeref_t wakeref; struct intel_guc *guc; int i, err = 0; u16 db_id; GEM_BUG_ON(!HAS_GUC(dev_priv)); + i915_gem_unpark(dev_priv); mutex_lock(&dev_priv->drm.struct_mutex); - wakeref = intel_runtime_pm_get(dev_priv); guc = &dev_priv->guc; if (!guc) { @@ -339,8 +336,8 @@ static int igt_guc_doorbells(void *arg) guc_client_free(clients[i]); } unlock: - intel_runtime_pm_put(dev_priv, wakeref); mutex_unlock(&dev_priv->drm.struct_mutex); + i915_gem_park(dev_priv); return err; } diff --git a/drivers/gpu/drm/i915/selftests/intel_hangcheck.c b/drivers/gpu/drm/i915/selftests/intel_hangcheck.c index 76b4fa150f2e..f6f417386b9f 100644 --- a/drivers/gpu/drm/i915/selftests/intel_hangcheck.c +++ b/drivers/gpu/drm/i915/selftests/intel_hangcheck.c @@ -24,6 +24,7 @@ #include <linux/kthread.h> +#include "../i915_gem_pm.h" #include "../i915_selftest.h" #include "i915_random.h" #include "igt_flush_test.h" @@ -86,6 +87,7 @@ static int hang_init(struct hang *h, struct drm_i915_private *i915) } h->batch = vaddr; + i915_gem_unpark(i915); return 0; err_unpin_hws: @@ -287,6 +289,7 @@ static void hang_fini(struct hang *h) kernel_context_close(h->ctx); igt_flush_test(h->i915, I915_WAIT_LOCKED); + i915_gem_park(h->i915); } static bool wait_until_running(struct hang *h, struct i915_request *rq) @@ -422,7 +425,6 @@ static int igt_reset_nop(void *arg) struct i915_gem_context *ctx; unsigned int reset_count, count; enum intel_engine_id id; - intel_wakeref_t wakeref; struct drm_file *file; IGT_TIMEOUT(end_time); int err = 0; @@ -442,7 +444,7 @@ static int igt_reset_nop(void *arg) } i915_gem_context_clear_bannable(ctx); - wakeref = intel_runtime_pm_get(i915); + i915_gem_unpark(i915); reset_count = i915_reset_count(&i915->gpu_error); count = 0; do { @@ -502,7 +504,7 @@ static int igt_reset_nop(void *arg) err = igt_flush_test(i915, I915_WAIT_LOCKED); mutex_unlock(&i915->drm.struct_mutex); - intel_runtime_pm_put(i915, wakeref); + i915_gem_park(i915); out: mock_file_free(i915, file); @@ -517,7 +519,6 @@ static int igt_reset_nop_engine(void *arg) struct intel_engine_cs *engine; struct i915_gem_context *ctx; enum intel_engine_id id; - intel_wakeref_t wakeref; struct drm_file *file; int err = 0; @@ -539,7 +540,7 @@ static int igt_reset_nop_engine(void *arg) } i915_gem_context_clear_bannable(ctx); - wakeref = intel_runtime_pm_get(i915); + i915_gem_unpark(i915); for_each_engine(engine, i915, id) { unsigned int reset_count, reset_engine_count; unsigned int count; @@ -623,7 +624,7 @@ static int igt_reset_nop_engine(void *arg) err = igt_flush_test(i915, I915_WAIT_LOCKED); mutex_unlock(&i915->drm.struct_mutex); - intel_runtime_pm_put(i915, wakeref); + i915_gem_park(i915); out: mock_file_free(i915, file); if (i915_reset_failed(i915)) @@ -651,6 +652,7 @@ static int __igt_reset_engine(struct drm_i915_private *i915, bool active) return err; } + i915_gem_unpark(i915); for_each_engine(engine, i915, id) { unsigned int reset_count, reset_engine_count; IGT_TIMEOUT(end_time); @@ -744,6 +746,7 @@ static int __igt_reset_engine(struct drm_i915_private *i915, bool active) if (err) break; } + i915_gem_park(i915); if (i915_reset_failed(i915)) err = -EIO; @@ -829,6 +832,7 @@ static int active_engine(void *data) } } + i915_gem_unpark(engine->i915); while (!kthread_should_stop()) { unsigned int idx = count++ & (ARRAY_SIZE(rq) - 1); struct i915_request *old = rq[idx]; @@ -856,6 +860,7 @@ static int active_engine(void *data) cond_resched(); } + i915_gem_park(engine->i915); for (count = 0; count < ARRAY_SIZE(rq); count++) { int err__ = active_request_put(rq[count]); @@ -897,6 +902,7 @@ static int __igt_reset_engines(struct drm_i915_private *i915, h.ctx->sched.priority = 1024; } + i915_gem_unpark(i915); for_each_engine(engine, i915, id) { struct active_engine threads[I915_NUM_ENGINES] = {}; unsigned long global = i915_reset_count(&i915->gpu_error); @@ -1073,6 +1079,7 @@ static int __igt_reset_engines(struct drm_i915_private *i915, if (err) break; } + i915_gem_park(i915); if (i915_reset_failed(i915)) err = -EIO; diff --git a/drivers/gpu/drm/i915/selftests/intel_lrc.c b/drivers/gpu/drm/i915/selftests/intel_lrc.c index 0d3cae564db8..45370922d965 100644 --- a/drivers/gpu/drm/i915/selftests/intel_lrc.c +++ b/drivers/gpu/drm/i915/selftests/intel_lrc.c @@ -6,6 +6,7 @@ #include <linux/prime_numbers.h> +#include "../i915_gem_pm.h" #include "../i915_reset.h" #include "../i915_selftest.h" @@ -23,14 +24,13 @@ static int live_sanitycheck(void *arg) struct i915_gem_context *ctx; enum intel_engine_id id; struct igt_spinner spin; - intel_wakeref_t wakeref; int err = -ENOMEM; if (!HAS_LOGICAL_RING_CONTEXTS(i915)) return 0; + i915_gem_unpark(i915); mutex_lock(&i915->drm.struct_mutex); - wakeref = intel_runtime_pm_get(i915); if (igt_spinner_init(&spin, i915)) goto err_unlock; @@ -71,8 +71,8 @@ static int live_sanitycheck(void *arg) igt_spinner_fini(&spin); err_unlock: igt_flush_test(i915, I915_WAIT_LOCKED); - intel_runtime_pm_put(i915, wakeref); mutex_unlock(&i915->drm.struct_mutex); + i915_gem_park(i915); return err; } @@ -83,7 +83,6 @@ static int live_preempt(void *arg) struct igt_spinner spin_hi, spin_lo; struct intel_engine_cs *engine; enum intel_engine_id id; - intel_wakeref_t wakeref; int err = -ENOMEM; if (!HAS_LOGICAL_RING_PREEMPTION(i915)) @@ -92,8 +91,8 @@ static int live_preempt(void *arg) if (!(i915->caps.scheduler & I915_SCHEDULER_CAP_PREEMPTION)) pr_err("Logical preemption supported, but not exposed\n"); + i915_gem_unpark(i915); mutex_lock(&i915->drm.struct_mutex); - wakeref = intel_runtime_pm_get(i915); if (igt_spinner_init(&spin_hi, i915)) goto err_unlock; @@ -178,8 +177,8 @@ static int live_preempt(void *arg) igt_spinner_fini(&spin_hi); err_unlock: igt_flush_test(i915, I915_WAIT_LOCKED); - intel_runtime_pm_put(i915, wakeref); mutex_unlock(&i915->drm.struct_mutex); + i915_gem_park(i915); return err; } @@ -191,14 +190,13 @@ static int live_late_preempt(void *arg) struct intel_engine_cs *engine; struct i915_sched_attr attr = {}; enum intel_engine_id id; - intel_wakeref_t wakeref; int err = -ENOMEM; if (!HAS_LOGICAL_RING_PREEMPTION(i915)) return 0; + i915_gem_unpark(i915); mutex_lock(&i915->drm.struct_mutex); - wakeref = intel_runtime_pm_get(i915); if (igt_spinner_init(&spin_hi, i915)) goto err_unlock; @@ -282,8 +280,8 @@ static int live_late_preempt(void *arg) igt_spinner_fini(&spin_hi); err_unlock: igt_flush_test(i915, I915_WAIT_LOCKED); - intel_runtime_pm_put(i915, wakeref); mutex_unlock(&i915->drm.struct_mutex); + i915_gem_park(i915); return err; err_wedged: @@ -331,7 +329,6 @@ static int live_suppress_self_preempt(void *arg) }; struct preempt_client a, b; enum intel_engine_id id; - intel_wakeref_t wakeref; int err = -ENOMEM; /* @@ -347,8 +344,8 @@ static int live_suppress_self_preempt(void *arg) if (USES_GUC_SUBMISSION(i915)) return 0; /* presume black blox */ + i915_gem_unpark(i915); mutex_lock(&i915->drm.struct_mutex); - wakeref = intel_runtime_pm_get(i915); if (preempt_client_init(i915, &a)) goto err_unlock; @@ -422,8 +419,8 @@ static int live_suppress_self_preempt(void *arg) err_unlock: if (igt_flush_test(i915, I915_WAIT_LOCKED)) err = -EIO; - intel_runtime_pm_put(i915, wakeref); mutex_unlock(&i915->drm.struct_mutex); + i915_gem_park(i915); return err; err_wedged: @@ -480,7 +477,6 @@ static int live_suppress_wait_preempt(void *arg) struct preempt_client client[4]; struct intel_engine_cs *engine; enum intel_engine_id id; - intel_wakeref_t wakeref; int err = -ENOMEM; int i; @@ -493,8 +489,8 @@ static int live_suppress_wait_preempt(void *arg) if (!HAS_LOGICAL_RING_PREEMPTION(i915)) return 0; + i915_gem_unpark(i915); mutex_lock(&i915->drm.struct_mutex); - wakeref = intel_runtime_pm_get(i915); if (preempt_client_init(i915, &client[0])) /* ELSP[0] */ goto err_unlock; @@ -587,8 +583,8 @@ static int live_suppress_wait_preempt(void *arg) err_unlock: if (igt_flush_test(i915, I915_WAIT_LOCKED)) err = -EIO; - intel_runtime_pm_put(i915, wakeref); mutex_unlock(&i915->drm.struct_mutex); + i915_gem_park(i915); return err; err_wedged: @@ -605,7 +601,6 @@ static int live_chain_preempt(void *arg) struct intel_engine_cs *engine; struct preempt_client hi, lo; enum intel_engine_id id; - intel_wakeref_t wakeref; int err = -ENOMEM; /* @@ -617,8 +612,8 @@ static int live_chain_preempt(void *arg) if (!HAS_LOGICAL_RING_PREEMPTION(i915)) return 0; + i915_gem_unpark(i915); mutex_lock(&i915->drm.struct_mutex); - wakeref = intel_runtime_pm_get(i915); if (preempt_client_init(i915, &hi)) goto err_unlock; @@ -735,8 +730,8 @@ static int live_chain_preempt(void *arg) err_unlock: if (igt_flush_test(i915, I915_WAIT_LOCKED)) err = -EIO; - intel_runtime_pm_put(i915, wakeref); mutex_unlock(&i915->drm.struct_mutex); + i915_gem_park(i915); return err; err_wedged: @@ -754,7 +749,6 @@ static int live_preempt_hang(void *arg) struct igt_spinner spin_hi, spin_lo; struct intel_engine_cs *engine; enum intel_engine_id id; - intel_wakeref_t wakeref; int err = -ENOMEM; if (!HAS_LOGICAL_RING_PREEMPTION(i915)) @@ -763,8 +757,8 @@ static int live_preempt_hang(void *arg) if (!intel_has_reset_engine(i915)) return 0; + i915_gem_unpark(i915); mutex_lock(&i915->drm.struct_mutex); - wakeref = intel_runtime_pm_get(i915); if (igt_spinner_init(&spin_hi, i915)) goto err_unlock; @@ -859,8 +853,8 @@ static int live_preempt_hang(void *arg) igt_spinner_fini(&spin_hi); err_unlock: igt_flush_test(i915, I915_WAIT_LOCKED); - intel_runtime_pm_put(i915, wakeref); mutex_unlock(&i915->drm.struct_mutex); + i915_gem_park(i915); return err; } @@ -1047,7 +1041,6 @@ static int live_preempt_smoke(void *arg) .ncontext = 1024, }; const unsigned int phase[] = { 0, BATCH }; - intel_wakeref_t wakeref; struct igt_live_test t; int err = -ENOMEM; u32 *cs; @@ -1062,8 +1055,8 @@ static int live_preempt_smoke(void *arg) if (!smoke.contexts) return -ENOMEM; + i915_gem_unpark(smoke.i915); mutex_lock(&smoke.i915->drm.struct_mutex); - wakeref = intel_runtime_pm_get(smoke.i915); smoke.batch = i915_gem_object_create_internal(smoke.i915, PAGE_SIZE); if (IS_ERR(smoke.batch)) { @@ -1116,8 +1109,8 @@ static int live_preempt_smoke(void *arg) err_batch: i915_gem_object_put(smoke.batch); err_unlock: - intel_runtime_pm_put(smoke.i915, wakeref); mutex_unlock(&smoke.i915->drm.struct_mutex); + i915_gem_park(smoke.i915); kfree(smoke.contexts); return err; diff --git a/drivers/gpu/drm/i915/selftests/intel_workarounds.c b/drivers/gpu/drm/i915/selftests/intel_workarounds.c index 3baed59008d7..0e42e1a0b46c 100644 --- a/drivers/gpu/drm/i915/selftests/intel_workarounds.c +++ b/drivers/gpu/drm/i915/selftests/intel_workarounds.c @@ -5,6 +5,7 @@ */ #include "../i915_selftest.h" +#include "../i915_gem_pm.h" #include "../i915_reset.h" #include "igt_flush_test.h" @@ -238,7 +239,6 @@ switch_to_scratch_context(struct intel_engine_cs *engine, { struct i915_gem_context *ctx; struct i915_request *rq; - intel_wakeref_t wakeref; int err = 0; ctx = kernel_context(engine->i915); @@ -247,9 +247,9 @@ switch_to_scratch_context(struct intel_engine_cs *engine, GEM_BUG_ON(i915_gem_context_is_bannable(ctx)); - rq = ERR_PTR(-ENODEV); - with_intel_runtime_pm(engine->i915, wakeref) - rq = igt_spinner_create_request(spin, ctx, engine, MI_NOOP); + i915_gem_unpark(engine->i915); + rq = igt_spinner_create_request(spin, ctx, engine, MI_NOOP); + i915_gem_park(engine->i915); kernel_context_close(ctx); @@ -666,7 +666,6 @@ static int live_dirty_whitelist(void *arg) struct intel_engine_cs *engine; struct i915_gem_context *ctx; enum intel_engine_id id; - intel_wakeref_t wakeref; struct drm_file *file; int err = 0; @@ -675,7 +674,7 @@ static int live_dirty_whitelist(void *arg) if (INTEL_GEN(i915) < 7) /* minimum requirement for LRI, SRM, LRM */ return 0; - wakeref = intel_runtime_pm_get(i915); + i915_gem_unpark(i915); mutex_unlock(&i915->drm.struct_mutex); file = mock_file(i915); @@ -705,7 +704,7 @@ static int live_dirty_whitelist(void *arg) mock_file_free(i915, file); mutex_lock(&i915->drm.struct_mutex); out_rpm: - intel_runtime_pm_put(i915, wakeref); + i915_gem_park(i915); return err; } @@ -762,7 +761,6 @@ static int live_gpu_reset_gt_engine_workarounds(void *arg) { struct drm_i915_private *i915 = arg; - intel_wakeref_t wakeref; struct wa_lists lists; bool ok; @@ -771,8 +769,8 @@ live_gpu_reset_gt_engine_workarounds(void *arg) pr_info("Verifying after GPU reset...\n"); + i915_gem_unpark(i915); igt_global_reset_lock(i915); - wakeref = intel_runtime_pm_get(i915); reference_lists_init(i915, &lists); @@ -786,8 +784,8 @@ live_gpu_reset_gt_engine_workarounds(void *arg) out: reference_lists_fini(i915, &lists); - intel_runtime_pm_put(i915, wakeref); igt_global_reset_unlock(i915); + i915_gem_park(i915); return ok ? 0 : -ESRCH; } @@ -801,7 +799,6 @@ live_engine_reset_gt_engine_workarounds(void *arg) struct igt_spinner spin; enum intel_engine_id id; struct i915_request *rq; - intel_wakeref_t wakeref; struct wa_lists lists; int ret = 0; @@ -812,8 +809,8 @@ live_engine_reset_gt_engine_workarounds(void *arg) if (IS_ERR(ctx)) return PTR_ERR(ctx); + i915_gem_unpark(i915); igt_global_reset_lock(i915); - wakeref = intel_runtime_pm_get(i915); reference_lists_init(i915, &lists); @@ -870,8 +867,8 @@ live_engine_reset_gt_engine_workarounds(void *arg) err: reference_lists_fini(i915, &lists); - intel_runtime_pm_put(i915, wakeref); igt_global_reset_unlock(i915); + i915_gem_park(i915); kernel_context_close(ctx); igt_flush_test(i915, I915_WAIT_LOCKED); -- 2.20.1 _______________________________________________ Intel-gfx mailing list Intel-gfx@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/intel-gfx