Complete the userq eviction fence before gpu reset.
Signed-off-by: Prike Liang <[email protected]>
---
drivers/gpu/drm/amd/amdgpu/amdgpu_userq_fence.c | 9 +++++++++
1 file changed, 9 insertions(+)
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_userq_fence.c
b/drivers/gpu/drm/amd/amdgpu/amdgpu_userq_fence.c
index b556fbb1c31e..49a938436b08 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_userq_fence.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_userq_fence.c
@@ -443,6 +443,9 @@ void
amdgpu_userq_fence_driver_force_completion(struct amdgpu_usermode_queue *userq)
{
struct dma_fence *f = userq->last_fence;
+ struct amdgpu_fpriv *fpriv = userq->userq_mgr->file->driver_priv;
+ struct amdgpu_eviction_fence_mgr *evf_mgr = &fpriv->evf_mgr;
+ struct dma_fence *ev_fence;
if (f) {
struct amdgpu_userq_fence *fence = to_amdgpu_userq_fence(f);
@@ -452,8 +455,14 @@ amdgpu_userq_fence_driver_force_completion(struct
amdgpu_usermode_queue *userq)
amdgpu_userq_fence_driver_set_error(fence, -ECANCELED);
amdgpu_userq_fence_write(fence_drv, wptr);
amdgpu_userq_fence_driver_process(fence_drv);
+ }
+ ev_fence = amdgpu_evf_mgr_get_fence(evf_mgr);
+ if (!dma_fence_is_signaled(ev_fence)) {
+ dma_fence_set_error(ev_fence, -ECANCELED);
+ dma_fence_signal(ev_fence);
}
+ dma_fence_put(ev_fence);
}
int amdgpu_userq_signal_ioctl(struct drm_device *dev, void *data,
--
2.34.1