Waiting for a fence can fail for different reasons,
the most common is a deadlock.

Signed-off-by: Christian K?nig <deathsimple at vodafone.de>
Reviewed-by: Michel D?nzer <michel.daenzer at amd.com>
Reviewed-by: Jerome Glisse <jglisse at redhat.com>
---
 drivers/gpu/drm/radeon/radeon_gart.c |   17 ++++++++++++++---
 1 file changed, 14 insertions(+), 3 deletions(-)

diff --git a/drivers/gpu/drm/radeon/radeon_gart.c 
b/drivers/gpu/drm/radeon/radeon_gart.c
index 2b34c1a..ee11c50 100644
--- a/drivers/gpu/drm/radeon/radeon_gart.c
+++ b/drivers/gpu/drm/radeon/radeon_gart.c
@@ -316,10 +316,21 @@ static void radeon_vm_unbind_locked(struct radeon_device 
*rdev,
        }

        /* wait for vm use to end */
-       if (vm->fence) {
-               radeon_fence_wait(vm->fence, false);
-               radeon_fence_unref(&vm->fence);
+       while (vm->fence) {
+               int r;
+               r = radeon_fence_wait(vm->fence, false);
+               if (r)
+                       DRM_ERROR("error while waiting for fence: %d\n", r);
+               if (r == -EDEADLK) {
+                       mutex_unlock(&rdev->vm_manager.lock);
+                       r = radeon_gpu_reset(rdev);
+                       mutex_lock(&rdev->vm_manager.lock);
+                       if (!r)
+                               continue;
+               }
+               break;
        }
+       radeon_fence_unref(&vm->fence);

        /* hw unbind */
        rdev->vm_manager.funcs->unbind(rdev, vm);
-- 
1.7.9.5

Reply via email to