[PATCH 1/3] drm/i915: don't block resume on fb console resume

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

 



Reviewed-by: Rodrigo Vivi <rodrigo.vivi at gmail.com>

On Fri, Oct 26, 2012 at 3:08 PM, Jesse Barnes <jbarnes at virtuousgeek.org> wrote:
> The console lock can be contended, so rather than prevent other drivers
> after us from being held up, queue the console suspend into the global
> work queue that can happen anytime.  I've measured this to take around
> 200ms on my T420.  Combined with the ring freq/turbo change, we should
> save almost 1/2 a second on resume.
>
> Signed-off-by: Jesse Barnes <jbarnes at virtuousgeek.org>
> ---
>  drivers/gpu/drm/i915/i915_dma.c |    3 +++
>  drivers/gpu/drm/i915/i915_drv.c |   17 ++++++++++++++---
>  drivers/gpu/drm/i915/i915_drv.h |    7 +++++++
>  3 files changed, 24 insertions(+), 3 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/i915_dma.c b/drivers/gpu/drm/i915/i915_dma.c
> index d04facb..14526dc 100644
> --- a/drivers/gpu/drm/i915/i915_dma.c
> +++ b/drivers/gpu/drm/i915/i915_dma.c
> @@ -1329,6 +1329,8 @@ static int i915_load_modeset_init(struct drm_device *dev)
>
>         intel_modeset_gem_init(dev);
>
> +       INIT_WORK(&dev_priv->console_resume_work, intel_console_resume);
> +
>         ret = drm_irq_install(dev);
>         if (ret)
>                 goto cleanup_gem;
> @@ -1723,6 +1725,7 @@ int i915_driver_unload(struct drm_device *dev)
>         if (drm_core_check_feature(dev, DRIVER_MODESET)) {
>                 intel_fbdev_fini(dev);
>                 intel_modeset_cleanup(dev);
> +               cancel_work_sync(&dev_priv->console_resume_work);
>
>                 /*
>                  * free the memory space allocated for the child device
> diff --git a/drivers/gpu/drm/i915/i915_drv.c b/drivers/gpu/drm/i915/i915_drv.c
> index 59dc481..6d1fb51 100644
> --- a/drivers/gpu/drm/i915/i915_drv.c
> +++ b/drivers/gpu/drm/i915/i915_drv.c
> @@ -519,6 +519,18 @@ int i915_suspend(struct drm_device *dev, pm_message_t state)
>         return 0;
>  }
>
> +void intel_console_resume(struct work_struct *work)
> +{
> +       struct drm_i915_private *dev_priv =
> +               container_of(work, struct drm_i915_private,
> +                            console_resume_work);
> +       struct drm_device *dev = dev_priv->dev;
> +
> +       console_lock();
> +       intel_fbdev_set_suspend(dev, 0);
> +       console_unlock();
> +}
> +
>  static int i915_drm_thaw(struct drm_device *dev)
>  {
>         struct drm_i915_private *dev_priv = dev->dev_private;
> @@ -555,9 +567,8 @@ static int i915_drm_thaw(struct drm_device *dev)
>
>         dev_priv->modeset_on_lid = 0;
>
> -       console_lock();
> -       intel_fbdev_set_suspend(dev, 0);
> -       console_unlock();
> +       schedule_work(&dev_priv->console_resume_work);
> +
>         return error;
>  }
>
> diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
> index 2fcf284..a5b0456 100644
> --- a/drivers/gpu/drm/i915/i915_drv.h
> +++ b/drivers/gpu/drm/i915/i915_drv.h
> @@ -453,6 +453,12 @@ typedef struct drm_i915_private {
>         u32 hotplug_supported_mask;
>         struct work_struct hotplug_work;
>
> +       /*
> +        * The console may be contended at resume, but we don't
> +        * want it to block on it.
> +        */
> +       struct work_struct console_resume_work;
> +
>         int num_pipe;
>         int num_pch_pll;
>
> @@ -1253,6 +1259,7 @@ extern unsigned long i915_mch_val(struct drm_i915_private *dev_priv);
>  extern unsigned long i915_gfx_val(struct drm_i915_private *dev_priv);
>  extern void i915_update_gfx_val(struct drm_i915_private *dev_priv);
>
> +extern void intel_console_resume(struct work_struct *work);
>
>  /* i915_irq.c */
>  void i915_hangcheck_elapsed(unsigned long data);
> --
> 1.7.9.5
>
> _______________________________________________
> Intel-gfx mailing list
> Intel-gfx at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/intel-gfx



-- 
Rodrigo Vivi
Blog: http://blog.vivi.eng.br


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