drm/amdgpu/pm_runtime: update usage count in fence handling
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. Reviewed-by: Christian König <christian.koenig@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
This commit is contained in:
parent
f1e1483b27
commit
45a80abebc
|
@ -34,6 +34,7 @@
|
||||||
#include <linux/kref.h>
|
#include <linux/kref.h>
|
||||||
#include <linux/slab.h>
|
#include <linux/slab.h>
|
||||||
#include <linux/firmware.h>
|
#include <linux/firmware.h>
|
||||||
|
#include <linux/pm_runtime.h>
|
||||||
|
|
||||||
#include <drm/drm_debugfs.h>
|
#include <drm/drm_debugfs.h>
|
||||||
|
|
||||||
|
@ -154,7 +155,7 @@ int amdgpu_fence_emit(struct amdgpu_ring *ring, struct dma_fence **f,
|
||||||
seq);
|
seq);
|
||||||
amdgpu_ring_emit_fence(ring, ring->fence_drv.gpu_addr,
|
amdgpu_ring_emit_fence(ring, ring->fence_drv.gpu_addr,
|
||||||
seq, flags | AMDGPU_FENCE_FLAG_INT);
|
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];
|
ptr = &ring->fence_drv.fences[seq & ring->fence_drv.num_fences_mask];
|
||||||
if (unlikely(rcu_dereference_protected(*ptr, 1))) {
|
if (unlikely(rcu_dereference_protected(*ptr, 1))) {
|
||||||
struct dma_fence *old;
|
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)
|
bool amdgpu_fence_process(struct amdgpu_ring *ring)
|
||||||
{
|
{
|
||||||
struct amdgpu_fence_driver *drv = &ring->fence_drv;
|
struct amdgpu_fence_driver *drv = &ring->fence_drv;
|
||||||
|
struct amdgpu_device *adev = ring->adev;
|
||||||
uint32_t seq, last_seq;
|
uint32_t seq, last_seq;
|
||||||
int r;
|
int r;
|
||||||
|
|
||||||
|
@ -274,6 +276,8 @@ bool amdgpu_fence_process(struct amdgpu_ring *ring)
|
||||||
BUG();
|
BUG();
|
||||||
|
|
||||||
dma_fence_put(fence);
|
dma_fence_put(fence);
|
||||||
|
pm_runtime_mark_last_busy(adev->ddev->dev);
|
||||||
|
pm_runtime_put_autosuspend(adev->ddev->dev);
|
||||||
} while (last_seq != seq);
|
} while (last_seq != seq);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
|
Loading…
Reference in New Issue