]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
drm/msm: Collapse vma close and delete
authorRob Clark <robdclark@chromium.org>
Sun, 29 Jun 2025 20:12:52 +0000 (13:12 -0700)
committerRob Clark <robin.clark@oss.qualcomm.com>
Fri, 4 Jul 2025 18:09:44 +0000 (11:09 -0700)
This fits better drm_gpuvm/drm_gpuva.

Signed-off-by: Rob Clark <robdclark@chromium.org>
Signed-off-by: Rob Clark <robin.clark@oss.qualcomm.com>
Tested-by: Antonino Maniscalco <antomani103@gmail.com>
Reviewed-by: Antonino Maniscalco <antomani103@gmail.com>
Patchwork: https://patchwork.freedesktop.org/patch/661470/

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

index 9fa830209b1ed1c3bd9eac8284c3b8eeb799c6a1..7b043062883466472499cf9e11736e50055df430 100644 (file)
@@ -349,15 +349,6 @@ static struct msm_gem_vma *lookup_vma(struct drm_gem_object *obj,
        return NULL;
 }
 
-static void del_vma(struct msm_gem_vma *vma)
-{
-       if (!vma)
-               return;
-
-       list_del(&vma->list);
-       kfree(vma);
-}
-
 /*
  * If close is true, this also closes the VMA (releasing the allocated
  * iova range) in addition to removing the iommu mapping.  In the eviction
@@ -368,11 +359,11 @@ static void
 put_iova_spaces(struct drm_gem_object *obj, bool close)
 {
        struct msm_gem_object *msm_obj = to_msm_bo(obj);
-       struct msm_gem_vma *vma;
+       struct msm_gem_vma *vma, *tmp;
 
        msm_gem_assert_locked(obj);
 
-       list_for_each_entry(vma, &msm_obj->vmas, list) {
+       list_for_each_entry_safe(vma, tmp, &msm_obj->vmas, list) {
                if (vma->vm) {
                        msm_gem_vma_purge(vma);
                        if (close)
@@ -391,7 +382,7 @@ put_iova_vmas(struct drm_gem_object *obj)
        msm_gem_assert_locked(obj);
 
        list_for_each_entry_safe(vma, tmp, &msm_obj->vmas, list) {
-               del_vma(vma);
+               msm_gem_vma_close(vma);
        }
 }
 
@@ -556,7 +547,6 @@ static int clear_iova(struct drm_gem_object *obj,
 
        msm_gem_vma_purge(vma);
        msm_gem_vma_close(vma);
-       del_vma(vma);
 
        return 0;
 }
index 6d18364f321ce4b4c46c643096dc2b46fa45a2aa..ca29e81d79d2a1ff6af83d73813aeb969317ef76 100644 (file)
@@ -102,8 +102,10 @@ void msm_gem_vma_close(struct msm_gem_vma *vma)
        spin_unlock(&vm->lock);
 
        vma->iova = 0;
+       list_del(&vma->list);
 
        msm_gem_vm_put(vm);
+       kfree(vma);
 }
 
 /* Create a new vma and allocate an iova for it */