OSDN Git Service

drm/vblank: Fix flip event vblank count
authorVille Syrjälä <ville.syrjala@linux.intel.com>
Tue, 10 Oct 2017 13:33:22 +0000 (16:33 +0300)
committerVille Syrjälä <ville.syrjala@linux.intel.com>
Thu, 12 Oct 2017 14:34:28 +0000 (17:34 +0300)
On machines where the vblank interrupt fires some time after the start
of vblank (or we just manage to race with the vblank interrupt handler)
we will currently stuff a stale vblank counter value into the flip event,
and thus we'll prematurely complete the flip.

Switch over to drm_crtc_accurate_vblank_count() to make sure we have an
up to date counter value, crucially also remember to add the +1 so that
the delayed vblank interrupt won't complete the flip prematurely.

Cc: stable@vger.kernel.org
Cc: Daniel Vetter <daniel@ffwll.ch>
Suggested-by: Daniel Vetter <daniel@ffwll.ch>
Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20171010133322.24029-1-ville.syrjala@linux.intel.com
Reviewed-by: Daniel Vetter <daniel@ffwll.ch> #irc
drivers/gpu/drm/drm_vblank.c

index 70f2b95..f14e6c9 100644 (file)
@@ -869,7 +869,7 @@ void drm_crtc_arm_vblank_event(struct drm_crtc *crtc,
        assert_spin_locked(&dev->event_lock);
 
        e->pipe = pipe;
-       e->event.sequence = drm_vblank_count(dev, pipe);
+       e->event.sequence = drm_crtc_accurate_vblank_count(crtc) + 1;
        e->event.crtc_id = crtc->base.id;
        list_add_tail(&e->base.link, &dev->vblank_event_list);
 }