[Intel-gfx] [PATCH 02/43] drm/i915: Force GPU idle on suspend

Tvrtko Ursulin tvrtko.ursulin at linux.intel.com
Thu Mar 7 09:38:37 UTC 2019


On 06/03/2019 14:24, Chris Wilson wrote:
> To facilitate the next patch to allow preemptible kernels not to incur
> the wrath of hangcheck, we need to ensure that we can still suspend and
> shutdown. That is we will not be able to rely on hangcheck to terminate
> a blocking kernel and instead must manually do so ourselves. The
> advantage is that we can apply more pressure!
> 
> As we now perform a GPU reset to clean up any residual kernels, we leave
> the GPU in an unknown state and in particular can not talk to the GuC
> before we reinitialise it following resume. For example, we no longer
> need to tell the GuC to suspend itself, as it is already reset.
> 
> Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
> ---
>   drivers/gpu/drm/i915/i915_gem.c | 20 +++++---------------
>   1 file changed, 5 insertions(+), 15 deletions(-)
> 
> diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c
> index 0b23cf3be718..c10be23d959e 100644
> --- a/drivers/gpu/drm/i915/i915_gem.c
> +++ b/drivers/gpu/drm/i915/i915_gem.c
> @@ -3123,13 +3123,6 @@ int i915_gem_wait_for_idle(struct drm_i915_private *i915,
>   
>   		lockdep_assert_held(&i915->drm.struct_mutex);
>   
> -		if (GEM_SHOW_DEBUG() && !timeout) {
> -			/* Presume that timeout was non-zero to begin with! */
> -			dev_warn(&i915->drm.pdev->dev,
> -				 "Missed idle-completion interrupt!\n");
> -			GEM_TRACE_DUMP();
> -		}
> -
>   		err = wait_for_engines(i915);
>   		if (err)
>   			return err;
> @@ -4379,11 +4372,12 @@ int i915_gem_suspend(struct drm_i915_private *i915)
>   					     I915_WAIT_INTERRUPTIBLE |
>   					     I915_WAIT_LOCKED |
>   					     I915_WAIT_FOR_IDLE_BOOST,
> -					     MAX_SCHEDULE_TIMEOUT);
> -		if (ret && ret != -EIO)
> +					     HZ / 5);
> +		if (ret == -EINTR)
>   			goto err_unlock;
>   
> -		assert_kernel_context_is_current(i915);
> +		/* Forcibly cancel outstanding work and leave the gpu quiet. */
> +		i915_gem_set_wedged(i915);
>   	}
>   	i915_retire_requests(i915); /* ensure we flush after wedging */
>   
> @@ -4398,15 +4392,11 @@ int i915_gem_suspend(struct drm_i915_private *i915)
>   	 */
>   	drain_delayed_work(&i915->gt.idle_work);
>   
> -	intel_uc_suspend(i915);
> -
>   	/*
>   	 * Assert that we successfully flushed all the work and
>   	 * reset the GPU back to its idle, low power state.
>   	 */
> -	WARN_ON(i915->gt.awake);
> -	if (WARN_ON(!intel_engines_are_idle(i915)))
> -		i915_gem_set_wedged(i915); /* no hope, discard everything */
> +	GEM_BUG_ON(i915->gt.awake);
>   
>   	intel_runtime_pm_put(i915, wakeref);
>   	return 0;
> 

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

Regards,

Tvrtko


More information about the Intel-gfx mailing list