[PATCH] drm-vblank: Always return true vblank count of scheduled vblank event.
Jesse Barnes
jbarnes at virtuousgeek.org
Fri Dec 10 09:45:31 PST 2010
On Fri, 10 Dec 2010 16:00:19 +0100
Mario Kleiner <mario.kleiner at tuebingen.mpg.de> wrote:
>
>
> -------- Original Message --------
> Subject: [PATCH] drm-vblank: Always return true vblank count of
> scheduled vblank event.
> Date: Fri, 10 Dec 2010 15:58:10 +0100
> From: Mario Kleiner <mario.kleiner at tuebingen.mpg.de>
> To: airlied at gmail.com
> CC: jbarnes at virtuousgeek.org, krh at bitplanet.net, Mario Kleiner
> <mario.kleiner at tuebingen.mpg.de>
>
> This patch tries to make sure that the vbl.reply.sequence
> vblank count for a queued or emitted vblank event always
> corresponds to the true vblank count of queueing/emission, so
> the ddx can rely on the returned target_msc for consistency
> checks and implementation of swap_intervals in glXSwapBuffers().
>
> Without this there is a small race-condition between the
> userspace ddx queueing a vblank event and the vblank
> counter incrementing before the event gets queued in
> the kernel.
>
> Signed-off-by: Mario Kleiner <mario.kleiner at tuebingen.mpg.de>
> ---
> drivers/gpu/drm/drm_irq.c | 3 +++
> 1 files changed, 3 insertions(+), 0 deletions(-)
>
> diff --git a/drivers/gpu/drm/drm_irq.c b/drivers/gpu/drm/drm_irq.c
> index 4e82d0d..55160d7 100644
> --- a/drivers/gpu/drm/drm_irq.c
> +++ b/drivers/gpu/drm/drm_irq.c
> @@ -1086,15 +1086,18 @@ static int drm_queue_vblank_event(struct
> drm_device *dev, int pipe,
>
> e->event.sequence = vblwait->request.sequence;
> if ((seq - vblwait->request.sequence) <= (1 << 23)) {
> + e->event.sequence = seq;
> e->event.tv_sec = now.tv_sec;
> e->event.tv_usec = now.tv_usec;
> drm_vblank_put(dev, e->pipe);
> list_add_tail(&e->base.link, &e->base.file_priv->event_list);
> wake_up_interruptible(&e->base.file_priv->event_wait);
> + vblwait->reply.sequence = seq;
> trace_drm_vblank_event_delivered(current->pid, pipe,
> vblwait->request.sequence);
But this actually causes us to return the current count rather than the
requested count if the event requested is in the past, right?
> } else {
> list_add_tail(&e->base.link, &dev->vblank_event_list);
> + vblwait->reply.sequence = vblwait->request.sequence;
> }
This one makes sense; we want to make sure the returned sequence is the
one requested (assuming it was in the future at the time of the request
anyway).
--
Jesse Barnes, Intel Open Source Technology Center
More information about the dri-devel
mailing list