[PATCH 23/23] TEST: drm/i915: mutex-less reset engine
Michel Thierry
michel.thierry at intel.com
Wed Apr 5 17:23:49 UTC 2017
It can't be that simple.
Signed-off-by: Michel Thierry <michel.thierry at intel.com>
---
drivers/gpu/drm/i915/i915_drv.c | 21 ++++++++++++++++++---
drivers/gpu/drm/i915/i915_irq.c | 20 ++------------------
2 files changed, 20 insertions(+), 21 deletions(-)
diff --git a/drivers/gpu/drm/i915/i915_drv.c b/drivers/gpu/drm/i915/i915_drv.c
index 032f08316835..7f222e2d8bea 100644
--- a/drivers/gpu/drm/i915/i915_drv.c
+++ b/drivers/gpu/drm/i915/i915_drv.c
@@ -1887,7 +1887,6 @@ int i915_reset_engine(struct intel_engine_cs *engine)
struct drm_i915_private *dev_priv = engine->i915;
struct i915_gpu_error *error = &dev_priv->gpu_error;
- lockdep_assert_held(&dev_priv->drm.struct_mutex);
GEM_BUG_ON(!test_bit(I915_RESET_BACKOFF, &error->flags));
if (!test_and_clear_bit(I915_RESET_HANDOFF, &error->flags))
@@ -1990,7 +1989,7 @@ int i915_reset_engine(struct intel_engine_cs *engine)
*/
void i915_reset(struct drm_i915_private *dev_priv, u32 engine_mask)
{
- /* try engine reset first */
+ /* try engine reset first; look mom, no mutex! */
if (intel_has_reset_engine(dev_priv) &&
!(engine_mask & (engine_mask - 1))) {
struct intel_engine_cs *engine =
@@ -2003,7 +2002,23 @@ void i915_reset(struct drm_i915_private *dev_priv, u32 engine_mask)
}
reset_chip:
- i915_reset_chip(dev_priv);
+ do {
+ /*
+ * All state reset _must_ be completed before we update the
+ * reset counter, for otherwise waiters might miss the reset
+ * pending state and not properly drop locks, resulting in
+ * deadlocks with the reset work.
+ */
+ if (mutex_trylock(&dev_priv->drm.struct_mutex)) {
+ i915_reset_chip(dev_priv);
+ mutex_unlock(&dev_priv->drm.struct_mutex);
+ }
+
+ /* We need to wait for anyone holding the lock to wakeup */
+ } while (wait_on_bit_timeout(&dev_priv->gpu_error.flags,
+ I915_RESET_HANDOFF,
+ TASK_UNINTERRUPTIBLE,
+ HZ));
}
static int i915_pm_suspend(struct device *kdev)
diff --git a/drivers/gpu/drm/i915/i915_irq.c b/drivers/gpu/drm/i915/i915_irq.c
index 6543e77e0621..cee7cddff25f 100644
--- a/drivers/gpu/drm/i915/i915_irq.c
+++ b/drivers/gpu/drm/i915/i915_irq.c
@@ -2668,24 +2668,8 @@ static void i915_reset_and_wakeup(struct drm_i915_private *dev_priv)
set_bit(I915_RESET_HANDOFF, &dev_priv->gpu_error.flags);
wake_up_all(&dev_priv->gpu_error.wait_queue);
- do {
- /*
- * All state reset _must_ be completed before we update the
- * reset counter, for otherwise waiters might miss the reset
- * pending state and not properly drop locks, resulting in
- * deadlocks with the reset work.
- */
- if (mutex_trylock(&dev_priv->drm.struct_mutex)) {
- i915_reset(dev_priv,
- dev_priv->gpu_error.reset_engine_mask);
- mutex_unlock(&dev_priv->drm.struct_mutex);
- }
-
- /* We need to wait for anyone holding the lock to wakeup */
- } while (wait_on_bit_timeout(&dev_priv->gpu_error.flags,
- I915_RESET_HANDOFF,
- TASK_UNINTERRUPTIBLE,
- HZ));
+ i915_reset(dev_priv,
+ dev_priv->gpu_error.reset_engine_mask);
intel_finish_reset(dev_priv);
--
2.11.0
More information about the Intel-gfx-trybot
mailing list