drm/i915/dmc_wl: Check for non-zero refcount in release work
authorGustavo Sousa <gustavo.sousa@intel.com>
Fri, 8 Nov 2024 12:57:09 +0000 (09:57 -0300)
committerMatt Roper <matthew.d.roper@intel.com>
Fri, 8 Nov 2024 17:53:59 +0000 (09:53 -0800)
When the DMC wakelock refcount reaches zero, we know that there are no
users and that we can do the actual release operation on the hardware,
which is queued with a delayed work. The idea of the delayed work is to
avoid performing the release if a new lock user appears (i.e. refcount
gets incremented) in a very short period of time.

Based on the above, the release work should bail out if refcount is
non-zero (meaning new lock users appeared in the meantime), but our
current code actually does the opposite: it bails when refcount is zero.
That means that the wakelock is not released when it should be; and
that, when the work is not canceled in time, it ends up being releasing
when it should not.

Fix that by inverting the condition.

Reviewed-by: Luca Coelho <luciano.coelho@intel.com>
Signed-off-by: Gustavo Sousa <gustavo.sousa@intel.com>
Signed-off-by: Matt Roper <matthew.d.roper@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20241108130218.24125-5-gustavo.sousa@intel.com
drivers/gpu/drm/i915/display/intel_dmc_wl.c

index 9255505..a0a0607 100644 (file)
@@ -76,8 +76,11 @@ static void intel_dmc_wl_work(struct work_struct *work)
 
        spin_lock_irqsave(&wl->lock, flags);
 
-       /* Bail out if refcount reached zero while waiting for the spinlock */
-       if (!refcount_read(&wl->refcount))
+       /*
+        * Bail out if refcount became non-zero while waiting for the spinlock,
+        * meaning that the lock is now taken again.
+        */
+       if (refcount_read(&wl->refcount))
                goto out_unlock;
 
        __intel_de_rmw_nowl(display, DMC_WAKELOCK1_CTL, DMC_WAKELOCK_CTL_REQ, 0);