Store the DRM file-private owner in the global PASID xarray after DRM
file-private initialization.

This allows lookup users to resolve:

        PASID -> fpriv -> vm

Clear ownership before tearing down the VM.

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

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c
index cacdc99b3ad6..7f4727bdb6e6 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c
@@ -1469,7 +1469,6 @@ int amdgpu_driver_open_kms(struct drm_device *dev, struct 
drm_file *file_priv)
        /* Ensure IB tests are run on ring */
        flush_delayed_work(&adev->delayed_init_work);
 
-
        if (amdgpu_ras_intr_triggered()) {
                DRM_ERROR("RAS Intr triggered, device disabled!!");
                return -EHWPOISON;
@@ -1522,7 +1521,7 @@ int amdgpu_driver_open_kms(struct drm_device *dev, struct 
drm_file *file_priv)
                uint64_t csa_addr = amdgpu_csa_vaddr(adev) & 
AMDGPU_GMC_HOLE_MASK;
 
                r = amdgpu_map_static_csa(adev, &fpriv->vm, adev->virt.csa_obj,
-                                               &fpriv->csa_va, csa_addr, 
AMDGPU_CSA_SIZE);
+                                          &fpriv->csa_va, csa_addr, 
AMDGPU_CSA_SIZE);
                if (r)
                        goto error_vm;
        }
@@ -1542,10 +1541,20 @@ int amdgpu_driver_open_kms(struct drm_device *dev, 
struct drm_file *file_priv)
        amdgpu_evf_mgr_init(&fpriv->evf_mgr);
        amdgpu_ctx_mgr_init(&fpriv->ctx_mgr, adev);
 
+       /*
+        * Register PASID ownership after fpriv has been fully initialized.
+        */
+       r = amdgpu_pasid_set_fpriv(fpriv->vm.pasid, fpriv);
+       if (r)
+               goto error_vm;
+
        file_priv->driver_priv = fpriv;
        goto out_suspend;
 
 error_vm:
+       if (fpriv->vm.pasid)
+               amdgpu_pasid_clear_fpriv(fpriv->vm.pasid, fpriv);
+
        amdgpu_vm_fini(adev, &fpriv->vm);
 
 error_pasid:
@@ -1600,6 +1609,10 @@ void amdgpu_driver_postclose_kms(struct drm_device *dev,
        amdgpu_seq64_unmap(adev, fpriv);
 
        pasid = fpriv->vm.pasid;
+
+       if (pasid)
+               amdgpu_pasid_clear_fpriv(pasid, fpriv);
+
        pd = amdgpu_bo_ref(fpriv->vm.root.bo);
        if (!WARN_ON(amdgpu_bo_reserve(pd, true))) {
                amdgpu_vm_bo_del(adev, fpriv->prt_va);
-- 
2.34.1

Reply via email to