[Intel-gfx] [PATCH 2/5] drm/i915: Serialise with remote retirement

Tvrtko Ursulin tvrtko.ursulin at linux.intel.com
Thu Nov 21 11:47:51 UTC 2019


On 21/11/2019 07:10, Chris Wilson wrote:
> Since retirement may be running in a worker on another CPU, it may be
> skipped in the local intel_gt_wait_for_idle(). To ensure the state is
> consistent for our sanity checks upon load, serialise with the remote
> retirer by waiting on the timeline->mutex.
> 
> Outside of this use case, e.g. on suspend or module unload, we expect the
> slack to be picked up by intel_gt_pm_wait_for_idle() and so prefer to
> put the special case serialisation with retirement in its single user,
> for now at least.
> 
> Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
> Cc: Tvrtko Ursulin <tvrtko.ursulin at intel.com>
> ---
>   drivers/gpu/drm/i915/i915_gem.c | 26 +++++++++++++++++++++++---
>   1 file changed, 23 insertions(+), 3 deletions(-)
> 
> diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c
> index 1ba5f26700b0..61395b03443e 100644
> --- a/drivers/gpu/drm/i915/i915_gem.c
> +++ b/drivers/gpu/drm/i915/i915_gem.c
> @@ -45,6 +45,7 @@
>   #include "gem/i915_gem_context.h"
>   #include "gem/i915_gem_ioctls.h"
>   #include "gem/i915_gem_pm.h"
> +#include "gt/intel_context.h"
>   #include "gt/intel_engine_user.h"
>   #include "gt/intel_gt.h"
>   #include "gt/intel_gt_pm.h"
> @@ -1041,6 +1042,18 @@ i915_gem_madvise_ioctl(struct drm_device *dev, void *data,
>   	return err;
>   }
>   
> +static int __intel_context_flush_retire(struct intel_context *ce)
> +{
> +	struct intel_timeline *tl;
> +
> +	tl = intel_context_timeline_lock(ce);
> +	if (IS_ERR(tl))
> +		return PTR_ERR(tl);
> +
> +	intel_context_timeline_unlock(tl);
> +	return 0;
> +}
> +
>   static int __intel_engines_record_defaults(struct intel_gt *gt)
>   {
>   	struct i915_request *requests[I915_NUM_ENGINES] = {};
> @@ -1109,13 +1122,20 @@ static int __intel_engines_record_defaults(struct intel_gt *gt)
>   		if (!rq)
>   			continue;
>   
> -		/* We want to be able to unbind the state from the GGTT */
> -		GEM_BUG_ON(intel_context_is_pinned(rq->hw_context));
> -
> +		GEM_BUG_ON(!test_bit(CONTEXT_ALLOC_BIT,
> +				     &rq->hw_context->flags));
>   		state = rq->hw_context->state;
>   		if (!state)
>   			continue;
>   
> +		/* Serialise with retirement on another CPU */
> +		err = __intel_context_flush_retire(rq->hw_context);
> +		if (err)
> +			goto out;
> +
> +		/* We want to be able to unbind the state from the GGTT */
> +		GEM_BUG_ON(intel_context_is_pinned(rq->hw_context));
> +
>   		/*
>   		 * As we will hold a reference to the logical state, it will
>   		 * not be torn down with the context, and importantly the
> 

Reviewed-by: Tvrtko Ursulin <tvrtko.ursulin at intel.com>

Regards,

Tvrtko


More information about the Intel-gfx mailing list