[Intel-gfx] [PATCH 2/2] drm: Peek at the current counter/timestamp for vblank queries
Chris Wilson
chris at chris-wilson.co.uk
Fri Mar 17 19:59:06 UTC 2017
On Fri, Mar 17, 2017 at 11:49:32AM +0200, Ville Syrjälä wrote:
> On Thu, Mar 16, 2017 at 11:47:49PM +0000, Chris Wilson wrote:
> > Bypass all the spinlocks and return the last timestamp and counter from
> > the last vblank if the driver delcares that it is accurate (and stable
> > across on/off), and the vblank is currently enabled.
> >
> > This is dependent upon the both the hardware and driver to provide the
> > proper barriers to facilitate reading our bookkeeping outside of the
> > vblank interrupt and outside of the explicit vblank locks.
> >
> > 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 | 26 ++++++++++++++++++++++++++
> > 1 file changed, 26 insertions(+)
> >
> > diff --git a/drivers/gpu/drm/drm_irq.c b/drivers/gpu/drm/drm_irq.c
> > index 4cc9352ab6a8..b4bd361a2bcc 100644
> > --- a/drivers/gpu/drm/drm_irq.c
> > +++ b/drivers/gpu/drm/drm_irq.c
> > @@ -1562,6 +1562,17 @@ static int drm_queue_vblank_event(struct drm_device *dev, unsigned int pipe,
> > return ret;
> > }
> >
> > +static bool drm_wait_vblank_is_query(union drm_wait_vblank *vblwait)
> > +{
> > + if (vblwait->request.sequence)
> > + return false;
> > +
> > + return _DRM_VBLANK_RELATIVE ==
> > + (vblwait->request.type & (_DRM_VBLANK_TYPES_MASK |
> > + _DRM_VBLANK_EVENT |
> > + _DRM_VBLANK_NEXTONMISS));
> > +}
> > +
> > /*
> > * Wait for VBLANK.
> > *
> > @@ -1611,6 +1622,21 @@ int drm_wait_vblank(struct drm_device *dev, void *data,
> >
> > vblank = &dev->vblank[pipe];
> >
> > + /* If the counter is currently enabled and accurate, short-circuit queries
> > + * to return the cached timestamp of the last vblank.
> > + */
> > + if (dev->vblank_disable_immediate &&
> > + drm_wait_vblank_is_query(vblwait) &&
> > + vblank->enabled) {
> > + struct timeval now;
> > +
>
> Do we want a comment here as well stating that the seqlock
> already has the rmb?
I didn't find it enlightening. Added READ_ONCE(vblank->enabled).
-Chris
--
Chris Wilson, Intel Open Source Technology Centre
More information about the Intel-gfx
mailing list