drm: Core vsync: Don't clobber target sequence number when scheduling signal.
author=?utf-8?q?Michel_D=C3=A4nzer?= <michel@tungstengraphics.com>
Tue, 24 Oct 2006 13:34:58 +0000 (23:34 +1000)
committerairlied <airlied@linux.ie>
Thu, 7 Dec 2006 04:53:29 +0000 (15:53 +1100)
It looks like this would have caused signals to always get sent on the next
vertical blank, regardless of the sequence number.

Signed-off-by: Dave Airlie <airlied@linux.ie>
drivers/char/drm/drm_irq.c

index 78aae5b35c629c75634b1946b12fb601f0556972..9d00c51fe2c44790000f59551bf05947a2d829f2 100644 (file)
@@ -296,8 +296,6 @@ int drm_wait_vblank(DRM_IOCTL_ARGS)
                                      ? &dev->vbl_sigs2 : &dev->vbl_sigs;
                drm_vbl_sig_t *vbl_sig;
 
-               vblwait.reply.sequence = seq;
-
                spin_lock_irqsave(&dev->vbl_lock, irqflags);
 
                /* Check if this task has already scheduled the same signal
@@ -310,6 +308,7 @@ int drm_wait_vblank(DRM_IOCTL_ARGS)
                            && vbl_sig->task == current) {
                                spin_unlock_irqrestore(&dev->vbl_lock,
                                                       irqflags);
+                               vblwait.reply.sequence = seq;
                                goto done;
                        }
                }
@@ -340,6 +339,8 @@ int drm_wait_vblank(DRM_IOCTL_ARGS)
                list_add_tail((struct list_head *)vbl_sig, &vbl_sigs->head);
 
                spin_unlock_irqrestore(&dev->vbl_lock, irqflags);
+
+               vblwait.reply.sequence = seq;
        } else {
                if (flags & _DRM_VBLANK_SECONDARY) {
                        if (dev->driver->vblank_wait2)