diff mbox

[5/7] drm/i915: Error checks in gen6_set_rps

Message ID 1347072225-10654-6-git-send-email-ben@bwidawsk.net (mailing list archive)
State Accepted
Headers show

Commit Message

Ben Widawsky Sept. 8, 2012, 2:43 a.m. UTC
With the new "standardized" sysfs interfaces we need to be a bit more
careful about setting the RPS values.

Because the sysfs code and the rps workqueue can run at the same time,
if the sysfs setter wins the race to the mutex, the workqueue can come
in and set a value which is out of range (ie. we're no longer protecting
by RPINTLIM).

I was not able to actually make this error occur in testing.

Signed-off-by: Ben Widawsky <ben@bwidawsk.net>
---
 drivers/gpu/drm/i915/i915_irq.c | 8 +++++++-
 drivers/gpu/drm/i915/intel_pm.c | 2 ++
 2 files changed, 9 insertions(+), 1 deletion(-)

Comments

Chris Wilson Sept. 9, 2012, 6:25 p.m. UTC | #1
On Fri,  7 Sep 2012 19:43:42 -0700, Ben Widawsky <ben@bwidawsk.net> wrote:
> With the new "standardized" sysfs interfaces we need to be a bit more
> careful about setting the RPS values.
> 
> Because the sysfs code and the rps workqueue can run at the same time,
> if the sysfs setter wins the race to the mutex, the workqueue can come
> in and set a value which is out of range (ie. we're no longer protecting
> by RPINTLIM).
> 
> I was not able to actually make this error occur in testing.
> 
> Signed-off-by: Ben Widawsky <ben@bwidawsk.net>

Good catch, care to squeeze the comment into a single line ;-)
Reviewed-by: Chris Wilson <chris@chris-wilson.co.uk>
-Chris
Daniel Vetter Sept. 12, 2012, 9:37 p.m. UTC | #2
On Sun, Sep 09, 2012 at 07:25:40PM +0100, Chris Wilson wrote:
> On Fri,  7 Sep 2012 19:43:42 -0700, Ben Widawsky <ben@bwidawsk.net> wrote:
> > With the new "standardized" sysfs interfaces we need to be a bit more
> > careful about setting the RPS values.
> > 
> > Because the sysfs code and the rps workqueue can run at the same time,
> > if the sysfs setter wins the race to the mutex, the workqueue can come
> > in and set a value which is out of range (ie. we're no longer protecting
> > by RPINTLIM).
> > 
> > I was not able to actually make this error occur in testing.
> > 
> > Signed-off-by: Ben Widawsky <ben@bwidawsk.net>
> 
> Good catch, care to squeeze the comment into a single line ;-)
> Reviewed-by: Chris Wilson <chris@chris-wilson.co.uk>
Applied all patches to dinq up to this one here, thanks.
-Daniel
diff mbox

Patch

diff --git a/drivers/gpu/drm/i915/i915_irq.c b/drivers/gpu/drm/i915/i915_irq.c
index d601013..e34b7d4 100644
--- a/drivers/gpu/drm/i915/i915_irq.c
+++ b/drivers/gpu/drm/i915/i915_irq.c
@@ -382,7 +382,13 @@  static void gen6_pm_rps_work(struct work_struct *work)
 	else
 		new_delay = dev_priv->rps.cur_delay - 1;
 
-	gen6_set_rps(dev_priv->dev, new_delay);
+	/* sysfs frequency interfaces may have snuck in while servicing the
+	 * interrupt
+	 */
+	if (!(new_delay > dev_priv->rps.max_delay ||
+	      new_delay < dev_priv->rps.min_delay)) {
+		gen6_set_rps(dev_priv->dev, new_delay);
+	}
 
 	mutex_unlock(&dev_priv->dev->struct_mutex);
 }
diff --git a/drivers/gpu/drm/i915/intel_pm.c b/drivers/gpu/drm/i915/intel_pm.c
index 4e86037..82ca172 100644
--- a/drivers/gpu/drm/i915/intel_pm.c
+++ b/drivers/gpu/drm/i915/intel_pm.c
@@ -2324,6 +2324,8 @@  void gen6_set_rps(struct drm_device *dev, u8 val)
 	u32 limits = gen6_rps_limits(dev_priv, &val);
 
 	WARN_ON(!mutex_is_locked(&dev->struct_mutex));
+	WARN_ON(val > dev_priv->rps.max_delay);
+	WARN_ON(val < dev_priv->rps.min_delay);
 
 	if (val == dev_priv->rps.cur_delay)
 		return;