Avoid adding to the waitqueue and reprobing the current vblank if the
caller is only querying the current vblank sequence and timestamp and
so we would return immediately.

Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
Cc: Ville Syrjälä <ville.syrjala at linux.intel.com>
Cc: Daniel Vetter <daniel at ffwll.ch>
Cc: Michel Dänzer <michel at daenzer.net>
Cc: Laurent Pinchart <laurent.pinchart at ideasonboard.com>
Cc: Dave Airlie <airlied at redhat.com>,
Cc: Mario Kleiner <mario.kleiner.de at gmail.com>
---
 drivers/gpu/drm/drm_irq.c | 18 ++++++++++--------
 1 file changed, 10 insertions(+), 8 deletions(-)

diff --git a/drivers/gpu/drm/drm_irq.c b/drivers/gpu/drm/drm_irq.c
index 6f5dc18779e2..ba80b51b4b00 100644
--- a/drivers/gpu/drm/drm_irq.c
+++ b/drivers/gpu/drm/drm_irq.c
@@ -1617,14 +1617,16 @@ int drm_wait_vblank(struct drm_device *dev, void *data,
                vblwait->request.sequence = seq + 1;
        }

-       DRM_DEBUG("waiting on vblank count %d, crtc %d\n",
-                 vblwait->request.sequence, crtc);
-       vblank->last_wait = vblwait->request.sequence;
-       DRM_WAIT_ON(ret, vblank->queue, 3 * HZ,
-                   (((drm_vblank_count(dev, crtc) -
-                      vblwait->request.sequence) <= (1 << 23)) ||
-                    !vblank->enabled ||
-                    !dev->irq_enabled));
+       if (vblwait->request.sequence != seq) {
+               DRM_DEBUG("waiting on vblank count %d, crtc %d\n",
+                         vblwait->request.sequence, crtc);
+               vblank->last_wait = vblwait->request.sequence;
+               DRM_WAIT_ON(ret, vblank->queue, 3 * HZ,
+                           (((drm_vblank_count(dev, crtc) -
+                              vblwait->request.sequence) <= (1 << 23)) ||
+                            !vblank->enabled ||
+                            !dev->irq_enabled));
+       }

        if (ret != -EINTR) {
                struct timeval now;
-- 
2.1.4

Reply via email to