This patch will likely produce much fewer warnings, but perhaps hide some bugs in the driver. I believe it's a good starting point however to find the really serious issues first.
Goal is to hide warnings if the refcount for the forcewake "lock" is not zero Signed-off-by: Ben Widawsky <b...@bwidawsk.net> --- drivers/gpu/drm/i915/i915_drv.c | 14 ++++++++++---- 1 files changed, 10 insertions(+), 4 deletions(-) diff --git a/drivers/gpu/drm/i915/i915_drv.c b/drivers/gpu/drm/i915/i915_drv.c index fcd5c9a..33341d4 100644 --- a/drivers/gpu/drm/i915/i915_drv.c +++ b/drivers/gpu/drm/i915/i915_drv.c @@ -286,9 +286,14 @@ void gen6_gt_force_wake_get(struct drm_i915_private *dev_priv) * immediately. Not having the lock causes a race, but all bets are off * when using forced forcewake, which should only be touched through * root-only entry in debugfs. + * + * Intelligent users of the interface may do a force_wake_get() followed + * by many register reads and writes, knowing that the reference count + * is already incremented. So we do not want to warn on those. */ - WARN_ON(!mutex_is_locked(&dev_priv->dev->struct_mutex) && - !atomic_read(&dev_priv->forcewake_force)); + WARN_ON((!mutex_is_locked(&dev_priv->dev->struct_mutex) && + !dev_priv->forcewake_count) && + !atomic_read(&dev_priv->forcewake_force)); if (dev_priv->forcewake_count++ == 0) __gen6_gt_force_wake_get(dev_priv); @@ -302,8 +307,9 @@ static void __gen6_gt_force_wake_put(struct drm_i915_private *dev_priv) void gen6_gt_force_wake_put(struct drm_i915_private *dev_priv) { - WARN_ON(!mutex_is_locked(&dev_priv->dev->struct_mutex) && - !atomic_read(&dev_priv->forcewake_force)); + WARN_ON((!mutex_is_locked(&dev_priv->dev->struct_mutex) && + !dev_priv->forcewake_count) && + !atomic_read(&dev_priv->forcewake_force)); if (--dev_priv->forcewake_count == 0) __gen6_gt_force_wake_put(dev_priv); -- 1.7.3.4 _______________________________________________ Intel-gfx mailing list Intel-gfx@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/intel-gfx