[PATCH 6/6] drm/amdgpu: resume the device from amdgpu_gem_fault
Pierre-Eric Pelloux-Prayer
pierre-eric.pelloux-prayer at amd.com
Tue Jun 18 15:23:27 UTC 2024
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 at amd.com>
---
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
More information about the amd-gfx
mailing list