On Tue, Jun 17, 2014 at 7:41 AM, Christian König <deathsimple@xxxxxxxxxxx> wrote: > Am 17.06.2014 12:12, schrieb Michel Dänzer: > >> From: Michel Dänzer <michel.daenzer@xxxxxxx> >> >> This reverts commit 75f36d861957cb05b7889af24c8cd4a789398304. >> >> drm_vblank_get() is necessary to ensure the DRM vblank counter value is >> up to date in drm_send_vblank_event(). >> >> Seems to fix weston hangs waiting for page flips to complete. >> >> Signed-off-by: Michel Dänzer <michel.daenzer@xxxxxxx> > > > Both patches are: Reviewed-by: Christian König <christian.koenig@xxxxxxx> Both applied to my fixes tree. Alex > > >> --- >> drivers/gpu/drm/radeon/radeon_display.c | 17 +++++++++++++++++ >> 1 file changed, 17 insertions(+) >> >> diff --git a/drivers/gpu/drm/radeon/radeon_display.c >> b/drivers/gpu/drm/radeon/radeon_display.c >> index 2a8b9f1..97d7a80 100644 >> --- a/drivers/gpu/drm/radeon/radeon_display.c >> +++ b/drivers/gpu/drm/radeon/radeon_display.c >> @@ -357,6 +357,7 @@ void radeon_crtc_handle_flip(struct radeon_device >> *rdev, int crtc_id) >> spin_unlock_irqrestore(&rdev->ddev->event_lock, flags); >> + drm_vblank_put(rdev->ddev, radeon_crtc->crtc_id); >> radeon_fence_unref(&work->fence); >> radeon_irq_kms_pflip_irq_get(rdev, work->crtc_id); >> queue_work(radeon_crtc->flip_queue, &work->unpin_work); >> @@ -459,6 +460,12 @@ static void radeon_flip_work_func(struct work_struct >> *__work) >> base &= ~7; >> } >> + r = drm_vblank_get(crtc->dev, radeon_crtc->crtc_id); >> + if (r) { >> + DRM_ERROR("failed to get vblank before flip\n"); >> + goto pflip_cleanup; >> + } >> + >> /* We borrow the event spin lock for protecting flip_work */ >> spin_lock_irqsave(&crtc->dev->event_lock, flags); >> @@ -473,6 +480,16 @@ static void radeon_flip_work_func(struct >> work_struct *__work) >> return; >> +pflip_cleanup: >> + if (unlikely(radeon_bo_reserve(work->new_rbo, false) != 0)) { >> + DRM_ERROR("failed to reserve new rbo in error path\n"); >> + goto cleanup; >> + } >> + if (unlikely(radeon_bo_unpin(work->new_rbo) != 0)) { >> + DRM_ERROR("failed to unpin new rbo in error path\n"); >> + } >> + radeon_bo_unreserve(work->new_rbo); >> + >> cleanup: >> drm_gem_object_unreference_unlocked(&work->old_rbo->gem_base); >> radeon_fence_unref(&work->fence); > > > _______________________________________________ > dri-devel mailing list > dri-devel@xxxxxxxxxxxxxxxxxxxxx > http://lists.freedesktop.org/mailman/listinfo/dri-devel _______________________________________________ dri-devel mailing list dri-devel@xxxxxxxxxxxxxxxxxxxxx http://lists.freedesktop.org/mailman/listinfo/dri-devel