Re: [PATCH 4/4] drm/i915: "Race-to-idle" on switching to the kernel context

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

 



Quoting Chris Wilson (2018-05-22 16:08:30)
> During suspend we want to flush out all active contexts and their
> rendering. To do so we queue a request from the kernel's context, once
> we know that request is done, we know the GPU is completely idle. To
> speed up that switch bump the GPU clocks.
> 
> Switching to the kernel context prior to idling is also used to enforce
> a barrier before changing OA properties, and when evicting active
> rendering from the global GTT. All cases where we do want to
> race-to-idle.
> 
> v2: Limit the boosting to only the switch before suspend.
> 
> Signed-off-by: Chris Wilson <chris@xxxxxxxxxxxxxxxxxx>
> Cc: David Weinehall <david.weinehall@xxxxxxxxxxxxxxx>
> Cc: Mika Kuoppala <mika.kuoppala@xxxxxxxxx>
> Reviewed-by: Mika Kuoppala <mika.kuoppala@xxxxxxxxx> #v1
> Tested-by: David Weinehall <david.weinehall@xxxxxxxxxxxxxxx> #v1
> ---
>  drivers/gpu/drm/i915/i915_gem.c         | 11 ++++++-----
>  drivers/gpu/drm/i915/i915_gem_context.c | 15 ++++++++++++++-
>  drivers/gpu/drm/i915/i915_gem_context.h |  4 +++-
>  drivers/gpu/drm/i915/i915_gem_evict.c   |  2 +-
>  4 files changed, 24 insertions(+), 8 deletions(-)
> 
> diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c
> index a81aa124af26..37a6c9ec5d60 100644
> --- a/drivers/gpu/drm/i915/i915_gem.c
> +++ b/drivers/gpu/drm/i915/i915_gem.c
> @@ -3513,7 +3513,7 @@ i915_gem_idle_work_handler(struct work_struct *work)
>          * idle that implies a round trip through the retire worker).
>          */
>         mutex_lock(&dev_priv->drm.struct_mutex);
> -       i915_gem_switch_to_kernel_context(dev_priv);
> +       i915_gem_switch_to_kernel_context(dev_priv, 0);
>         mutex_unlock(&dev_priv->drm.struct_mutex);
>  
>         /*
> @@ -4958,7 +4958,8 @@ int i915_gem_suspend(struct drm_i915_private *dev_priv)
>          * not rely on its state.
>          */
>         if (!i915_terminally_wedged(&dev_priv->gpu_error)) {
> -               ret = i915_gem_switch_to_kernel_context(dev_priv);
> +               ret = i915_gem_switch_to_kernel_context(dev_priv,
> +                                                       I915_SWITCH_BOOST);
>                 if (ret)
>                         goto err_unlock;
>  
> @@ -5043,7 +5044,7 @@ void i915_gem_resume(struct drm_i915_private *i915)
>         intel_uc_resume(i915);
>  
>         /* Always reload a context for powersaving. */
> -       if (i915_gem_switch_to_kernel_context(i915))
> +       if (i915_gem_switch_to_kernel_context(i915, 0))
>                 goto err_wedged;
>  
>  out_unlock:
> @@ -5238,7 +5239,7 @@ static int __intel_engines_record_defaults(struct drm_i915_private *i915)
>                         goto err_active;
>         }
>  
> -       err = i915_gem_switch_to_kernel_context(i915);
> +       err = i915_gem_switch_to_kernel_context(i915, 0);
>         if (err)
>                 goto err_active;
>  
> @@ -5304,7 +5305,7 @@ static int __intel_engines_record_defaults(struct drm_i915_private *i915)
>          * request, ensure we are pointing at the kernel context and
>          * then remove it.
>          */
> -       if (WARN_ON(i915_gem_switch_to_kernel_context(i915)))
> +       if (WARN_ON(i915_gem_switch_to_kernel_context(i915, 0)))
>                 goto out_ctx;
>  
>         if (WARN_ON(i915_gem_wait_for_idle(i915, I915_WAIT_LOCKED)))
> diff --git a/drivers/gpu/drm/i915/i915_gem_context.c b/drivers/gpu/drm/i915/i915_gem_context.c
> index 3fe1212b0f7e..dce1a3d9f5e6 100644
> --- a/drivers/gpu/drm/i915/i915_gem_context.c
> +++ b/drivers/gpu/drm/i915/i915_gem_context.c
> @@ -605,7 +605,8 @@ static bool engine_has_idle_kernel_context(struct intel_engine_cs *engine)
>         return intel_engine_has_kernel_context(engine);
>  }
>  
> -int i915_gem_switch_to_kernel_context(struct drm_i915_private *i915)
> +int i915_gem_switch_to_kernel_context(struct drm_i915_private *i915,
> +                                     unsigned int flags)
>  {
>         struct intel_engine_cs *engine;
>         enum intel_engine_id id;
> @@ -636,6 +637,18 @@ int i915_gem_switch_to_kernel_context(struct drm_i915_private *i915)
>                                                                  I915_FENCE_GFP);
>                 }
>  
> +               /*
> +                * "Race-to-idle".
> +                *
> +                * Switching to the kernel context is often used a synchronous
> +                * step prior to idling, e.g. in suspend for flushing all
> +                * current operations to memory before sleeping. These we
> +                * want to complete as quickly as possible to avoid prolonged
> +                * stalls, so allow the gpu to boost to maximum clocks.
> +                */
> +               if (flags & I915_SWITCH_BOOST)
> +                       gen6_rps_boost(rq, NULL);
> +

Hmm, I thinking that adding this bit to wait_for_idle works better with
the parking to kernel context on idling. As after that patch, we are
less likely to need to add a switch-to-kernel-context on suspend and so
miss boosting the outstanding work.
-Chris
_______________________________________________
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