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@xxxxxxxxx> > > --- > > 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 > >