Chris Wilson <ch...@chris-wilson.co.uk> writes:

> Track the temporary wakerefs used within the selftests so that leaks are
> clear.
>
> Signed-off-by: Chris Wilson <ch...@chris-wilson.co.uk>
> Cc: Jani Nikula <jani.nik...@intel.com>
> ---
>  drivers/gpu/drm/i915/selftests/huge_pages.c   |  5 ++--
>  drivers/gpu/drm/i915/selftests/i915_gem.c     | 29 ++++++++++++-------
>  .../drm/i915/selftests/i915_gem_coherency.c   |  5 ++--
>  .../gpu/drm/i915/selftests/i915_gem_context.c | 27 ++++++++++-------
>  .../gpu/drm/i915/selftests/i915_gem_evict.c   | 11 ++++---
>  drivers/gpu/drm/i915/selftests/i915_gem_gtt.c | 10 ++++---
>  .../gpu/drm/i915/selftests/i915_gem_object.c  | 18 ++++++++----
>  drivers/gpu/drm/i915/selftests/i915_request.c | 22 ++++++++------
>  drivers/gpu/drm/i915/selftests/intel_guc.c    | 10 ++++---
>  .../gpu/drm/i915/selftests/intel_hangcheck.c  | 15 ++++++----
>  drivers/gpu/drm/i915/selftests/intel_lrc.c    | 25 +++++++++-------
>  .../drm/i915/selftests/intel_workarounds.c    | 27 ++++++++++-------
>  12 files changed, 126 insertions(+), 78 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/selftests/huge_pages.c 
> b/drivers/gpu/drm/i915/selftests/huge_pages.c
> index 731dfd3d3fc8..c7a4599173bb 100644
> --- a/drivers/gpu/drm/i915/selftests/huge_pages.c
> +++ b/drivers/gpu/drm/i915/selftests/huge_pages.c
> @@ -1760,6 +1760,7 @@ 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)) {
> @@ -1775,7 +1776,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);
> -     intel_runtime_pm_get(dev_priv);
> +     wakeref = intel_runtime_pm_get(dev_priv);
>  
>       ctx = live_context(dev_priv, file);
>       if (IS_ERR(ctx)) {
> @@ -1789,7 +1790,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_unchecked(dev_priv);
> +     intel_runtime_pm_put(dev_priv, wakeref);
>       mutex_unlock(&dev_priv->drm.struct_mutex);
>  
>       mock_file_free(dev_priv, file);
> diff --git a/drivers/gpu/drm/i915/selftests/i915_gem.c 
> b/drivers/gpu/drm/i915/selftests/i915_gem.c
> index 762e1a7125f5..01a46c46fe25 100644
> --- a/drivers/gpu/drm/i915/selftests/i915_gem.c
> +++ b/drivers/gpu/drm/i915/selftests/i915_gem.c
> @@ -16,9 +16,10 @@ 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;
>  
> -     intel_runtime_pm_get(i915);
> +     wakeref = intel_runtime_pm_get(i915);
>  
>       for_each_engine(engine, i915, id) {
>               struct i915_request *rq;
> @@ -32,7 +33,7 @@ static int switch_to_context(struct drm_i915_private *i915,
>               i915_request_add(rq);
>       }
>  
> -     intel_runtime_pm_put_unchecked(i915);
> +     intel_runtime_pm_put(i915, wakeref);
>  
>       return err;
>  }
> @@ -65,7 +66,9 @@ static void trash_stolen(struct drm_i915_private *i915)
>  
>  static void simulate_hibernate(struct drm_i915_private *i915)
>  {
> -     intel_runtime_pm_get(i915);
> +     intel_wakeref_t wakeref;
> +
> +     wakeref = intel_runtime_pm_get(i915);
>  
>       /*
>        * As a final sting in the tail, invalidate stolen. Under a real S4,
> @@ -76,7 +79,7 @@ static void simulate_hibernate(struct drm_i915_private 
> *i915)
>        */
>       trash_stolen(i915);
>  
> -     intel_runtime_pm_put_unchecked(i915);
> +     intel_runtime_pm_put(i915, wakeref);
>  }
>  
>  static int pm_prepare(struct drm_i915_private *i915)
> @@ -93,39 +96,45 @@ static int pm_prepare(struct drm_i915_private *i915)
>  
>  static void pm_suspend(struct drm_i915_private *i915)
>  {
> -     intel_runtime_pm_get(i915);
> +     intel_wakeref_t wakeref;
> +
> +     wakeref = intel_runtime_pm_get(i915);
>  
>       i915_gem_suspend_gtt_mappings(i915);
>       i915_gem_suspend_late(i915);
>  
> -     intel_runtime_pm_put_unchecked(i915);
> +     intel_runtime_pm_put(i915, wakeref);
>  }
>  
>  static void pm_hibernate(struct drm_i915_private *i915)
>  {
> -     intel_runtime_pm_get(i915);
> +     intel_wakeref_t wakeref;
> +
> +     wakeref = intel_runtime_pm_get(i915);
>  
>       i915_gem_suspend_gtt_mappings(i915);
>  
>       i915_gem_freeze(i915);
>       i915_gem_freeze_late(i915);
>  
> -     intel_runtime_pm_put_unchecked(i915);
> +     intel_runtime_pm_put(i915, wakeref);
>  }
>  
>  static void pm_resume(struct drm_i915_private *i915)
>  {
> +     intel_wakeref_t wakeref;
> +
>       /*
>        * Both suspend and hibernate follow the same wakeup path and assume
>        * that runtime-pm just works.
>        */
> -     intel_runtime_pm_get(i915);
> +     wakeref = intel_runtime_pm_get(i915);
>  
>       intel_engines_sanitize(i915, false);
>       i915_gem_sanitize(i915);
>       i915_gem_resume(i915);
>  
> -     intel_runtime_pm_put_unchecked(i915);
> +     intel_runtime_pm_put(i915, wakeref);
>  }
>  
>  static int igt_gem_suspend(void *arg)
> diff --git a/drivers/gpu/drm/i915/selftests/i915_gem_coherency.c 
> b/drivers/gpu/drm/i915/selftests/i915_gem_coherency.c
> index eea4fc2445ae..fd89a5a33c1a 100644
> --- a/drivers/gpu/drm/i915/selftests/i915_gem_coherency.c
> +++ b/drivers/gpu/drm/i915/selftests/i915_gem_coherency.c
> @@ -279,6 +279,7 @@ 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,7 +299,7 @@ static int igt_gem_coherency(void *arg)
>       values = offsets + ncachelines;
>  
>       mutex_lock(&i915->drm.struct_mutex);
> -     intel_runtime_pm_get(i915);
> +     wakeref = intel_runtime_pm_get(i915);
>       for (over = igt_coherency_mode; over->name; over++) {
>               if (!over->set)
>                       continue;
> @@ -376,7 +377,7 @@ static int igt_gem_coherency(void *arg)
>               }
>       }
>  unlock:
> -     intel_runtime_pm_put_unchecked(i915);
> +     intel_runtime_pm_put(i915, wakeref);
>       mutex_unlock(&i915->drm.struct_mutex);
>       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 6e1a0711d201..7a9b1f20b019 100644
> --- a/drivers/gpu/drm/i915/selftests/i915_gem_context.c
> +++ b/drivers/gpu/drm/i915/selftests/i915_gem_context.c
> @@ -119,6 +119,7 @@ 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 drm_file *file;
>       struct live_test t;
>       unsigned long n;
> @@ -140,7 +141,7 @@ static int live_nop_switch(void *arg)
>               return PTR_ERR(file);
>  
>       mutex_lock(&i915->drm.struct_mutex);
> -     intel_runtime_pm_get(i915);
> +     wakeref = intel_runtime_pm_get(i915);
>  
>       ctx = kcalloc(nctx, sizeof(*ctx), GFP_KERNEL);
>       if (!ctx) {
> @@ -243,7 +244,7 @@ static int live_nop_switch(void *arg)
>       }
>  
>  out_unlock:
> -     intel_runtime_pm_put_unchecked(i915);
> +     intel_runtime_pm_put(i915, wakeref);
>       mutex_unlock(&i915->drm.struct_mutex);
>       mock_file_free(i915, file);
>       return err;
> @@ -593,6 +594,8 @@ static int igt_ctx_exec(void *arg)
>               }
>  
>               for_each_engine(engine, i915, id) {
> +                     intel_wakeref_t wakeref;
> +
>                       if (!engine->context_size)
>                               continue; /* No logical context support in HW */
>  
> @@ -607,9 +610,9 @@ static int igt_ctx_exec(void *arg)
>                               }
>                       }
>  
> -                     intel_runtime_pm_get(i915);
> +                     wakeref = intel_runtime_pm_get(i915);
>                       err = gpu_fill(obj, ctx, engine, dw);
> -                     intel_runtime_pm_put_unchecked(i915);
> +                     intel_runtime_pm_put(i915, wakeref);
>                       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),
> @@ -699,6 +702,8 @@ 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;
>  
> @@ -713,9 +718,9 @@ static int igt_ctx_readonly(void *arg)
>                                       i915_gem_object_set_readonly(obj);
>                       }
>  
> -                     intel_runtime_pm_get(i915);
> +                     wakeref = intel_runtime_pm_get(i915);
>                       err = gpu_fill(obj, ctx, engine, dw);
> -                     intel_runtime_pm_put_unchecked(i915);
> +                     intel_runtime_pm_put(i915, wakeref);
>                       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),
> @@ -976,6 +981,7 @@ 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 drm_file *file;
>       I915_RND_STATE(prng);
>       unsigned long count;
> @@ -1022,7 +1028,7 @@ static int igt_vm_isolation(void *arg)
>       GEM_BUG_ON(ctx_b->ppgtt->vm.total != vm_total);
>       vm_total -= I915_GTT_PAGE_SIZE;
>  
> -     intel_runtime_pm_get(i915);
> +     wakeref = intel_runtime_pm_get(i915);
>  
>       count = 0;
>       for_each_engine(engine, i915, id) {
> @@ -1067,7 +1073,7 @@ static int igt_vm_isolation(void *arg)
>               count, RUNTIME_INFO(i915)->num_rings);
>  
>  out_rpm:
> -     intel_runtime_pm_put_unchecked(i915);
> +     intel_runtime_pm_put(i915, wakeref);
>  out_unlock:
>       if (end_live_test(&t))
>               err = -EIO;
> @@ -1165,6 +1171,7 @@ 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;
>  
>       /*
> @@ -1175,7 +1182,7 @@ static int igt_switch_to_kernel_context(void *arg)
>        */
>  
>       mutex_lock(&i915->drm.struct_mutex);
> -     intel_runtime_pm_get(i915);
> +     wakeref = intel_runtime_pm_get(i915);
>  
>       ctx = kernel_context(i915);
>       if (IS_ERR(ctx)) {
> @@ -1200,7 +1207,7 @@ static int igt_switch_to_kernel_context(void *arg)
>       if (igt_flush_test(i915, I915_WAIT_LOCKED))
>               err = -EIO;
>  
> -     intel_runtime_pm_put_unchecked(i915);
> +     intel_runtime_pm_put(i915, wakeref);
>       mutex_unlock(&i915->drm.struct_mutex);
>  
>       kernel_context_close(ctx);
> diff --git a/drivers/gpu/drm/i915/selftests/i915_gem_evict.c 
> b/drivers/gpu/drm/i915/selftests/i915_gem_evict.c
> index 8d22f73a9b63..e1ff6a1c2cb0 100644
> --- a/drivers/gpu/drm/i915/selftests/i915_gem_evict.c
> +++ b/drivers/gpu/drm/i915/selftests/i915_gem_evict.c
> @@ -336,6 +336,7 @@ 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;
> @@ -355,7 +356,7 @@ static int igt_evict_contexts(void *arg)
>               return 0;
>  
>       mutex_lock(&i915->drm.struct_mutex);
> -     intel_runtime_pm_get(i915);
> +     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));
> @@ -400,8 +401,10 @@ static int igt_evict_contexts(void *arg)
>               struct drm_file *file;
>  
>               file = mock_file(i915);
> -             if (IS_ERR(file))
> -                     return PTR_ERR(file);
> +             if (IS_ERR(file)) {
> +                     err = PTR_ERR(file);
> +                     break;
> +             }

