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

Reply via email to