On Fri, Nov 18, 2016 at 10:37:30AM +0000, Chris Wilson wrote: > On Fri, Nov 18, 2016 at 12:06:03PM +0200, David Weinehall wrote: > > Benchmarking shows that on resume we spend quite a bit of time > > just taking and dropping these references, leaving us two options; > > either rewriting the code not to take these references more than > > once, which would be a rather invasive change since the involved > > functions are used from other places, or to optimise > > intel_runtime_pm_{get,put}(). This patch does the latter. > > Initial benchmarking indicate improvements of a couple > > of milliseconds on resume. > > > > Original patch by Chris, with slight fixes by me. > > > > Signed-off-by: David Weinehall <david.weinehall@xxxxxxxxxxxxxxx> > > CC: Chris Wilson <chris@xxxxxxxxxxxxxxxxxx> > > --- > > drivers/gpu/drm/i915/intel_runtime_pm.c | 12 ++++++++++++ > > 1 file changed, 12 insertions(+) > > > > diff --git a/drivers/gpu/drm/i915/intel_runtime_pm.c b/drivers/gpu/drm/i915/intel_runtime_pm.c > > index 356c662ad453..4bf279023b39 100644 > > --- a/drivers/gpu/drm/i915/intel_runtime_pm.c > > +++ b/drivers/gpu/drm/i915/intel_runtime_pm.c > > @@ -2632,6 +2632,9 @@ void intel_runtime_pm_get(struct drm_i915_private *dev_priv) > > struct pci_dev *pdev = dev_priv->drm.pdev; > > struct device *kdev = &pdev->dev; > > > > + if (atomic_inc_not_zero(&dev_priv->pm.wakeref_count)) > > + return; > > + > > pm_runtime_get_sync(kdev); > > > > atomic_inc(&dev_priv->pm.wakeref_count); > > @@ -2653,6 +2656,9 @@ bool intel_runtime_pm_get_if_in_use(struct drm_i915_private *dev_priv) > > struct pci_dev *pdev = dev_priv->drm.pdev; > > struct device *kdev = &pdev->dev; > > > > + if (atomic_inc_not_zero(&dev_priv->pm.wakeref_count)) > > + return; > > + > > if (IS_ENABLED(CONFIG_PM)) { > > int ret = pm_runtime_get_if_in_use(kdev); > > > > @@ -2695,6 +2701,9 @@ void intel_runtime_pm_get_noresume(struct drm_i915_private *dev_priv) > > struct pci_dev *pdev = dev_priv->drm.pdev; > > struct device *kdev = &pdev->dev; > > > > + if (atomic_inc_not_zero(&dev_priv->pm.wakeref_count)) > > + return; > > + > > assert_rpm_wakelock_held(dev_priv); > > pm_runtime_get_noresume(kdev); > > > > @@ -2714,6 +2723,9 @@ void intel_runtime_pm_put(struct drm_i915_private *dev_priv) > > struct pci_dev *pdev = dev_priv->drm.pdev; > > struct device *kdev = &pdev->dev; > > > > + if (!atomic_dec_and_test(&dev_priv->pm.wakeref_count)) > > + return; > > + > > assert_rpm_wakelock_held(dev_priv); > > atomic_dec(&dev_priv->pm.wakeref_count); > > Have to remove this dec. Time to retest ;-) Will retest with that (and fix the return-type error). Kind regards, David _______________________________________________ Intel-gfx mailing list Intel-gfx@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/intel-gfx