Among the repetitions, this woke me up.
Looked like we break with mutex held but we don't.

And the drm mm node removal seems to cope
aswell.

Reviewed-by: Mika Kuoppala <mika.kuopp...@linux.intel.com>

>  
>               count = 0;
>               mutex_lock(&i915->drm.struct_mutex);
> @@ -464,7 +467,7 @@ static int igt_evict_contexts(void *arg)
>       }
>       if (drm_mm_node_allocated(&hole))
>               drm_mm_remove_node(&hole);
> -     intel_runtime_pm_put_unchecked(i915);
> +     intel_runtime_pm_put(i915, wakeref);
>       mutex_unlock(&i915->drm.struct_mutex);
>  
>       return err;
> diff --git a/drivers/gpu/drm/i915/selftests/i915_gem_gtt.c 
> b/drivers/gpu/drm/i915/selftests/i915_gem_gtt.c
> index 87cb0602a5fc..fea8ab14e79d 100644
> --- a/drivers/gpu/drm/i915/selftests/i915_gem_gtt.c
> +++ b/drivers/gpu/drm/i915/selftests/i915_gem_gtt.c
> @@ -275,6 +275,7 @@ static int lowlevel_hole(struct drm_i915_private *i915,
>  
>               for (n = 0; n < count; n++) {
>                       u64 addr = hole_start + order[n] * BIT_ULL(size);
> +                     intel_wakeref_t wakeref;
>  
>                       GEM_BUG_ON(addr + BIT_ULL(size) > vm->total);
>  
> @@ -293,9 +294,9 @@ static int lowlevel_hole(struct drm_i915_private *i915,
>                       mock_vma.node.size = BIT_ULL(size);
>                       mock_vma.node.start = addr;
>  
> -                     intel_runtime_pm_get(i915);
> +                     wakeref = intel_runtime_pm_get(i915);
>                       vm->insert_entries(vm, &mock_vma, I915_CACHE_NONE, 0);
> -                     intel_runtime_pm_put_unchecked(i915);
> +                     intel_runtime_pm_put(i915, wakeref);
>               }
>               count = n;
>  
> @@ -1144,6 +1145,7 @@ static int igt_ggtt_page(void *arg)
>       struct drm_i915_private *i915 = arg;
>       struct i915_ggtt *ggtt = &i915->ggtt;
>       struct drm_i915_gem_object *obj;
> +     intel_wakeref_t wakeref;
>       struct drm_mm_node tmp;
>       unsigned int *order, n;
>       int err;
> @@ -1169,7 +1171,7 @@ static int igt_ggtt_page(void *arg)
>       if (err)
>               goto out_unpin;
>  
> -     intel_runtime_pm_get(i915);
> +     wakeref = intel_runtime_pm_get(i915);
>  
>       for (n = 0; n < count; n++) {
>               u64 offset = tmp.start + n * PAGE_SIZE;
> @@ -1216,7 +1218,7 @@ static int igt_ggtt_page(void *arg)
>       kfree(order);
>  out_remove:
>       ggtt->vm.clear_range(&ggtt->vm, tmp.start, tmp.size);
> -     intel_runtime_pm_put_unchecked(i915);
> +     intel_runtime_pm_put(i915, wakeref);
>       drm_mm_remove_node(&tmp);
>  out_unpin:
>       i915_gem_object_unpin_pages(obj);
> diff --git a/drivers/gpu/drm/i915/selftests/i915_gem_object.c 
> b/drivers/gpu/drm/i915/selftests/i915_gem_object.c
> index b03890c590d7..3575e1387c3f 100644
> --- a/drivers/gpu/drm/i915/selftests/i915_gem_object.c
> +++ b/drivers/gpu/drm/i915/selftests/i915_gem_object.c
> @@ -308,6 +308,7 @@ static int igt_partial_tiling(void *arg)
>       const unsigned int nreal = 1 << 12; /* largest tile row x2 */
>       struct drm_i915_private *i915 = arg;
>       struct drm_i915_gem_object *obj;
> +     intel_wakeref_t wakeref;
>       int tiling;
>       int err;
>  
> @@ -333,7 +334,7 @@ static int igt_partial_tiling(void *arg)
>       }
>  
>       mutex_lock(&i915->drm.struct_mutex);
> -     intel_runtime_pm_get(i915);
> +     wakeref = intel_runtime_pm_get(i915);
>  
>       if (1) {
>               IGT_TIMEOUT(end);
> @@ -444,7 +445,7 @@ next_tiling: ;
>       }
>  
>  out_unlock:
> -     intel_runtime_pm_put_unchecked(i915);
> +     intel_runtime_pm_put(i915, wakeref);
>       mutex_unlock(&i915->drm.struct_mutex);
>       i915_gem_object_unpin_pages(obj);
>  out:
> @@ -506,11 +507,14 @@ static void disable_retire_worker(struct 
> drm_i915_private *i915)
>  
>       mutex_lock(&i915->drm.struct_mutex);
>       if (!i915->gt.active_requests++) {
> -             intel_runtime_pm_get(i915);
> +             intel_wakeref_t wakeref;
> +
> +             wakeref = intel_runtime_pm_get(i915);
>               i915_gem_unpark(i915);
> -             intel_runtime_pm_put_unchecked(i915);
> +             intel_runtime_pm_put(i915, wakeref);
>       }
>       mutex_unlock(&i915->drm.struct_mutex);
> +
>       cancel_delayed_work_sync(&i915->gt.retire_work);
>       cancel_delayed_work_sync(&i915->gt.idle_work);
>  }
> @@ -578,6 +582,8 @@ 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->gpu_error))
>                       break;
>  
> @@ -588,9 +594,9 @@ static int igt_mmap_offset_exhaustion(void *arg)
>               }
>  
>               mutex_lock(&i915->drm.struct_mutex);
> -             intel_runtime_pm_get(i915);
> +             wakeref = intel_runtime_pm_get(i915);
>               err = make_obj_busy(obj);
> -             intel_runtime_pm_put_unchecked(i915);
> +             intel_runtime_pm_put(i915, wakeref);
>               mutex_unlock(&i915->drm.struct_mutex);
>               if (err) {
>                       pr_err("[loop %d] Failed to busy the object\n", loop);
> diff --git a/drivers/gpu/drm/i915/selftests/i915_request.c 
> b/drivers/gpu/drm/i915/selftests/i915_request.c
> index e8880cabd5c7..8b73a8c21377 100644
> --- a/drivers/gpu/drm/i915/selftests/i915_request.c
> +++ b/drivers/gpu/drm/i915/selftests/i915_request.c
> @@ -332,6 +332,7 @@ static int live_nop_request(void *arg)
>  {
>       struct drm_i915_private *i915 = arg;
>       struct intel_engine_cs *engine;
> +     intel_wakeref_t wakeref;
>       struct live_test t;
>       unsigned int id;
>       int err = -ENODEV;
> @@ -342,7 +343,7 @@ static int live_nop_request(void *arg)
>        */
>  
>       mutex_lock(&i915->drm.struct_mutex);
> -     intel_runtime_pm_get(i915);
> +     wakeref = intel_runtime_pm_get(i915);
>  
>       for_each_engine(engine, i915, id) {
>               struct i915_request *request = NULL;
> @@ -403,7 +404,7 @@ static int live_nop_request(void *arg)
>       }
>  
>  out_unlock:
> -     intel_runtime_pm_put_unchecked(i915);
> +     intel_runtime_pm_put(i915, wakeref);
>       mutex_unlock(&i915->drm.struct_mutex);
>       return err;
>  }
> @@ -478,8 +479,9 @@ static int live_empty_request(void *arg)
>  {
>       struct drm_i915_private *i915 = arg;
>       struct intel_engine_cs *engine;
> -     struct live_test t;
> +     intel_wakeref_t wakeref;
>       struct i915_vma *batch;
> +     struct live_test t;
>       unsigned int id;
>       int err = 0;
>  
> @@ -489,7 +491,7 @@ static int live_empty_request(void *arg)
>        */
>  
>       mutex_lock(&i915->drm.struct_mutex);
> -     intel_runtime_pm_get(i915);
> +     wakeref = intel_runtime_pm_get(i915);
>  
>       batch = empty_batch(i915);
>       if (IS_ERR(batch)) {
> @@ -553,7 +555,7 @@ static int live_empty_request(void *arg)
>       i915_vma_unpin(batch);
>       i915_vma_put(batch);
>  out_unlock:
> -     intel_runtime_pm_put_unchecked(i915);
> +     intel_runtime_pm_put(i915, wakeref);
>       mutex_unlock(&i915->drm.struct_mutex);
>       return err;
>  }
> @@ -637,6 +639,7 @@ 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 i915_vma *batch;
>       struct live_test t;
>       unsigned int id;
> @@ -648,7 +651,7 @@ static int live_all_engines(void *arg)
>        */
>  
>       mutex_lock(&i915->drm.struct_mutex);
> -     intel_runtime_pm_get(i915);
> +     wakeref = intel_runtime_pm_get(i915);
>  
>       err = begin_live_test(&t, i915, __func__, "");
>       if (err)
> @@ -731,7 +734,7 @@ static int live_all_engines(void *arg)
>       i915_vma_unpin(batch);
>       i915_vma_put(batch);
>  out_unlock:
> -     intel_runtime_pm_put_unchecked(i915);
> +     intel_runtime_pm_put(i915, wakeref);
>       mutex_unlock(&i915->drm.struct_mutex);
>       return err;
>  }
> @@ -742,6 +745,7 @@ 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 live_test t;
>       unsigned int id;
>       int err;
> @@ -753,7 +757,7 @@ static int live_sequential_engines(void *arg)
>        */
>  
>       mutex_lock(&i915->drm.struct_mutex);
> -     intel_runtime_pm_get(i915);
> +     wakeref = intel_runtime_pm_get(i915);
>  
>       err = begin_live_test(&t, i915, __func__, "");
>       if (err)
> @@ -860,7 +864,7 @@ static int live_sequential_engines(void *arg)
>               i915_request_put(request[id]);
>       }
>  out_unlock:
> -     intel_runtime_pm_put_unchecked(i915);
> +     intel_runtime_pm_put(i915, wakeref);
>       mutex_unlock(&i915->drm.struct_mutex);
>       return err;
>  }
> diff --git a/drivers/gpu/drm/i915/selftests/intel_guc.c 
> b/drivers/gpu/drm/i915/selftests/intel_guc.c
> index 3590ba3d8897..c5e0a0e98fcb 100644
> --- a/drivers/gpu/drm/i915/selftests/intel_guc.c
> +++ b/drivers/gpu/drm/i915/selftests/intel_guc.c
> @@ -137,12 +137,13 @@ 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);
> -     intel_runtime_pm_get(dev_priv);
> +     wakeref = intel_runtime_pm_get(dev_priv);
>  
>       guc = &dev_priv->guc;
>       if (!guc) {
> @@ -225,7 +226,7 @@ static int igt_guc_clients(void *args)
>       guc_clients_create(guc);
>       guc_clients_enable(guc);
>  unlock:
> -     intel_runtime_pm_put_unchecked(dev_priv);
> +     intel_runtime_pm_put(dev_priv, wakeref);
>       mutex_unlock(&dev_priv->drm.struct_mutex);
>       return err;
>  }
> @@ -238,13 +239,14 @@ 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));
>       mutex_lock(&dev_priv->drm.struct_mutex);
> -     intel_runtime_pm_get(dev_priv);
> +     wakeref = intel_runtime_pm_get(dev_priv);
>  
>       guc = &dev_priv->guc;
>       if (!guc) {
> @@ -337,7 +339,7 @@ static int igt_guc_doorbells(void *arg)
>                       guc_client_free(clients[i]);
>               }
>  unlock:
> -     intel_runtime_pm_put_unchecked(dev_priv);
> +     intel_runtime_pm_put(dev_priv, wakeref);
>       mutex_unlock(&dev_priv->drm.struct_mutex);
>       return err;
>  }
> diff --git a/drivers/gpu/drm/i915/selftests/intel_hangcheck.c 
> b/drivers/gpu/drm/i915/selftests/intel_hangcheck.c
> index 33bd3c4b6fa3..12550b55c42f 100644
> --- a/drivers/gpu/drm/i915/selftests/intel_hangcheck.c
> +++ b/drivers/gpu/drm/i915/selftests/intel_hangcheck.c
> @@ -388,12 +388,13 @@ static int igt_global_reset(void *arg)
>  static int igt_wedged_reset(void *arg)
>  {
>       struct drm_i915_private *i915 = arg;
> +     intel_wakeref_t wakeref;
>  
>       /* Check that we can recover a wedged device with a GPU reset */
>  
>       igt_global_reset_lock(i915);
>       mutex_lock(&i915->drm.struct_mutex);
> -     intel_runtime_pm_get(i915);
> +     wakeref = intel_runtime_pm_get(i915);
>  
>       i915_gem_set_wedged(i915);
>       GEM_BUG_ON(!i915_terminally_wedged(&i915->gpu_error));
> @@ -402,7 +403,7 @@ static int igt_wedged_reset(void *arg)
>       i915_reset(i915, ALL_ENGINES, NULL);
>       GEM_BUG_ON(test_bit(I915_RESET_HANDOFF, &i915->gpu_error.flags));
>  
> -     intel_runtime_pm_put_unchecked(i915);
> +     intel_runtime_pm_put(i915, wakeref);
>       mutex_unlock(&i915->drm.struct_mutex);
>       igt_global_reset_unlock(i915);
>  
> @@ -1600,6 +1601,7 @@ static int igt_atomic_reset(void *arg)
>               { }
>       };
>       struct drm_i915_private *i915 = arg;
> +     intel_wakeref_t wakeref;
>       int err = 0;
>  
>       /* Check that the resets are usable from atomic context */
> @@ -1609,7 +1611,7 @@ static int igt_atomic_reset(void *arg)
>  
>       igt_global_reset_lock(i915);
>       mutex_lock(&i915->drm.struct_mutex);
> -     intel_runtime_pm_get(i915);
> +     wakeref = intel_runtime_pm_get(i915);
>  
>       /* Flush any requests before we get started and check basics */
>       force_reset(i915);
> @@ -1636,7 +1638,7 @@ static int igt_atomic_reset(void *arg)
>       force_reset(i915);
>  
>  unlock:
> -     intel_runtime_pm_put_unchecked(i915);
> +     intel_runtime_pm_put(i915, wakeref);
>       mutex_unlock(&i915->drm.struct_mutex);
>       igt_global_reset_unlock(i915);
>  
> @@ -1660,6 +1662,7 @@ int intel_hangcheck_live_selftests(struct 
> drm_i915_private *i915)
>               SUBTEST(igt_handle_error),
>               SUBTEST(igt_atomic_reset),
>       };
> +     intel_wakeref_t wakeref;
>       bool saved_hangcheck;
>       int err;
>  
> @@ -1669,7 +1672,7 @@ int intel_hangcheck_live_selftests(struct 
> drm_i915_private *i915)
>       if (i915_terminally_wedged(&i915->gpu_error))
>               return -EIO; /* we're long past hope of a successful reset */
>  
> -     intel_runtime_pm_get(i915);
> +     wakeref = intel_runtime_pm_get(i915);
>       saved_hangcheck = fetch_and_zero(&i915_modparams.enable_hangcheck);
>  
>       err = i915_subtests(tests, i915);
> @@ -1679,7 +1682,7 @@ int intel_hangcheck_live_selftests(struct 
> drm_i915_private *i915)
>       mutex_unlock(&i915->drm.struct_mutex);
>  
>       i915_modparams.enable_hangcheck = saved_hangcheck;
> -     intel_runtime_pm_put_unchecked(i915);
> +     intel_runtime_pm_put(i915, wakeref);
>  
>       return err;
>  }
> diff --git a/drivers/gpu/drm/i915/selftests/intel_lrc.c 
> b/drivers/gpu/drm/i915/selftests/intel_lrc.c
> index ac1b18a17f3c..e6073cd4719c 100644
> --- a/drivers/gpu/drm/i915/selftests/intel_lrc.c
> +++ b/drivers/gpu/drm/i915/selftests/intel_lrc.c
> @@ -18,13 +18,14 @@ 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;
>  
>       mutex_lock(&i915->drm.struct_mutex);
> -     intel_runtime_pm_get(i915);
> +     wakeref = intel_runtime_pm_get(i915);
>  
>       if (igt_spinner_init(&spin, i915))
>               goto err_unlock;
> @@ -65,7 +66,7 @@ static int live_sanitycheck(void *arg)
>       igt_spinner_fini(&spin);
>  err_unlock:
>       igt_flush_test(i915, I915_WAIT_LOCKED);
> -     intel_runtime_pm_put_unchecked(i915);
> +     intel_runtime_pm_put(i915, wakeref);
>       mutex_unlock(&i915->drm.struct_mutex);
>       return err;
>  }
> @@ -77,13 +78,14 @@ 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))
>               return 0;
>  
>       mutex_lock(&i915->drm.struct_mutex);
> -     intel_runtime_pm_get(i915);
> +     wakeref = intel_runtime_pm_get(i915);
>  
>       if (igt_spinner_init(&spin_hi, i915))
>               goto err_unlock;
> @@ -158,7 +160,7 @@ static int live_preempt(void *arg)
>       igt_spinner_fini(&spin_hi);
>  err_unlock:
>       igt_flush_test(i915, I915_WAIT_LOCKED);
> -     intel_runtime_pm_put_unchecked(i915);
> +     intel_runtime_pm_put(i915, wakeref);
>       mutex_unlock(&i915->drm.struct_mutex);
>       return err;
>  }
> @@ -171,13 +173,14 @@ 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;
>  
>       mutex_lock(&i915->drm.struct_mutex);
> -     intel_runtime_pm_get(i915);
> +     wakeref = intel_runtime_pm_get(i915);
>  
>       if (igt_spinner_init(&spin_hi, i915))
>               goto err_unlock;
> @@ -251,7 +254,7 @@ 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_unchecked(i915);
> +     intel_runtime_pm_put(i915, wakeref);
>       mutex_unlock(&i915->drm.struct_mutex);
>       return err;
>  
> @@ -270,6 +273,7 @@ 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))
> @@ -279,7 +283,7 @@ static int live_preempt_hang(void *arg)
>               return 0;
>  
>       mutex_lock(&i915->drm.struct_mutex);
> -     intel_runtime_pm_get(i915);
> +     wakeref = intel_runtime_pm_get(i915);
>  
>       if (igt_spinner_init(&spin_hi, i915))
>               goto err_unlock;
> @@ -374,7 +378,7 @@ 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_unchecked(i915);
> +     intel_runtime_pm_put(i915, wakeref);
>       mutex_unlock(&i915->drm.struct_mutex);
>       return err;
>  }
> @@ -562,6 +566,7 @@ static int live_preempt_smoke(void *arg)
>               .ncontext = 1024,
>       };
>       const unsigned int phase[] = { 0, BATCH };
> +     intel_wakeref_t wakeref;
>       int err = -ENOMEM;
>       u32 *cs;
>       int n;
> @@ -576,7 +581,7 @@ static int live_preempt_smoke(void *arg)
>               return -ENOMEM;
>  
>       mutex_lock(&smoke.i915->drm.struct_mutex);
> -     intel_runtime_pm_get(smoke.i915);
> +     wakeref = intel_runtime_pm_get(smoke.i915);
>  
>       smoke.batch = i915_gem_object_create_internal(smoke.i915, PAGE_SIZE);
>       if (IS_ERR(smoke.batch)) {
> @@ -627,7 +632,7 @@ static int live_preempt_smoke(void *arg)
>  err_batch:
>       i915_gem_object_put(smoke.batch);
>  err_unlock:
> -     intel_runtime_pm_put_unchecked(smoke.i915);
> +     intel_runtime_pm_put(smoke.i915, wakeref);
>       mutex_unlock(&smoke.i915->drm.struct_mutex);
>       kfree(smoke.contexts);
>  
> diff --git a/drivers/gpu/drm/i915/selftests/intel_workarounds.c 
> b/drivers/gpu/drm/i915/selftests/intel_workarounds.c
> index 54f5c2de3d08..47e62e1999a9 100644
> --- a/drivers/gpu/drm/i915/selftests/intel_workarounds.c
> +++ b/drivers/gpu/drm/i915/selftests/intel_workarounds.c
> @@ -15,10 +15,11 @@
>  static struct drm_i915_gem_object *
>  read_nonprivs(struct i915_gem_context *ctx, struct intel_engine_cs *engine)
>  {
> +     const u32 base = engine->mmio_base;
>       struct drm_i915_gem_object *result;
> +     intel_wakeref_t wakeref;
>       struct i915_request *rq;
>       struct i915_vma *vma;
> -     const u32 base = engine->mmio_base;
>       u32 srm, *cs;
>       int err;
>       int i;
> @@ -47,9 +48,9 @@ read_nonprivs(struct i915_gem_context *ctx, struct 
> intel_engine_cs *engine)
>       if (err)
>               goto err_obj;
>  
> -     intel_runtime_pm_get(engine->i915);
> +     wakeref = intel_runtime_pm_get(engine->i915);
>       rq = i915_request_alloc(engine, ctx);
> -     intel_runtime_pm_put_unchecked(engine->i915);
> +     intel_runtime_pm_put(engine->i915, wakeref);
>       if (IS_ERR(rq)) {
>               err = PTR_ERR(rq);
>               goto err_pin;
> @@ -183,20 +184,21 @@ 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);
>       if (IS_ERR(ctx))
>               return PTR_ERR(ctx);
>  
> -     intel_runtime_pm_get(engine->i915);
> +     wakeref = intel_runtime_pm_get(engine->i915);
>  
>       if (spin)
>               rq = igt_spinner_create_request(spin, ctx, engine, MI_NOOP);
>       else
>               rq = i915_request_alloc(engine, ctx);
>  
> -     intel_runtime_pm_put_unchecked(engine->i915);
> +     intel_runtime_pm_put(engine->i915, wakeref);
>  
>       kernel_context_close(ctx);
>  
> @@ -228,6 +230,7 @@ static int check_whitelist_across_reset(struct 
> intel_engine_cs *engine,
>       bool want_spin = reset == do_engine_reset;
>       struct i915_gem_context *ctx;
>       struct igt_spinner spin;
> +     intel_wakeref_t wakeref;
>       int err;
>  
>       pr_info("Checking %d whitelisted registers (RING_NONPRIV) [%s]\n",
> @@ -253,9 +256,9 @@ static int check_whitelist_across_reset(struct 
> intel_engine_cs *engine,
>       if (err)
>               goto out;
>  
> -     intel_runtime_pm_get(i915);
> +     wakeref = intel_runtime_pm_get(i915);
>       err = reset(engine);
> -     intel_runtime_pm_put_unchecked(i915);
> +     intel_runtime_pm_put(i915, wakeref);
>  
>       if (want_spin) {
>               igt_spinner_end(&spin);
> @@ -344,6 +347,7 @@ live_gpu_reset_gt_engine_workarounds(void *arg)
>  {
>       struct drm_i915_private *i915 = arg;
>       struct i915_gpu_error *error = &i915->gpu_error;
> +     intel_wakeref_t wakeref;
>       bool ok;
>  
>       if (!intel_has_gpu_reset(i915))
> @@ -352,7 +356,7 @@ live_gpu_reset_gt_engine_workarounds(void *arg)
>       pr_info("Verifying after GPU reset...\n");
>  
>       igt_global_reset_lock(i915);
> -     intel_runtime_pm_get(i915);
> +     wakeref = intel_runtime_pm_get(i915);
>  
>       ok = verify_gt_engine_wa(i915, "before reset");
>       if (!ok)
> @@ -364,7 +368,7 @@ live_gpu_reset_gt_engine_workarounds(void *arg)
>       ok = verify_gt_engine_wa(i915, "after reset");
>  
>  out:
> -     intel_runtime_pm_put_unchecked(i915);
> +     intel_runtime_pm_put(i915, wakeref);
>       igt_global_reset_unlock(i915);
>  
>       return ok ? 0 : -ESRCH;
> @@ -379,6 +383,7 @@ 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;
>       int ret = 0;
>  
>       if (!intel_has_reset_engine(i915))
> @@ -389,7 +394,7 @@ live_engine_reset_gt_engine_workarounds(void *arg)
>               return PTR_ERR(ctx);
>  
>       igt_global_reset_lock(i915);
> -     intel_runtime_pm_get(i915);
> +     wakeref = intel_runtime_pm_get(i915);
>  
>       for_each_engine(engine, i915, id) {
>               bool ok;
> @@ -443,7 +448,7 @@ live_engine_reset_gt_engine_workarounds(void *arg)
>       }
>  
>  err:
> -     intel_runtime_pm_put_unchecked(i915);
> +     intel_runtime_pm_put(i915, wakeref);
>       igt_global_reset_unlock(i915);
>       kernel_context_close(ctx);
>  
> -- 
> 2.20.1
>
> _______________________________________________
> Intel-gfx mailing list
> Intel-gfx@lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/intel-gfx
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

Reply via email to