Hi Daniel, Thank you for the patch. On Monday 11 January 2016 22:40:59 Daniel Vetter wrote: > Use them in the core vblank code and exynos/vmwgfx drivers. > > Note that the difference between wake_up_all and _interruptible in > vmwgfx doesn't matter since the only waiter is the core code in > drm_fops.c. And that is interruptible. > > v2: Adjust existing kerneldoc too. > > Reviewed-by: Alex Deucher <alexander.deucher@xxxxxxx> (v1) > Acked-by: Daniel Stone <daniels@xxxxxxxxxxxxx> > Cc: Alex Deucher <alexander.deucher@xxxxxxx> > Cc: Thomas Hellstrom <thellstrom@xxxxxxxxxx> > Cc: Inki Dae <inki.dae@xxxxxxxxxxx> > Signed-off-by: Daniel Vetter <daniel.vetter@xxxxxxxx> Reviewed-by: Laurent Pinchart <laurent.pinchart@xxxxxxxxxxxxxxxx> > --- > drivers/gpu/drm/drm_fops.c | 42 +++++++++++++++++++++++++++++- > drivers/gpu/drm/drm_irq.c | 7 ++---- > drivers/gpu/drm/exynos/exynos_drm_g2d.c | 5 +--- > drivers/gpu/drm/exynos/exynos_drm_ipp.c | 5 +--- > drivers/gpu/drm/vmwgfx/vmwgfx_fence.c | 3 +-- > include/drm/drmP.h | 2 ++ > 6 files changed, 48 insertions(+), 16 deletions(-) > > diff --git a/drivers/gpu/drm/drm_fops.c b/drivers/gpu/drm/drm_fops.c > index 476408b638e3..d85af1b2a238 100644 > --- a/drivers/gpu/drm/drm_fops.c > +++ b/drivers/gpu/drm/drm_fops.c > @@ -683,7 +683,9 @@ EXPORT_SYMBOL(drm_poll); > * This function prepares the passed in event for eventual delivery. If the > event * doesn't get delivered (because the IOCTL fails later on, before > queuing up * anything) then the even must be cancelled and freed using > - * drm_event_cancel_free(). > + * drm_event_cancel_free(). Successfully initialized events should be sent > out + * using drm_send_event() or drm_send_event_locked() to signal > completion of the + * asynchronous event to userspace. > * > * If callers embedded @p into a larger structure it must be allocated with > * kmalloc and @p must be the first member element. > @@ -739,3 +741,41 @@ void drm_event_cancel_free(struct drm_device *dev, > p->destroy(p); > } > EXPORT_SYMBOL(drm_event_cancel_free); > + > +/** > + * drm_send_event_locked - send DRM event to file descriptor > + * @dev: DRM device > + * @e: DRM event to deliver > + * > + * This function sends the event @e, initialized with > drm_event_reserve_init(), + * to its associated userspace DRM file. Callers > must already hold + * dev->event_lock, see drm_send_event() for the > unlocked version. + */ > +void drm_send_event_locked(struct drm_device *dev, struct drm_pending_event > *e) +{ > + assert_spin_locked(&dev->event_lock); > + > + list_add_tail(&e->link, > + &e->file_priv->event_list); > + wake_up_interruptible(&e->file_priv->event_wait); > +} > +EXPORT_SYMBOL(drm_send_event_locked); > + > +/** > + * drm_send_event - send DRM event to file descriptor > + * @dev: DRM device > + * @e: DRM event to deliver > + * > + * This function sends the event @e, initialized with > drm_event_reserve_init(), + * to its associated userspace DRM file. This > function acquires dev->event_lock, + * see drm_send_event_locked() for > callers which already hold this lock. + */ > +void drm_send_event(struct drm_device *dev, struct drm_pending_event *e) > +{ > + unsigned long irqflags; > + > + spin_lock_irqsave(&dev->event_lock, irqflags); > + drm_send_event_locked(dev, e); > + spin_unlock_irqrestore(&dev->event_lock, irqflags); > +} > +EXPORT_SYMBOL(drm_send_event); > diff --git a/drivers/gpu/drm/drm_irq.c b/drivers/gpu/drm/drm_irq.c > index a70b29909974..3fe8dbff6058 100644 > --- a/drivers/gpu/drm/drm_irq.c > +++ b/drivers/gpu/drm/drm_irq.c > @@ -983,15 +983,12 @@ static void send_vblank_event(struct drm_device *dev, > struct drm_pending_vblank_event *e, > unsigned long seq, struct timeval *now) > { > - assert_spin_locked(&dev->event_lock); > - > e->event.sequence = seq; > e->event.tv_sec = now->tv_sec; > e->event.tv_usec = now->tv_usec; > > - list_add_tail(&e->base.link, > - &e->base.file_priv->event_list); > - wake_up_interruptible(&e->base.file_priv->event_wait); > + drm_send_event_locked(dev, &e->base); > + > trace_drm_vblank_event_delivered(e->base.pid, e->pipe, > e->event.sequence); > } > diff --git a/drivers/gpu/drm/exynos/exynos_drm_g2d.c > b/drivers/gpu/drm/exynos/exynos_drm_g2d.c index 82e7f95dfed9..db56c8259f18 > 100644 > --- a/drivers/gpu/drm/exynos/exynos_drm_g2d.c > +++ b/drivers/gpu/drm/exynos/exynos_drm_g2d.c > @@ -893,10 +893,7 @@ static void g2d_finish_event(struct g2d_data *g2d, u32 > cmdlist_no) e->event.tv_usec = now.tv_usec; > e->event.cmdlist_no = cmdlist_no; > > - spin_lock_irqsave(&drm_dev->event_lock, flags); > - list_move_tail(&e->base.link, &e->base.file_priv->event_list); > - wake_up_interruptible(&e->base.file_priv->event_wait); > - spin_unlock_irqrestore(&drm_dev->event_lock, flags); > + drm_send_event(dev, &e->base); > } > > static irqreturn_t g2d_irq_handler(int irq, void *dev_id) > diff --git a/drivers/gpu/drm/exynos/exynos_drm_ipp.c > b/drivers/gpu/drm/exynos/exynos_drm_ipp.c index c8819c05e2dd..1f6a6c1881d6 > 100644 > --- a/drivers/gpu/drm/exynos/exynos_drm_ipp.c > +++ b/drivers/gpu/drm/exynos/exynos_drm_ipp.c > @@ -1520,10 +1520,7 @@ static int ipp_send_event(struct exynos_drm_ippdrv > *ippdrv, for_each_ipp_ops(i) > e->event.buf_id[i] = tbuf_id[i]; > > - spin_lock_irqsave(&drm_dev->event_lock, flags); > - list_move_tail(&e->base.link, &e->base.file_priv->event_list); > - wake_up_interruptible(&e->base.file_priv->event_wait); > - spin_unlock_irqrestore(&drm_dev->event_lock, flags); > + drm_send_event(dev, &e->base); > mutex_unlock(&c_node->event_lock); > > DRM_DEBUG_KMS("done cmd[%d]prop_id[%d]buf_id[%d]\n", > diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_fence.c > b/drivers/gpu/drm/vmwgfx/vmwgfx_fence.c index eda93bf52a6e..e0edf149d9d5 > 100644 > --- a/drivers/gpu/drm/vmwgfx/vmwgfx_fence.c > +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_fence.c > @@ -880,9 +880,8 @@ static void vmw_event_fence_action_seq_passed(struct > vmw_fence_action *action) } > > list_del_init(&eaction->fpriv_head); > - list_add_tail(&eaction->event->link, &file_priv->event_list); > eaction->event = NULL; > - wake_up_all(&file_priv->event_wait); > + drm_send_event_locked(dev, eaction->event); > spin_unlock_irqrestore(&dev->event_lock, irq_flags); > } > > diff --git a/include/drm/drmP.h b/include/drm/drmP.h > index ad4d0a31294d..ae73abf5c2cf 100644 > --- a/include/drm/drmP.h > +++ b/include/drm/drmP.h > @@ -932,6 +932,8 @@ int drm_event_reserve_init(struct drm_device *dev, > struct drm_event *e); > void drm_event_cancel_free(struct drm_device *dev, > struct drm_pending_event *p); > +void drm_send_event_locked(struct drm_device *dev, struct drm_pending_event > *e); +void drm_send_event(struct drm_device *dev, struct drm_pending_event > *e); > > /* Misc. IOCTL support (drm_ioctl.c) */ > int drm_noop(struct drm_device *dev, void *data, -- Regards, Laurent Pinchart _______________________________________________ dri-devel mailing list dri-devel@xxxxxxxxxxxxxxxxxxxxx http://lists.freedesktop.org/mailman/listinfo/dri-devel