The fault handler may push some work to the GPU through amdgpu_bo_move so use the pm_runtime functions before that. Since we're in an interrupt context, we can't use the sync version, so pm_runtime_get is called. Signed-off-by: Pierre-Eric Pelloux-Prayer <pierre-eric.pelloux-prayer@xxxxxxx> --- drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c index 1f22b4208729..ec120e33536d 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c @@ -30,6 +30,7 @@ #include <linux/pagemap.h> #include <linux/pci.h> #include <linux/dma-buf.h> +#include <linux/pm_runtime.h> #include <drm/amdgpu_drm.h> #include <drm/drm_drv.h> @@ -52,9 +53,13 @@ static vm_fault_t amdgpu_gem_fault(struct vm_fault *vmf) vm_fault_t ret; int idx; + ret = pm_runtime_get(ddev->dev); + if (ret < 0) + return ret; + ret = ttm_bo_vm_reserve(bo, vmf); if (ret) - return ret; + goto put_pm; if (drm_dev_enter(ddev, &idx)) { ret = amdgpu_bo_fault_reserve_notify(bo); @@ -71,10 +76,14 @@ static vm_fault_t amdgpu_gem_fault(struct vm_fault *vmf) ret = ttm_bo_vm_dummy_page(vmf, vmf->vma->vm_page_prot); } if (ret == VM_FAULT_RETRY && !(vmf->flags & FAULT_FLAG_RETRY_NOWAIT)) - return ret; + goto put_pm; unlock: dma_resv_unlock(bo->base.resv); +put_pm: + pm_runtime_mark_last_busy(ddev->dev); + pm_runtime_put_autosuspend(ddev->dev); + return ret; } -- 2.40.1