From mboxrd@z Thu Jan 1 00:00:00 1970 From: Imre Deak Subject: [PATCH 1/2] drm/i915: fix possible refcount leak when resetting forcewake Date: Fri, 6 Jun 2014 12:59:38 +0300 Message-ID: <1402048779-14902-1-git-send-email-imre.deak@intel.com> Mime-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Return-path: Received: from mga02.intel.com (mga02.intel.com [134.134.136.20]) by gabe.freedesktop.org (Postfix) with ESMTP id 50AF66EA48 for ; Fri, 6 Jun 2014 03:00:22 -0700 (PDT) List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: intel-gfx-bounces@lists.freedesktop.org Sender: "Intel-gfx" To: intel-gfx@lists.freedesktop.org List-Id: intel-gfx@lists.freedesktop.org If the timer putting the last forcewake refcount was pending and we canceled it, we'll leak the corresponding forcewake and RPM references. Signed-off-by: Imre Deak --- drivers/gpu/drm/i915/intel_uncore.c | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/drivers/gpu/drm/i915/intel_uncore.c b/drivers/gpu/drm/i915/intel_uncore.c index c90222d..389e235 100644 --- a/drivers/gpu/drm/i915/intel_uncore.c +++ b/drivers/gpu/drm/i915/intel_uncore.c @@ -299,9 +299,8 @@ static void vlv_force_wake_put(struct drm_i915_private *dev_priv, int fw_engine) spin_unlock_irqrestore(&dev_priv->uncore.lock, irqflags); } -static void gen6_force_wake_timer(unsigned long arg) +static void __gen6_force_wake_timer(struct drm_i915_private *dev_priv) { - struct drm_i915_private *dev_priv = (void *)arg; unsigned long irqflags; assert_device_not_suspended(dev_priv); @@ -316,12 +315,20 @@ static void gen6_force_wake_timer(unsigned long arg) intel_runtime_pm_put(dev_priv); } +static void gen6_force_wake_timer(unsigned long arg) +{ + struct drm_i915_private *dev_priv = (void *)arg; + + __gen6_force_wake_timer(dev_priv); +} + static void intel_uncore_forcewake_reset(struct drm_device *dev, bool restore) { struct drm_i915_private *dev_priv = dev->dev_private; unsigned long irqflags; - del_timer_sync(&dev_priv->uncore.force_wake_timer); + if (del_timer_sync(&dev_priv->uncore.force_wake_timer)) + __gen6_force_wake_timer(dev_priv); /* Hold uncore.lock across reset to prevent any register access * with forcewake not set correctly -- 1.8.4