drm/radeon: Make classic pageflip completion path less racy.
authorMario Kleiner <mario.kleiner.de@gmail.com>
Thu, 17 Jul 2014 00:24:45 +0000 (02:24 +0200)
committerAlex Deucher <alexander.deucher@amd.com>
Thu, 17 Jul 2014 13:04:03 +0000 (09:04 -0400)
Need to protect mmio flip programming by event lock as well.

Need to also first enable pflip irq, then mmio program,
otherwise a flip completion may get unnoticed in the vblank
of actual completion if the flip is programmed, but
radeon_flip_work_func gets preempted immediately after
mmio programming and before vblank. In that case the
vblank irq handler wouldn't run radeon_crtc_handle_vblank()
with the completion check routine, miss the completed flip,
and only notice one vblank after actual completion, causing
a false/delayed report of flip completion.

Signed-off-by: Mario Kleiner <mario.kleiner.de@gmail.com>
Reviewed-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 0a22a1bb688c5e55a17043bb7f4e2e42cabae2fb..bf25061c8ac4ee37b0f1c72b003427eb551dca22 100644 (file)
@@ -407,15 +407,15 @@ static void radeon_flip_work_func(struct work_struct *__work)
                radeon_fence_unref(&work->fence);
        }
 
-       /* do the flip (mmio) */
-       radeon_page_flip(rdev, radeon_crtc->crtc_id, work->base);
-
        /* We borrow the event spin lock for protecting flip_status */
        spin_lock_irqsave(&crtc->dev->event_lock, flags);
 
        /* set the proper interrupt */
        radeon_irq_kms_pflip_irq_get(rdev, radeon_crtc->crtc_id);
 
+       /* do the flip (mmio) */
+       radeon_page_flip(rdev, radeon_crtc->crtc_id, work->base);
+
        radeon_crtc->flip_status = RADEON_FLIP_SUBMITTED;
        spin_unlock_irqrestore(&crtc->dev->event_lock, flags);
        up_read(&rdev->exclusive_lock);