From: Michel D?nzer <michel.daen...@amd.com>

Otherwise the DRM core and userspace will be confused about which BO the
CRTC is scanning out.

Signed-off-by: Michel D?nzer <michel.daenzer at amd.com>
---
 drivers/gpu/drm/radeon/radeon_display.c | 24 +++++++++---------------
 1 file changed, 9 insertions(+), 15 deletions(-)

diff --git a/drivers/gpu/drm/radeon/radeon_display.c 
b/drivers/gpu/drm/radeon/radeon_display.c
index 82ae9e3..9da4933 100644
--- a/drivers/gpu/drm/radeon/radeon_display.c
+++ b/drivers/gpu/drm/radeon/radeon_display.c
@@ -347,20 +347,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);
        }

        /* We borrow the event spin lock for protecting flip_status */
@@ -368,14 +370,6 @@ static void radeon_flip_work_func(struct work_struct 
*__work)
        radeon_crtc->flip_status = RADEON_FLIP_READY;
        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,
-- 
2.0.0

Reply via email to