Convert VM lookup paths to:

        PASID -> fpriv -> vm

Preserve existing VM root BO reference and revalidation logic.

Cc: Alex Deucher <[email protected]>
Cc: Christian König <[email protected]>
Signed-off-by: Srinivasan Shanmugam <[email protected]>
---
 drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c | 34 +++++++++++++++++---------
 1 file changed, 22 insertions(+), 12 deletions(-)

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
index 32719f31b6c9..462761259d5f 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
@@ -2463,12 +2463,14 @@ static void amdgpu_vm_destroy_task_info(struct kref 
*kref)
 static inline struct amdgpu_vm *
 amdgpu_vm_get_vm_from_pasid(struct amdgpu_device *adev, u32 pasid)
 {
+       struct amdgpu_fpriv *fpriv;
        struct amdgpu_vm *vm;
        unsigned long flags;
 
-       xa_lock_irqsave(&adev->vm_manager.pasids, flags);
-       vm = xa_load(&adev->vm_manager.pasids, pasid);
-       xa_unlock_irqrestore(&adev->vm_manager.pasids, flags);
+       amdgpu_pasid_lock(&flags);
+       fpriv = amdgpu_pasid_get_fpriv_locked(pasid);
+       vm = fpriv ? &fpriv->vm : NULL;
+       amdgpu_pasid_unlock(flags);
 
        return vm;
 }
@@ -2943,14 +2945,16 @@ struct amdgpu_vm *amdgpu_vm_lock_by_pasid(struct 
amdgpu_device *adev,
                                          u32 pasid, struct drm_exec *exec)
 {
        unsigned long irqflags;
+       struct amdgpu_fpriv *fpriv;
        struct amdgpu_bo *root;
        struct amdgpu_vm *vm;
        int r;
 
-       xa_lock_irqsave(&adev->vm_manager.pasids, irqflags);
-       vm = xa_load(&adev->vm_manager.pasids, pasid);
+       amdgpu_pasid_lock(&irqflags);
+       fpriv = amdgpu_pasid_get_fpriv_locked(pasid);
+       vm = fpriv ? &fpriv->vm : NULL;
        root = vm ? amdgpu_bo_ref(vm->root.bo) : NULL;
-       xa_unlock_irqrestore(&adev->vm_manager.pasids, irqflags);
+       amdgpu_pasid_unlock(irqflags);
 
        if (!root)
                return NULL;
@@ -2962,11 +2966,13 @@ struct amdgpu_vm *amdgpu_vm_lock_by_pasid(struct 
amdgpu_device *adev,
        }
 
        /* Double check that the VM still exists */
-       xa_lock_irqsave(&adev->vm_manager.pasids, irqflags);
-       vm = xa_load(&adev->vm_manager.pasids, pasid);
+       amdgpu_pasid_lock(&irqflags);
+       fpriv = amdgpu_pasid_get_fpriv_locked(pasid);
+       vm = fpriv ? &fpriv->vm : NULL;
        if (vm && vm->root.bo != root)
                vm = NULL;
-       xa_unlock_irqrestore(&adev->vm_manager.pasids, irqflags);
+       amdgpu_pasid_unlock(irqflags);
+
        if (!vm) {
                drm_exec_unlock_obj(exec, &root->tbo.base);
                amdgpu_bo_unref(&root);
@@ -3163,12 +3169,15 @@ void amdgpu_vm_update_fault_cache(struct amdgpu_device 
*adev,
                                  uint32_t status,
                                  unsigned int vmhub)
 {
+       struct amdgpu_fpriv *fpriv;
        struct amdgpu_vm *vm;
        unsigned long flags;
 
-       xa_lock_irqsave(&adev->vm_manager.pasids, flags);
+       amdgpu_pasid_lock(&flags);
+
+       fpriv = amdgpu_pasid_get_fpriv_locked(pasid);
+       vm = fpriv ? &fpriv->vm : NULL;
 
-       vm = xa_load(&adev->vm_manager.pasids, pasid);
        /* Don't update the fault cache if status is 0.  In the multiple
         * fault case, subsequent faults will return a 0 status which is
         * useless for userspace and replaces the useful fault status, so
@@ -3201,7 +3210,8 @@ void amdgpu_vm_update_fault_cache(struct amdgpu_device 
*adev,
                        WARN_ONCE(1, "Invalid vmhub %u\n", vmhub);
                }
        }
-       xa_unlock_irqrestore(&adev->vm_manager.pasids, flags);
+
+       amdgpu_pasid_unlock(flags);
 }
 
 void amdgpu_vm_print_task_info(struct amdgpu_device *adev,
-- 
2.34.1

Reply via email to