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