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