[Intel-gfx] [PATCH 1/4] drm/i915: fix ilk rc6 teardown locking
Ben Widawsky
ben at bwidawsk.net
Sat Mar 19 00:12:45 CET 2011
In the failure cases during rc6 initialization, both the power context
and render context may get !refcount without holding struct_mutex.
However, on rc6 disabling, the lock is held by the caller.
Added a simple parameter to control whether or not to acquire the lock.
Signed-off-by: Ben Widawsky <ben at bwidawsk.net>
---
drivers/gpu/drm/i915/intel_display.c | 14 ++++++++++----
1 files changed, 10 insertions(+), 4 deletions(-)
diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c
index 49fb54f..790af25 100644
--- a/drivers/gpu/drm/i915/intel_display.c
+++ b/drivers/gpu/drm/i915/intel_display.c
@@ -6541,10 +6541,13 @@ void intel_enable_clock_gating(struct drm_device *dev)
}
}
-static void ironlake_teardown_rc6(struct drm_device *dev)
+static void ironlake_teardown_rc6(struct drm_device *dev, bool need_lock)
{
struct drm_i915_private *dev_priv = dev->dev_private;
+ if (need_lock)
+ mutex_lock(&dev->struct_mutex);
+
if (dev_priv->renderctx) {
i915_gem_object_unpin(dev_priv->renderctx);
drm_gem_object_unreference(&dev_priv->renderctx->base);
@@ -6556,6 +6559,9 @@ static void ironlake_teardown_rc6(struct drm_device *dev)
drm_gem_object_unreference(&dev_priv->pwrctx->base);
dev_priv->pwrctx = NULL;
}
+
+ if (need_lock)
+ mutex_unlock(&dev->struct_mutex);
}
static void ironlake_disable_rc6(struct drm_device *dev)
@@ -6575,7 +6581,7 @@ static void ironlake_disable_rc6(struct drm_device *dev)
POSTING_READ(RSTDBYCTL);
}
- ironlake_teardown_rc6(dev);
+ ironlake_teardown_rc6(dev, false);
}
static int ironlake_setup_rc6(struct drm_device *dev)
@@ -6590,7 +6596,7 @@ static int ironlake_setup_rc6(struct drm_device *dev)
if (dev_priv->pwrctx == NULL)
dev_priv->pwrctx = intel_alloc_context_page(dev);
if (!dev_priv->pwrctx) {
- ironlake_teardown_rc6(dev);
+ ironlake_teardown_rc6(dev, true);
return -ENOMEM;
}
@@ -6618,7 +6624,7 @@ void ironlake_enable_rc6(struct drm_device *dev)
*/
ret = BEGIN_LP_RING(6);
if (ret) {
- ironlake_teardown_rc6(dev);
+ ironlake_teardown_rc6(dev, true);
return;
}
--
1.7.3.4
More information about the Intel-gfx
mailing list