diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c index 662e8a3..bfa287b 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c @@ -2971,9 +2971,10 @@ int amdgpu_vm_ioctl(struct drm_device *dev, void *data, struct drm_file *filp) * @task_info: task_info to fill. */ void amdgpu_vm_get_task_info(struct amdgpu_device *adev, unsigned int pasid, - struct amdgpu_task_info *task_info) + struct amdgpu_task_info *task_info, u32 page) { struct amdgpu_vm *vm; + struct amdgpu_bo_va_mapping *mapping; spin_lock(&adev->vm_manager.pasid_lock); @@ -2982,6 +2983,28 @@ void amdgpu_vm_get_task_info(struct amdgpu_device *adev, unsigned int pasid, *task_info = vm->task_info; spin_unlock(&adev->vm_manager.pasid_lock); + + + + for (mapping = amdgpu_vm_it_iter_first(&vm->va, 0, U64_MAX); mapping; + mapping = amdgpu_vm_it_iter_next(mapping, 0, U64_MAX)) { + + DRM_ERROR("mapping - first %llx, last %llx, looking for page %u\n", mapping->start, mapping->last, page); + + if (mapping->start <= page && mapping->last >= page) { + struct amdgpu_bo *bo; + + bo = mapping->bo_va->base.bo; + + DRM_ERROR("found mapping - first %llx, last %llx, bo %p, evicted %d", mapping->start, mapping->last, + bo, bo ? bo->tbo.evicted : -10); + + break; + } + } + + + } /** diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h index 1162c2b..cee099a 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h @@ -354,7 +354,7 @@ bool amdgpu_vm_need_pipeline_sync(struct amdgpu_ring *ring, void amdgpu_vm_check_compute_bug(struct amdgpu_device *adev); void amdgpu_vm_get_task_info(struct amdgpu_device *adev, unsigned int pasid, - struct amdgpu_task_info *task_info); + struct amdgpu_task_info *task_info, u32 page); void amdgpu_vm_set_task_info(struct amdgpu_vm *vm); diff --git a/drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c b/drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c index 274c932..8144e8c 100644 --- a/drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c +++ b/drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c @@ -1451,7 +1451,8 @@ static int gmc_v8_0_process_interrupt(struct amdgpu_device *adev, if (printk_ratelimit()) { struct amdgpu_task_info task_info = { 0 }; - amdgpu_vm_get_task_info(adev, entry->pasid, &task_info); + + amdgpu_vm_get_task_info(adev, entry->pasid, &task_info, addr); dev_err(adev->dev, "GPU fault detected: %d 0x%08x for process %s pid %d thread %s pid %d\n", entry->src_id, entry->src_data[0], task_info.process_name, diff --git a/drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c b/drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c index 0bf8439..a969bff 100644 --- a/drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c +++ b/drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c @@ -262,7 +262,7 @@ static int gmc_v9_0_process_interrupt(struct amdgpu_device *adev, if (printk_ratelimit()) { struct amdgpu_task_info task_info = { 0 }; - amdgpu_vm_get_task_info(adev, entry->pasid, &task_info); + amdgpu_vm_get_task_info(adev, entry->pasid, &task_info, 0); dev_err(adev->dev, "[%s] VMC page fault (src_id:%u ring:%u vmid:%u pasid:%u, for process %s pid %d thread %s pid %d\n)\n",