[PATCH 2/3] drm/amdgpu/pm_runtime: update usage count in fence handling
Christian König
ckoenig.leichtzumerken at gmail.com
Mon Dec 16 20:19:08 UTC 2019
Am 16.12.19 um 18:18 schrieb Alex Deucher:
> Increment the usage count in emit fence, and decrement in
> process fence to make sure the GPU is always considered in
> use while there are fences outstanding. We always wait for
> the engines to drain in runtime suspend, but in practice
> that only covers short lived jobs for gfx. This should
> cover us for longer lived fences.
>
> Signed-off-by: Alex Deucher <alexander.deucher at amd.com>
> ---
> drivers/gpu/drm/amd/amdgpu/amdgpu_fence.c | 6 +++++-
> 1 file changed, 5 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_fence.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_fence.c
> index 377fe20bce23..e9efee04ca23 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_fence.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_fence.c
> @@ -34,6 +34,7 @@
> #include <linux/kref.h>
> #include <linux/slab.h>
> #include <linux/firmware.h>
> +#include <linux/pm_runtime.h>
>
> #include <drm/drm_debugfs.h>
>
> @@ -154,7 +155,7 @@ int amdgpu_fence_emit(struct amdgpu_ring *ring, struct dma_fence **f,
> seq);
> amdgpu_ring_emit_fence(ring, ring->fence_drv.gpu_addr,
> seq, flags | AMDGPU_FENCE_FLAG_INT);
> -
> + pm_runtime_get_noresume(adev->ddev->dev);
> ptr = &ring->fence_drv.fences[seq & ring->fence_drv.num_fences_mask];
> if (unlikely(rcu_dereference_protected(*ptr, 1))) {
> struct dma_fence *old;
> @@ -234,6 +235,7 @@ static void amdgpu_fence_schedule_fallback(struct amdgpu_ring *ring)
> bool amdgpu_fence_process(struct amdgpu_ring *ring)
> {
> struct amdgpu_fence_driver *drv = &ring->fence_drv;
> + struct amdgpu_device *adev = ring->adev;
> uint32_t seq, last_seq;
> int r;
>
> @@ -274,6 +276,8 @@ bool amdgpu_fence_process(struct amdgpu_ring *ring)
> BUG();
>
> dma_fence_put(fence);
> + pm_runtime_mark_last_busy(adev->ddev->dev);
> + pm_runtime_put_autosuspend(adev->ddev->dev);
Are you sure this is ok? Keep in mind that this function is called in
interrupt context.
Christian.
> } while (last_seq != seq);
>
> return true;
More information about the amd-gfx
mailing list