[Intel-gfx] [PATCH 16/46] drm/i915/selftests: Mark up rpm wakerefs

Mika Kuoppala mika.kuoppala at linux.intel.com
Wed Jan 9 12:54:21 UTC 2019


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

> Track the temporary wakerefs used within the selftests so that leaks are
> clear.
>
> Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
> Cc: Jani Nikula <jani.nikula at 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.kuoppala at 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 at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/intel-gfx


More information about the Intel-gfx mailing list