]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
drm/msm/vma: Avoid lock in VM_BIND fence signaling path
authorRob Clark <robin.clark@oss.qualcomm.com>
Mon, 16 Mar 2026 18:44:42 +0000 (11:44 -0700)
committerRob Clark <robin.clark@oss.qualcomm.com>
Tue, 31 Mar 2026 20:47:27 +0000 (13:47 -0700)
Use msm_gem_unpin_active(), similar to what is used in the GEM_SUBMIT
path.  This avoids needing to hold the obj lock, and the end result is
the same.  (As with GEM_SUBMIT, we know the fence isn't signaled yet.)

Reported-by: Akhil P Oommen <akhilpo@oss.qualcomm.com>
Fixes: 2e6a8a1fe2b2 ("drm/msm: Add VM_BIND ioctl")
Signed-off-by: Rob Clark <robin.clark@oss.qualcomm.com>
Patchwork: https://patchwork.freedesktop.org/patch/712230/
Message-ID: <20260316184442.673558-1-robin.clark@oss.qualcomm.com>

drivers/gpu/drm/msm/msm_gem.c
drivers/gpu/drm/msm/msm_gem_vma.c

index da74f1413f94390f5d920516c50ab38399c4ff2a..74636646d80e2ed583fb653a4d43abae7c4dd6a7 100644 (file)
@@ -507,8 +507,11 @@ void msm_gem_unpin_locked(struct drm_gem_object *obj)
  */
 void msm_gem_unpin_active(struct drm_gem_object *obj)
 {
+       struct msm_drm_private *priv = obj->dev->dev_private;
        struct msm_gem_object *msm_obj = to_msm_bo(obj);
 
+       GEM_WARN_ON(!mutex_is_locked(&priv->lru.lock));
+
        msm_obj->pin_count--;
        GEM_WARN_ON(msm_obj->pin_count < 0);
        update_lru_active(obj);
index 3a6c435d5105fcacd0d169b294ba34875f270767..1c6b0920c0d8c445349857cf6875703fecbf4f3a 100644 (file)
@@ -696,6 +696,7 @@ static struct dma_fence *
 msm_vma_job_run(struct drm_sched_job *_job)
 {
        struct msm_vm_bind_job *job = to_msm_vm_bind_job(_job);
+       struct msm_drm_private *priv = job->vm->drm->dev_private;
        struct msm_gem_vm *vm = to_msm_vm(job->vm);
        struct drm_gem_object *obj;
        int ret = vm->unusable ? -EINVAL : 0;
@@ -738,12 +739,14 @@ msm_vma_job_run(struct drm_sched_job *_job)
        if (ret)
                msm_gem_vm_unusable(job->vm);
 
+       mutex_lock(&priv->lru.lock);
+
        job_foreach_bo (obj, job) {
-               msm_gem_lock(obj);
-               msm_gem_unpin_locked(obj);
-               msm_gem_unlock(obj);
+               msm_gem_unpin_active(obj);
        }
 
+       mutex_unlock(&priv->lru.lock);
+
        /* VM_BIND ops are synchronous, so no fence to wait on: */
        return NULL;
 }