mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-05-11 09:43:54 -04:00
drm/i915/dmc_wl: Check for non-zero refcount in release work
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
This commit is contained in:
committed by
Matt Roper
parent
b2ba4632b9
commit
f7b12bf296
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user