Chris Wilson <chris@xxxxxxxxxxxxxxxxxx> writes: > To make our adjustments to RPS requires taking a mutex and potentially > sleeping for an unknown duration - until we have completed our > adjustments further RPS interrupts are immaterial (they are based on > stale thresholds) and we can safely ignore them. > > Signed-off-by: Chris Wilson <chris@xxxxxxxxxxxxxxxxxx> > Cc: Mika Kuoppala <mika.kuoppala@xxxxxxxxxxxxxxx> Reviewed-by: Mika Kuoppala <mika.kuoppala@xxxxxxxxx> > --- > drivers/gpu/drm/i915/i915_irq.c | 28 +++++++++++++--------------- > 1 file changed, 13 insertions(+), 15 deletions(-) > > diff --git a/drivers/gpu/drm/i915/i915_irq.c b/drivers/gpu/drm/i915/i915_irq.c > index e8f4c78c4bdc..ab55a3ddafb3 100644 > --- a/drivers/gpu/drm/i915/i915_irq.c > +++ b/drivers/gpu/drm/i915/i915_irq.c > @@ -1149,30 +1149,21 @@ static void gen6_pm_rps_work(struct work_struct *work) > { > struct drm_i915_private *dev_priv = > container_of(work, struct drm_i915_private, rps.work); > - bool client_boost; > + bool client_boost = false; > int new_delay, adj, min, max; > - u32 pm_iir; > + u32 pm_iir = 0; > > spin_lock_irq(&dev_priv->irq_lock); > - /* Speed up work cancelation during disabling rps interrupts. */ > - if (!dev_priv->rps.interrupts_enabled) { > - spin_unlock_irq(&dev_priv->irq_lock); > - return; > + if (dev_priv->rps.interrupts_enabled) { > + pm_iir = fetch_and_zero(&dev_priv->rps.pm_iir); > + client_boost = fetch_and_zero(&dev_priv->rps.client_boost); > } > - > - pm_iir = dev_priv->rps.pm_iir; > - dev_priv->rps.pm_iir = 0; > - /* Make sure not to corrupt PMIMR state used by ringbuffer on GEN6 */ > - gen6_unmask_pm_irq(dev_priv, dev_priv->pm_rps_events); > - client_boost = dev_priv->rps.client_boost; > - dev_priv->rps.client_boost = false; > spin_unlock_irq(&dev_priv->irq_lock); > > /* Make sure we didn't queue anything we're not going to process. */ > WARN_ON(pm_iir & ~dev_priv->pm_rps_events); > - > if ((pm_iir & dev_priv->pm_rps_events) == 0 && !client_boost) > - return; > + goto out; > > mutex_lock(&dev_priv->rps.hw_lock); > > @@ -1229,6 +1220,13 @@ static void gen6_pm_rps_work(struct work_struct *work) > } > > mutex_unlock(&dev_priv->rps.hw_lock); > + > +out: > + /* Make sure not to corrupt PMIMR state used by ringbuffer on GEN6 */ > + spin_lock_irq(&dev_priv->irq_lock); > + if (dev_priv->rps.interrupts_enabled) > + gen6_unmask_pm_irq(dev_priv, dev_priv->pm_rps_events); > + spin_unlock_irq(&dev_priv->irq_lock); > } > > > -- > 2.11.0 _______________________________________________ Intel-gfx mailing list Intel-gfx@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/intel-gfx