[Intel-gfx] [PATCH] drm/i915/display: Fix warning callstack for imbalance wakeref
Golani, Mitulkumar Ajitkumar
mitulkumar.ajitkumar.golani at intel.com
Tue Aug 23 12:39:08 UTC 2022
Hi Imre,
> On Fri, Aug 12, 2022 at 10:17:24AM +0530, Mitul Golani wrote:
> > While executing i915_selftest, wakeref imbalance warning is seen with
> > i915_selftest failure.
> >
> > When device is already suspended, wakeref is acquired by
> > disable_rpm_wakeref_asserts and rpm ownership is transferred back to
> > core. During this case wakeref_count will not be zero.
> > Once driver is unregistered, this wakeref is released with
> > enable_rpm_wakeref_asserts and balancing wakeref_count acquired by
> > driver.
> >
> > This patch will fix the warning callstack by adding check if device is
> > already suspended and rpm ownership transfer is going on.
> >
> > Signed-off-by: Mitul Golani <mitulkumar.ajitkumar.golani at intel.com>
> > ---
> > drivers/gpu/drm/i915/i915_driver.c | 8 +++++++-
> > 1 file changed, 7 insertions(+), 1 deletion(-)
> >
> > diff --git a/drivers/gpu/drm/i915/i915_driver.c
> > b/drivers/gpu/drm/i915/i915_driver.c
> > index deb8a8b76965..6530a8680cfd 100644
> > --- a/drivers/gpu/drm/i915/i915_driver.c
> > +++ b/drivers/gpu/drm/i915/i915_driver.c
> > @@ -1670,7 +1670,13 @@ static int intel_runtime_resume(struct device
> > *kdev)
> >
> > drm_dbg(&dev_priv->drm, "Resuming device\n");
> >
> > - drm_WARN_ON_ONCE(&dev_priv->drm, atomic_read(&rpm-
> >wakeref_count));
> > + /*
> > + * When device is already suspended, Wakeref is acquired by
> disable_rpm_wakeref_asserts
> > + * and rpm ownership is transferred back to core. During this case
> wakeref_count will
> > + * not be zero. Once driver is unregistered, this wakeref is released
> with
> > + * enable_rpm_wakeref_asserts and balancing wakeref_count
> acquired by driver.
> > + */
> > + drm_WARN_ON_ONCE(&dev_priv->drm, atomic_read(&rpm-
> >wakeref_count) &&
> > +!rpm->suspended);
>
> I can't see how disable/enable_rpm_wakeref_asserts() can lead to this
> WARN. They are always called in pairs both in intel_runtime_suspend() and
> intel_runtime_resume(), leaving rpm->wakeref_count unchanged.
>
> The root cause is probably somewhere else, incrementing
> rpm->wakeref_count without runtime resuming the device.
>
> The WARN() condition is corret, we shouldn't get here with a non-zero
> wakeref_count. rpm->suspended - set in intel_runtime_suspend() and
> cleared in intel_runtime_resume() - should be always false here, so the
> above change would just disable the WARN in all cases.
>
Yes, in case of DG2, after device is suspended, i915_driver_remove is being called.
Here driver is taking wakeref with disable_rpm_wakeref_asserts when device was not resumed.
As per logs,
[ 395.872971] i915 0000:03:00.0: [drm:intel_runtime_suspend [i915]] Suspending device
...
[ 403.553235] i915_driver_remove: START wakeref=0
[ 403.553288] i915_driver_remove: before unregister i915 wakeref=65537 (Wakeref Taken)
[ 403.566086] i915 0000:03:00.0: [drm:intel_runtime_resume [i915]] Resuming device (Later Resuming Device)
Pushed new change with : https://patchwork.freedesktop.org/series/107211/#rev5
> > disable_rpm_wakeref_asserts(rpm);
> >
> > intel_opregion_notify_adapter(dev_priv, PCI_D0);
> > --
> > 2.25.1
> >
More information about the Intel-gfx
mailing list