Currently page fault information is stored per
vm and which could be freed or stale during
reset. Add it pagefault information in the
vm_manager which is a global space for vm's
and remains valid across.

Signed-off-by: Sunil Khatri <sunil.kha...@amd.com>
---
 drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c | 8 ++++++++
 drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h | 2 ++
 2 files changed, 10 insertions(+)

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
index 4299ce386322..81fb3465e197 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
@@ -2924,6 +2924,14 @@ void amdgpu_vm_update_fault_cache(struct amdgpu_device 
*adev,
        if (vm && status) {
                vm->fault_info.addr = addr;
                vm->fault_info.status = status;
+               /*
+                * Update the fault information globally for later usage
+                * when vm could be stale or freed.
+                */
+               adev->vm_manager.fault_info.addr = addr;
+               adev->vm_manager.fault_info.vmhub = vmhub;
+               adev->vm_manager.fault_info.status = status;
+
                if (AMDGPU_IS_GFXHUB(vmhub)) {
                        vm->fault_info.vmhub = AMDGPU_VMHUB_TYPE_GFX;
                        vm->fault_info.vmhub |=
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h
index 047ec1930d12..8efa8422f4f7 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h
@@ -422,6 +422,8 @@ struct amdgpu_vm_manager {
         * look up VM of a page fault
         */
        struct xarray                           pasids;
+       /* Global registration of recent page fault information */
+       struct amdgpu_vm_fault_info     fault_info;
 };
 
 struct amdgpu_bo_va_mapping;
-- 
2.34.1

Reply via email to