dri-devel.lists.freedesktop.org archive mirror
 help / color / mirror / Atom feed
From: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
To: dri-devel@lists.freedesktop.org
Cc: Alex Deucher <alexander.deucher@amd.com>,
	Daniel Vetter <daniel.vetter@ffwll.ch>,
	Intel Graphics Development <intel-gfx@lists.freedesktop.org>,
	Thomas Hellstrom <thellstrom@vmware.com>
Subject: Re: [PATCH 05/22] drm: Create drm_send_event helpers
Date: Thu, 14 Jan 2016 20:46:51 +0200	[thread overview]
Message-ID: <2194487.eqEL0ZPHIu@avalon> (raw)
In-Reply-To: <1452548477-15905-6-git-send-email-daniel.vetter@ffwll.ch>

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

Reviewed-by: Laurent Pinchart <laurent.pinchart@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

_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/intel-gfx

  reply	other threads:[~2016-01-14 18:46 UTC|newest]

Thread overview: 45+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-01-11 21:40 [PATCH 00/22] drm_event cleanup, round 2 Daniel Vetter
2016-01-11 21:40 ` [PATCH 01/22] drm: kerneldoc for drm_fops.c Daniel Vetter
2016-01-11 21:40 ` [PATCH 02/22] drm: Add functions to setup/tear down drm_events Daniel Vetter
2016-01-14 18:46   ` Laurent Pinchart
2016-01-11 21:40 ` [PATCH 03/22] drm/exynos: Use the new event init/free functions Daniel Vetter
2016-01-11 21:40 ` [PATCH 04/22] drm/vmwgfx: " Daniel Vetter
2016-01-11 21:40 ` [PATCH 05/22] drm: Create drm_send_event helpers Daniel Vetter
2016-01-14 18:46   ` Laurent Pinchart [this message]
2016-01-11 21:41 ` [PATCH 06/22] drm/fsl: Remove preclose hook Daniel Vetter
2016-01-11 21:41 ` [PATCH 07/22] drm/armada: Remove NULL open/pre/postclose hooks Daniel Vetter
2016-01-12 11:51   ` Russell King - ARM Linux
2016-01-12 12:33     ` Daniel Vetter
2016-01-11 21:41 ` [PATCH 08/22] drm/gma500: Remove empty preclose hook Daniel Vetter
2016-01-12 10:11   ` Patrik Jakobsson
2016-01-11 21:41 ` [PATCH 09/22] drm: Clean up pending events in the core Daniel Vetter
2016-01-14 18:45   ` Laurent Pinchart
2016-01-25 14:45   ` [REGRESSION] " Maarten Lankhorst
2016-01-11 21:41 ` [PATCH 10/22] drm: Nuke vblank event file cleanup code Daniel Vetter
2016-01-25  0:26   ` Laurent Pinchart
2016-01-11 21:41 ` [PATCH 11/22] drm/i915: Nuke intel_modeset_preclose Daniel Vetter
2016-01-11 21:41 ` [PATCH 12/22] drm/atmel: Nuke preclose Daniel Vetter
2016-01-13 14:56   ` Boris Brezillon
2016-01-11 21:41 ` [PATCH 13/22] drm/exynos: Remove event cancelling from postclose Daniel Vetter
2016-01-12  6:13   ` Inki Dae
2016-01-11 21:41 ` [PATCH 14/22] drm/imx: Unconfuse preclose logic Daniel Vetter
2016-01-12  8:57   ` Philipp Zabel
2016-01-11 21:41 ` [PATCH 15/22] drm/msm: Nuke preclose hooks Daniel Vetter
2016-01-11 21:41 ` [PATCH 16/22] drm/omap: Nuke close hooks Daniel Vetter
2016-01-12 14:09   ` Tomi Valkeinen
2016-01-13 11:00   ` Tomi Valkeinen
2016-01-13 11:05   ` [PATCH] " Daniel Vetter
2016-01-13 23:07     ` Laurent Pinchart
2016-01-11 21:41 ` [PATCH 17/22] drm/rcar: Nuke preclose hook Daniel Vetter
2016-01-11 21:41 ` [PATCH 18/22] drm/shmob: " Daniel Vetter
2016-01-11 21:41 ` [PATCH 19/22] drm/tegra: Stop cancelling page flip events Daniel Vetter
2016-01-13 14:03   ` Thierry Reding
2016-01-11 21:41 ` [PATCH 20/22] drm/tilcdc: Nuke preclose hook Daniel Vetter
2016-01-12 14:19   ` Tomi Valkeinen
2016-01-12 15:12     ` Daniel Vetter
2016-01-13 11:25       ` Tomi Valkeinen
2016-01-11 21:41 ` [PATCH 21/22] drm/vc4: " Daniel Vetter
2016-01-18 17:19   ` Eric Anholt
2016-01-11 21:41 ` [PATCH 22/22] drm/vmwgfx: " Daniel Vetter
2016-01-11 21:41 ` [PATCH] " Daniel Vetter
2016-01-25  7:50 ` [PATCH 00/22] drm_event cleanup, round 2 Daniel Vetter

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=2194487.eqEL0ZPHIu@avalon \
    --to=laurent.pinchart@ideasonboard.com \
    --cc=alexander.deucher@amd.com \
    --cc=daniel.vetter@ffwll.ch \
    --cc=dri-devel@lists.freedesktop.org \
    --cc=intel-gfx@lists.freedesktop.org \
    --cc=thellstrom@vmware.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).