drm/radeon: Complete page flip even if waiting on the BO fence fails
authorMichel Dänzer <michel.daenzer@amd.com>
Mon, 14 Jul 2014 06:58:03 +0000 (15:58 +0900)
committerAlex Deucher <alexander.deucher@amd.com>
Thu, 17 Jul 2014 13:01:32 +0000 (09:01 -0400)
Otherwise the DRM core and userspace will be confused about which BO the
CRTC is scanning out.

Reviewed-by: Christian König <christian.koenig@amd.com>
Signed-off-by: Michel Dänzer <michel.daenzer@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/radeon/radeon_display.c

index 8de5794736455e4501e4f67800a24d8a166bbf42..97ea46597bead25ac9d3bec4ea4f944c262a2c75 100644 (file)
@@ -390,20 +390,22 @@ static void radeon_flip_work_func(struct work_struct *__work)
        int r;
 
         down_read(&rdev->exclusive_lock);
-       while (work->fence) {
+       if (work->fence) {
                r = radeon_fence_wait(work->fence, false);
                if (r == -EDEADLK) {
                        up_read(&rdev->exclusive_lock);
                        r = radeon_gpu_reset(rdev);
                        down_read(&rdev->exclusive_lock);
                }
+               if (r)
+                       DRM_ERROR("failed to wait on page flip fence (%d)!\n", r);
 
-               if (r) {
-                       DRM_ERROR("failed to wait on page flip fence (%d)!\n",
-                                 r);
-                       goto cleanup;
-               } else
-                       radeon_fence_unref(&work->fence);
+               /* We continue with the page flip even if we failed to wait on
+                * the fence, otherwise the DRM core and userspace will be
+                * confused about which BO the CRTC is scanning out
+                */
+
+               radeon_fence_unref(&work->fence);
        }
 
        /* do the flip (mmio) */
@@ -418,14 +420,6 @@ static void radeon_flip_work_func(struct work_struct *__work)
        radeon_crtc->flip_status = RADEON_FLIP_SUBMITTED;
        spin_unlock_irqrestore(&crtc->dev->event_lock, flags);
        up_read(&rdev->exclusive_lock);
-
-       return;
-
-cleanup:
-       drm_gem_object_unreference_unlocked(&work->old_rbo->gem_base);
-       radeon_fence_unref(&work->fence);
-       kfree(work);
-       up_read(&rdev->exclusive_lock);
 }
 
 static int radeon_crtc_page_flip(struct drm_crtc *crtc,