]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
drm/msm: Add VMA unmap reason
authorRob Clark <robdclark@chromium.org>
Sun, 29 Jun 2025 20:13:20 +0000 (13:13 -0700)
committerRob Clark <robin.clark@oss.qualcomm.com>
Sat, 5 Jul 2025 00:48:38 +0000 (17:48 -0700)
Make the VM log a bit more useful by providing a reason for the unmap
(ie. closing VM vs evict/purge, etc)

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/661527/

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

index 77fdf53d3e33a692531d5dab0dc0e08e0fe59d88..e3ccda777ef36ea56b0b522d4d565f76315af2f1 100644 (file)
@@ -43,7 +43,8 @@ static int msm_gem_open(struct drm_gem_object *obj, struct drm_file *file)
        return 0;
 }
 
-static void put_iova_spaces(struct drm_gem_object *obj, struct drm_gpuvm *vm, bool close);
+static void put_iova_spaces(struct drm_gem_object *obj, struct drm_gpuvm *vm,
+                           bool close, const char *reason);
 
 static void detach_vm(struct drm_gem_object *obj, struct drm_gpuvm *vm)
 {
@@ -57,7 +58,7 @@ static void detach_vm(struct drm_gem_object *obj, struct drm_gpuvm *vm)
                drm_gpuvm_bo_for_each_va (vma, vm_bo) {
                        if (vma->vm != vm)
                                continue;
-                       msm_gem_vma_unmap(vma);
+                       msm_gem_vma_unmap(vma, "detach");
                        msm_gem_vma_close(vma);
                        break;
                }
@@ -97,7 +98,7 @@ static void msm_gem_close(struct drm_gem_object *obj, struct drm_file *file)
                              MAX_SCHEDULE_TIMEOUT);
 
        msm_gem_lock_vm_and_obj(&exec, obj, ctx->vm);
-       put_iova_spaces(obj, ctx->vm, true);
+       put_iova_spaces(obj, ctx->vm, true, "close");
        detach_vm(obj, ctx->vm);
        drm_exec_fini(&exec);     /* drop locks */
 }
@@ -425,7 +426,8 @@ static struct drm_gpuva *lookup_vma(struct drm_gem_object *obj,
  * mapping.
  */
 static void
-put_iova_spaces(struct drm_gem_object *obj, struct drm_gpuvm *vm, bool close)
+put_iova_spaces(struct drm_gem_object *obj, struct drm_gpuvm *vm,
+               bool close, const char *reason)
 {
        struct drm_gpuvm_bo *vm_bo, *tmp;
 
@@ -440,7 +442,7 @@ put_iova_spaces(struct drm_gem_object *obj, struct drm_gpuvm *vm, bool close)
                drm_gpuvm_bo_get(vm_bo);
 
                drm_gpuvm_bo_for_each_va_safe (vma, vmatmp, vm_bo) {
-                       msm_gem_vma_unmap(vma);
+                       msm_gem_vma_unmap(vma, reason);
                        if (close)
                                msm_gem_vma_close(vma);
                }
@@ -617,7 +619,7 @@ static int clear_iova(struct drm_gem_object *obj,
        if (!vma)
                return 0;
 
-       msm_gem_vma_unmap(vma);
+       msm_gem_vma_unmap(vma, NULL);
        msm_gem_vma_close(vma);
 
        return 0;
@@ -829,7 +831,7 @@ void msm_gem_purge(struct drm_gem_object *obj)
        GEM_WARN_ON(!is_purgeable(msm_obj));
 
        /* Get rid of any iommu mapping(s): */
-       put_iova_spaces(obj, NULL, false);
+       put_iova_spaces(obj, NULL, false, "purge");
 
        msm_gem_vunmap(obj);
 
@@ -867,7 +869,7 @@ void msm_gem_evict(struct drm_gem_object *obj)
        GEM_WARN_ON(is_unevictable(msm_obj));
 
        /* Get rid of any iommu mapping(s): */
-       put_iova_spaces(obj, NULL, false);
+       put_iova_spaces(obj, NULL, false, "evict");
 
        drm_vma_node_unmap(&obj->vma_node, dev->anon_inode->i_mapping);
 
@@ -1079,7 +1081,7 @@ static void msm_gem_free_object(struct drm_gem_object *obj)
                                drm_exec_retry_on_contention(&exec);
                        }
                }
-               put_iova_spaces(obj, NULL, true);
+               put_iova_spaces(obj, NULL, true, "free");
                drm_exec_fini(&exec);     /* drop locks */
        }
 
index 062d1b5477d65a391711e13d99bbaad7e3045be2..ce5e90ba935b4562f4cf75f66dcc5e53de9c2a64 100644 (file)
@@ -168,7 +168,7 @@ struct msm_gem_vma {
 struct drm_gpuva *
 msm_gem_vma_new(struct drm_gpuvm *vm, struct drm_gem_object *obj,
                u64 offset, u64 range_start, u64 range_end);
-void msm_gem_vma_unmap(struct drm_gpuva *vma);
+void msm_gem_vma_unmap(struct drm_gpuva *vma, const char *reason);
 int msm_gem_vma_map(struct drm_gpuva *vma, int prot, struct sg_table *sgt);
 void msm_gem_vma_close(struct drm_gpuva *vma);
 
index eccefdb9ebc3776547b619b9e845a24d4341cf1a..02491e7dd8165586af07310436d1418c2fba8ab0 100644 (file)
@@ -53,6 +53,9 @@ struct msm_vm_unmap_op {
        /** @range: size of region to unmap */
        uint64_t range;
 
+       /** @reason: The reason for the unmap */
+       const char *reason;
+
        /**
         * @queue_id: The id of the submitqueue the operation is performed
         * on, or zero for (in particular) UNMAP ops triggered outside of
@@ -242,7 +245,12 @@ vm_log(struct msm_gem_vm *vm, const char *op, uint64_t iova, uint64_t range, int
 static void
 vm_unmap_op(struct msm_gem_vm *vm, const struct msm_vm_unmap_op *op)
 {
-       vm_log(vm, "unmap", op->iova, op->range, op->queue_id);
+       const char *reason = op->reason;
+
+       if (!reason)
+               reason = "unmap";
+
+       vm_log(vm, reason, op->iova, op->range, op->queue_id);
 
        vm->mmu->funcs->unmap(vm->mmu, op->iova, op->range);
 }
@@ -257,7 +265,7 @@ vm_map_op(struct msm_gem_vm *vm, const struct msm_vm_map_op *op)
 }
 
 /* Actually unmap memory for the vma */
-void msm_gem_vma_unmap(struct drm_gpuva *vma)
+void msm_gem_vma_unmap(struct drm_gpuva *vma, const char *reason)
 {
        struct msm_gem_vm *vm = to_msm_vm(vma->vm);
        struct msm_gem_vma *msm_vma = to_msm_vma(vma);
@@ -277,6 +285,7 @@ void msm_gem_vma_unmap(struct drm_gpuva *vma)
        vm_unmap_op(vm, &(struct msm_vm_unmap_op){
                .iova = vma->va.addr,
                .range = vma->va.range,
+               .reason = reason,
        });
 
        if (!vm->managed)
@@ -863,7 +872,7 @@ msm_gem_vm_close(struct drm_gpuvm *gpuvm)
                                drm_exec_retry_on_contention(&exec);
                        }
 
-                       msm_gem_vma_unmap(vma);
+                       msm_gem_vma_unmap(vma, "close");
                        msm_gem_vma_close(vma);
 
                        if (obj) {