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@xxxxxxxxxxxxxxxxxx> > > Cc: Ville Syrjälä <ville.syrjala@xxxxxxxxxxxxxxx> > > Cc: Daniel Vetter <daniel@xxxxxxxx> > > Cc: Michel Dänzer <michel@xxxxxxxxxxx> > > Cc: Laurent Pinchart <laurent.pinchart@xxxxxxxxxxxxxxxx> > > Cc: Dave Airlie <airlied@xxxxxxxxxx>, > > Cc: Mario Kleiner <mario.kleiner.de@xxxxxxxxx> > > --- > > 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 _______________________________________________ dri-devel mailing list dri-devel@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/dri-devel