> -----Original Message----- > From: Intel-gfx <intel-gfx-bounces@xxxxxxxxxxxxxxxxxxxxx> On Behalf Of Maarten > Lankhorst > Sent: Thursday, November 9, 2023 9:05 PM > To: intel-gfx@xxxxxxxxxxxxxxxxxxxxx > Subject: [PATCH 1/3] drm: Add drm_vblank_work_flush_all(). Drop the "." Looks good to me. Reviewed-by: Uma Shankar <uma.shankar@xxxxxxxxx> > In some cases we want to flush all vblank work, right before vblank_off for > example. Add a simple function to make this possible. > > Signed-off-by: Maarten Lankhorst <maarten.lankhorst@xxxxxxxxxxxxxxx> > --- > drivers/gpu/drm/drm_vblank_work.c | 22 ++++++++++++++++++++++ > include/drm/drm_vblank_work.h | 2 ++ > 2 files changed, 24 insertions(+) > > diff --git a/drivers/gpu/drm/drm_vblank_work.c > b/drivers/gpu/drm/drm_vblank_work.c > index bd481fdd6b870..27c8646a79c8e 100644 > --- a/drivers/gpu/drm/drm_vblank_work.c > +++ b/drivers/gpu/drm/drm_vblank_work.c > @@ -229,6 +229,28 @@ void drm_vblank_work_flush(struct drm_vblank_work > *work) } EXPORT_SYMBOL(drm_vblank_work_flush); > > +/** > + * drm_vblank_work_flush_all - flush all currently pending vblank work on crtc. > + * @crtc: crtc for which vblank work to flush > + * > + * Wait until all currently queued vblank work on @crtc > + * has finished executing once. > + */ > +void drm_vblank_work_flush_all(struct drm_crtc *crtc) { > + struct drm_device *dev = crtc->dev; > + struct drm_vblank_crtc *vblank = &dev->vblank[drm_crtc_index(crtc)]; > + > + spin_lock_irq(&dev->event_lock); > + wait_event_lock_irq(vblank->work_wait_queue, > + waitqueue_active(&vblank->work_wait_queue), > + dev->event_lock); > + spin_unlock_irq(&dev->event_lock); > + > + kthread_flush_worker(vblank->worker); > +} > +EXPORT_SYMBOL(drm_vblank_work_flush_all); > + > /** > * drm_vblank_work_init - initialize a vblank work item > * @work: vblank work item > diff --git a/include/drm/drm_vblank_work.h b/include/drm/drm_vblank_work.h > index eb41d0810c4ff..e04d436b72973 100644 > --- a/include/drm/drm_vblank_work.h > +++ b/include/drm/drm_vblank_work.h > @@ -17,6 +17,7 @@ struct drm_crtc; > * drm_vblank_work_init() > * drm_vblank_work_cancel_sync() > * drm_vblank_work_flush() > + * drm_vblank_work_flush_all() > */ > struct drm_vblank_work { > /** > @@ -67,5 +68,6 @@ void drm_vblank_work_init(struct drm_vblank_work *work, > struct drm_crtc *crtc, > void (*func)(struct kthread_work *work)); bool > drm_vblank_work_cancel_sync(struct drm_vblank_work *work); void > drm_vblank_work_flush(struct drm_vblank_work *work); > +void drm_vblank_work_flush_all(struct drm_crtc *crtc); > > #endif /* !_DRM_VBLANK_WORK_H_ */ > -- > 2.39.2