Re: [PATCH 2/7] drm/i915/selftests: Use a sacrificial context for hang testing

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Chris Wilson <chris@xxxxxxxxxxxxxxxxxx> writes:

> Avoid injecting hangs in to the i915->kernel_context in case the GPU
> reset leaves corruption in the context image in its wake (leading to
> continual failures and system hangs after the selftests are ostensibly
> complete). Use a sacrificial kernel_context instead.
>
> v2: Closing a context is tricky; export a function (for selftests) from
> i915_gem_context.c to get it right.
>
> Signed-off-by: Chris Wilson <chris@xxxxxxxxxxxxxxxxxx>
> Cc: Mika Kuoppala <mika.kuoppala@xxxxxxxxxxxxxxx>
> Cc: Michel Thierry <michel.thierry@xxxxxxxxx
> ---
>  drivers/gpu/drm/i915/selftests/intel_hangcheck.c | 39 +++++++++++++-----------
>  drivers/gpu/drm/i915/selftests/mock_context.c    | 11 +++++++
>  drivers/gpu/drm/i915/selftests/mock_context.h    |  3 ++
>  3 files changed, 36 insertions(+), 17 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/selftests/intel_hangcheck.c b/drivers/gpu/drm/i915/selftests/intel_hangcheck.c
> index a4f4ff22389b..e0b662a2b8ae 100644
> --- a/drivers/gpu/drm/i915/selftests/intel_hangcheck.c
> +++ b/drivers/gpu/drm/i915/selftests/intel_hangcheck.c
> @@ -33,6 +33,7 @@ struct hang {
>  	struct drm_i915_private *i915;
>  	struct drm_i915_gem_object *hws;
>  	struct drm_i915_gem_object *obj;
> +	struct i915_gem_context *ctx;
>  	u32 *seqno;
>  	u32 *batch;
>  };
> @@ -45,9 +46,15 @@ static int hang_init(struct hang *h, struct drm_i915_private *i915)
>  	memset(h, 0, sizeof(*h));
>  	h->i915 = i915;
>  
> +	h->ctx = kernel_context(i915);
> +	if (IS_ERR(h->ctx))
> +		return PTR_ERR(h->ctx);
> +
>  	h->hws = i915_gem_object_create_internal(i915, PAGE_SIZE);
> -	if (IS_ERR(h->hws))
> -		return PTR_ERR(h->hws);
> +	if (IS_ERR(h->hws)) {
> +		err = PTR_ERR(h->hws);
> +		goto err_ctx;
> +	}
>  
>  	h->obj = i915_gem_object_create_internal(i915, PAGE_SIZE);
>  	if (IS_ERR(h->obj)) {
> @@ -79,6 +86,8 @@ static int hang_init(struct hang *h, struct drm_i915_private *i915)
>  	i915_gem_object_put(h->obj);
>  err_hws:
>  	i915_gem_object_put(h->hws);
> +err_ctx:
> +	kernel_context_close(h->ctx);
>  	return err;
>  }
>  
> @@ -196,9 +205,7 @@ static int emit_recurse_batch(struct hang *h,
>  }
>  
>  static struct drm_i915_gem_request *
> -hang_create_request(struct hang *h,
> -		    struct intel_engine_cs *engine,
> -		    struct i915_gem_context *ctx)
> +hang_create_request(struct hang *h, struct intel_engine_cs *engine)
>  {
>  	struct drm_i915_gem_request *rq;
>  	int err;
> @@ -225,7 +232,7 @@ hang_create_request(struct hang *h,
>  		h->batch = vaddr;
>  	}
>  
> -	rq = i915_gem_request_alloc(engine, ctx);
> +	rq = i915_gem_request_alloc(engine, h->ctx);
>  	if (IS_ERR(rq))
>  		return rq;
>  
> @@ -306,6 +313,8 @@ static void hang_fini(struct hang *h)
>  	i915_gem_object_unpin_map(h->hws);
>  	i915_gem_object_put(h->hws);
>  
> +	kernel_context_close(h->ctx);
> +
>  	flush_test(h->i915, I915_WAIT_LOCKED);
>  }
>  
> @@ -341,7 +350,7 @@ static int igt_hang_sanitycheck(void *arg)
>  		if (!intel_engine_can_store_dword(engine))
>  			continue;
>  
> -		rq = hang_create_request(&h, engine, i915->kernel_context);
> +		rq = hang_create_request(&h, engine);
>  		if (IS_ERR(rq)) {
>  			err = PTR_ERR(rq);
>  			pr_err("Failed to create request for %s, err=%d\n",
> @@ -478,8 +487,7 @@ static int __igt_reset_engine(struct drm_i915_private *i915, bool active)
>  				struct drm_i915_gem_request *rq;
>  
>  				mutex_lock(&i915->drm.struct_mutex);
> -				rq = hang_create_request(&h, engine,
> -							 i915->kernel_context);
> +				rq = hang_create_request(&h, engine);
>  				if (IS_ERR(rq)) {
>  					err = PTR_ERR(rq);
>  					mutex_unlock(&i915->drm.struct_mutex);
> @@ -686,8 +694,7 @@ static int __igt_reset_engine_others(struct drm_i915_private *i915,
>  				struct drm_i915_gem_request *rq;
>  
>  				mutex_lock(&i915->drm.struct_mutex);
> -				rq = hang_create_request(&h, engine,
> -							 i915->kernel_context);
> +				rq = hang_create_request(&h, engine);
>  				if (IS_ERR(rq)) {
>  					err = PTR_ERR(rq);
>  					mutex_unlock(&i915->drm.struct_mutex);
> @@ -842,7 +849,7 @@ static int igt_wait_reset(void *arg)
>  	if (err)
>  		goto unlock;
>  
> -	rq = hang_create_request(&h, i915->engine[RCS], i915->kernel_context);
> +	rq = hang_create_request(&h, i915->engine[RCS]);
>  	if (IS_ERR(rq)) {
>  		err = PTR_ERR(rq);
>  		goto fini;
> @@ -921,7 +928,7 @@ static int igt_reset_queue(void *arg)
>  		if (!intel_engine_can_store_dword(engine))
>  			continue;
>  
> -		prev = hang_create_request(&h, engine, i915->kernel_context);
> +		prev = hang_create_request(&h, engine);
>  		if (IS_ERR(prev)) {
>  			err = PTR_ERR(prev);
>  			goto fini;
> @@ -935,9 +942,7 @@ static int igt_reset_queue(void *arg)
>  			struct drm_i915_gem_request *rq;
>  			unsigned int reset_count;
>  
> -			rq = hang_create_request(&h,
> -						 engine,
> -						 i915->kernel_context);
> +			rq = hang_create_request(&h, engine);
>  			if (IS_ERR(rq)) {
>  				err = PTR_ERR(rq);
>  				goto fini;
> @@ -1048,7 +1053,7 @@ static int igt_handle_error(void *arg)
>  	if (err)
>  		goto err_unlock;
>  
> -	rq = hang_create_request(&h, engine, i915->kernel_context);
> +	rq = hang_create_request(&h, engine);
>  	if (IS_ERR(rq)) {
>  		err = PTR_ERR(rq);
>  		goto err_fini;
> diff --git a/drivers/gpu/drm/i915/selftests/mock_context.c b/drivers/gpu/drm/i915/selftests/mock_context.c
> index bbf80d42e793..501becc47c0c 100644
> --- a/drivers/gpu/drm/i915/selftests/mock_context.c
> +++ b/drivers/gpu/drm/i915/selftests/mock_context.c
> @@ -92,3 +92,14 @@ live_context(struct drm_i915_private *i915, struct drm_file *file)
>  
>  	return i915_gem_create_context(i915, file->driver_priv);
>  }
> +
> +struct i915_gem_context *
> +kernel_context(struct drm_i915_private *i915)

kernel_context_create would be more symmetric.

Reviewed-by: Mika Kuoppala <mika.kuoppala@xxxxxxxxxxxxxxx>

> +{
> +	return i915_gem_context_create_kernel(i915, I915_PRIORITY_NORMAL);
> +}
> +
> +void kernel_context_close(struct i915_gem_context *ctx)
> +{
> +	context_close(ctx);
> +}
> diff --git a/drivers/gpu/drm/i915/selftests/mock_context.h b/drivers/gpu/drm/i915/selftests/mock_context.h
> index 2f432c03d413..29b9d60a158b 100644
> --- a/drivers/gpu/drm/i915/selftests/mock_context.h
> +++ b/drivers/gpu/drm/i915/selftests/mock_context.h
> @@ -36,4 +36,7 @@ void mock_context_close(struct i915_gem_context *ctx);
>  struct i915_gem_context *
>  live_context(struct drm_i915_private *i915, struct drm_file *file);
>  
> +struct i915_gem_context *kernel_context(struct drm_i915_private *i915);
> +void kernel_context_close(struct i915_gem_context *ctx);
> +
>  #endif /* !__MOCK_CONTEXT_H */
> -- 
> 2.15.1
_______________________________________________
Intel-gfx mailing list
Intel-gfx@xxxxxxxxxxxxxxxxxxxxx
https://lists.freedesktop.org/mailman/listinfo/intel-gfx




[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]
  Powered by Linux