From 54f96a5b6bc0ec7798339b4c7a68dce1d91f75d9 Mon Sep 17 00:00:00 2001 From: Pauli Nieminen Date: Tue, 3 Jan 2012 18:43:51 +0200 Subject: [PATCH] gfx: drv: Fix page flip lockup when requesting vblank fails MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit drm_vblank_get may fail if specified pipe is off. In that case we won't get vblank even and can't call drm_vblank_put. But driver still has to complete page flip to send required completion event to userspace. Signed-off-by: Pauli Nieminen Reviewed-by: Ville Syrjälä Signed-off-by: Kirill A. Shutemov --- drivers/staging/mrst/drv/psb_page_flip.c | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/drivers/staging/mrst/drv/psb_page_flip.c b/drivers/staging/mrst/drv/psb_page_flip.c index aa7a86a..4edd223 100644 --- a/drivers/staging/mrst/drv/psb_page_flip.c +++ b/drivers/staging/mrst/drv/psb_page_flip.c @@ -135,7 +135,8 @@ get_fb_meminfo(struct drm_framebuffer *fb) } static void -psb_intel_flip_complete(struct pending_flip *pending_flip) +psb_intel_flip_complete(struct pending_flip *pending_flip, + bool failed_vblank_get) { if (pending_flip) { struct drm_crtc *crtc = pending_flip->crtc; @@ -144,7 +145,8 @@ psb_intel_flip_complete(struct pending_flip *pending_flip) int pipe = psb_intel_crtc->pipe; send_page_flip_event(dev, pipe, pending_flip); - drm_vblank_put(dev, pipe); + if (!failed_vblank_get) + drm_vblank_put(dev, pipe); increase_read_ops_completed(pending_flip->old_mem_info); PVRSRVScheduleDeviceCallbacks(); @@ -160,7 +162,7 @@ psb_intel_crtc_process_vblank(struct drm_crtc *crtc) pending_flip = xchg(&psb_intel_crtc->pending_flip, NULL); - psb_intel_flip_complete(pending_flip); + psb_intel_flip_complete(pending_flip, false); } static void @@ -174,11 +176,14 @@ sync_callback(struct pvr_pending_sync *pending_sync) write_scanout_regs(pending_flip, pending_flip->offset); - drm_vblank_get(dev, psb_intel_crtc->pipe); + if (drm_vblank_get(dev, psb_intel_crtc->pipe)) { + psb_intel_flip_complete(pending_flip, true); + pending_flip = NULL; + } pending_flip = xchg(&psb_intel_crtc->pending_flip, pending_flip); - psb_intel_flip_complete(pending_flip); + psb_intel_flip_complete(pending_flip, false); } int -- 2.7.4