[Intel-gfx] [PATCH 05/22] drm: Create drm_send_event helpers

Laurent Pinchart laurent.pinchart at ideasonboard.com
Thu Jan 14 10:46:51 PST 2016


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 at amd.com> (v1)
> Acked-by: Daniel Stone <daniels at collabora.com>
> Cc: Alex Deucher <alexander.deucher at amd.com>
> Cc: Thomas Hellstrom <thellstrom at vmware.com>
> Cc: Inki Dae <inki.dae at samsung.com>
> Signed-off-by: Daniel Vetter <daniel.vetter at ffwll.ch>

Reviewed-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>

> ---
>  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



More information about the Intel-gfx mailing list