All of lore.kernel.org
 help / color / mirror / Atom feed
From: Hans Verkuil <hverkuil@xs4all.nl>
To: Ezequiel Garcia <ezequiel@collabora.com>, linux-media@vger.kernel.org
Cc: kernel@collabora.com
Subject: Re: [PATCH 2/3] mem2mem: Make .job_abort optional
Date: Fri, 15 Jun 2018 10:43:02 +0200	[thread overview]
Message-ID: <326c082b-44e7-60d7-9d36-2d5f4713709f@xs4all.nl> (raw)
In-Reply-To: <20180614153405.5697-3-ezequiel@collabora.com>

On 14/06/18 17:34, Ezequiel Garcia wrote:
> Implementing job_abort() does not make sense on some drivers.
> This is not a problem, as the abort is not required to
> wait for the job to finish. Quite the opposite, drivers
> are encouraged not to wait.
> 
> Demote v4l2_m2m_ops.job_abort from required to optional, and
> clean all drivers with dummy or wrong implementations.

Can you split off the rcar_jpu.c and g2d.c changes into separate patches?
The others are trivial, but those two need a more precise commit log and
I would like to have Acks of the driver maintainers before merging.

I'm going to take the first and third patches of this series, so you
only have to post a v2 for this patch.

Regards,

	Hans

> 
> Signed-off-by: Ezequiel Garcia <ezequiel@collabora.com>
> ---
>  drivers/media/platform/mtk-jpeg/mtk_jpeg_core.c |  5 -----
>  drivers/media/platform/mtk-mdp/mtk_mdp_m2m.c    |  5 -----
>  drivers/media/platform/rcar_jpu.c               | 16 ----------------
>  drivers/media/platform/rockchip/rga/rga.c       |  6 ------
>  drivers/media/platform/s5p-g2d/g2d.c            | 14 --------------
>  drivers/media/platform/s5p-jpeg/jpeg-core.c     |  7 -------
>  drivers/media/v4l2-core/v4l2-mem2mem.c          |  6 +++---
>  include/media/v4l2-mem2mem.h                    |  2 +-
>  8 files changed, 4 insertions(+), 57 deletions(-)
> 
> diff --git a/drivers/media/platform/mtk-jpeg/mtk_jpeg_core.c b/drivers/media/platform/mtk-jpeg/mtk_jpeg_core.c
> index 328e8f650d9b..4f24da8afecc 100644
> --- a/drivers/media/platform/mtk-jpeg/mtk_jpeg_core.c
> +++ b/drivers/media/platform/mtk-jpeg/mtk_jpeg_core.c
> @@ -861,14 +861,9 @@ static int mtk_jpeg_job_ready(void *priv)
>  	return (ctx->state == MTK_JPEG_RUNNING) ? 1 : 0;
>  }
>  
> -static void mtk_jpeg_job_abort(void *priv)
> -{
> -}
> -
>  static const struct v4l2_m2m_ops mtk_jpeg_m2m_ops = {
>  	.device_run = mtk_jpeg_device_run,
>  	.job_ready  = mtk_jpeg_job_ready,
> -	.job_abort  = mtk_jpeg_job_abort,
>  };
>  
>  static int mtk_jpeg_queue_init(void *priv, struct vb2_queue *src_vq,
> diff --git a/drivers/media/platform/mtk-mdp/mtk_mdp_m2m.c b/drivers/media/platform/mtk-mdp/mtk_mdp_m2m.c
> index 583d47724ee8..1198e19060a2 100644
> --- a/drivers/media/platform/mtk-mdp/mtk_mdp_m2m.c
> +++ b/drivers/media/platform/mtk-mdp/mtk_mdp_m2m.c
> @@ -455,10 +455,6 @@ static void mtk_mdp_m2m_stop_streaming(struct vb2_queue *q)
>  	pm_runtime_put(&ctx->mdp_dev->pdev->dev);
>  }
>  
> -static void mtk_mdp_m2m_job_abort(void *priv)
> -{
> -}
> -
>  /* The color format (num_planes) must be already configured. */
>  static void mtk_mdp_prepare_addr(struct mtk_mdp_ctx *ctx,
>  				 struct vb2_buffer *vb,
> @@ -1227,7 +1223,6 @@ static const struct v4l2_file_operations mtk_mdp_m2m_fops = {
>  
>  static const struct v4l2_m2m_ops mtk_mdp_m2m_ops = {
>  	.device_run	= mtk_mdp_m2m_device_run,
> -	.job_abort	= mtk_mdp_m2m_job_abort,
>  };
>  
>  int mtk_mdp_register_m2m_device(struct mtk_mdp_dev *mdp)
> diff --git a/drivers/media/platform/rcar_jpu.c b/drivers/media/platform/rcar_jpu.c
> index 8b44a849ab41..10d24ddcea5f 100644
> --- a/drivers/media/platform/rcar_jpu.c
> +++ b/drivers/media/platform/rcar_jpu.c
> @@ -198,7 +198,6 @@
>   * @vfd_decoder: video device node for decoder mem2mem mode
>   * @m2m_dev: v4l2 mem2mem device data
>   * @curr: pointer to current context
> - * @irq_queue:	interrupt handler waitqueue
>   * @regs: JPEG IP registers mapping
>   * @irq: JPEG IP irq
>   * @clk: JPEG IP clock
> @@ -213,7 +212,6 @@ struct jpu {
>  	struct video_device	vfd_decoder;
>  	struct v4l2_m2m_dev	*m2m_dev;
>  	struct jpu_ctx		*curr;
> -	wait_queue_head_t	irq_queue;
>  
>  	void __iomem		*regs;
>  	unsigned int		irq;
> @@ -1499,19 +1497,9 @@ static int jpu_job_ready(void *priv)
>  	return 1;
>  }
>  
> -static void jpu_job_abort(void *priv)
> -{
> -	struct jpu_ctx *ctx = priv;
> -
> -	if (!wait_event_timeout(ctx->jpu->irq_queue, !ctx->jpu->curr,
> -				msecs_to_jiffies(JPU_JOB_TIMEOUT)))
> -		jpu_cleanup(ctx, true);
> -}
> -
>  static const struct v4l2_m2m_ops jpu_m2m_ops = {
>  	.device_run	= jpu_device_run,
>  	.job_ready	= jpu_job_ready,
> -	.job_abort	= jpu_job_abort,
>  };
>  
>  /*
> @@ -1592,9 +1580,6 @@ static irqreturn_t jpu_irq_handler(int irq, void *dev_id)
>  
>  	v4l2_m2m_job_finish(jpu->m2m_dev, curr_ctx->fh.m2m_ctx);
>  
> -	/* ...wakeup abort routine if needed */
> -	wake_up(&jpu->irq_queue);
> -
>  	return IRQ_HANDLED;
>  
>  handled:
> @@ -1628,7 +1613,6 @@ static int jpu_probe(struct platform_device *pdev)
>  	if (!jpu)
>  		return -ENOMEM;
>  
> -	init_waitqueue_head(&jpu->irq_queue);
>  	mutex_init(&jpu->mutex);
>  	spin_lock_init(&jpu->lock);
>  	jpu->dev = &pdev->dev;
> diff --git a/drivers/media/platform/rockchip/rga/rga.c b/drivers/media/platform/rockchip/rga/rga.c
> index 5a5a6139e18a..d833bb32a538 100644
> --- a/drivers/media/platform/rockchip/rga/rga.c
> +++ b/drivers/media/platform/rockchip/rga/rga.c
> @@ -39,11 +39,6 @@
>  static int debug;
>  module_param(debug, int, 0644);
>  
> -static void job_abort(void *prv)
> -{
> -	/* Can't do anything rational here */
> -}
> -
>  static void device_run(void *prv)
>  {
>  	struct rga_ctx *ctx = prv;
> @@ -104,7 +99,6 @@ static irqreturn_t rga_isr(int irq, void *prv)
>  
>  static struct v4l2_m2m_ops rga_m2m_ops = {
>  	.device_run = device_run,
> -	.job_abort = job_abort,
>  };
>  
>  static int
> diff --git a/drivers/media/platform/s5p-g2d/g2d.c b/drivers/media/platform/s5p-g2d/g2d.c
> index 66aa8cf1d048..49cc2a70d1f3 100644
> --- a/drivers/media/platform/s5p-g2d/g2d.c
> +++ b/drivers/media/platform/s5p-g2d/g2d.c
> @@ -481,19 +481,6 @@ static int vidioc_s_crop(struct file *file, void *prv, const struct v4l2_crop *c
>  	return 0;
>  }
>  
> -static void job_abort(void *prv)
> -{
> -	struct g2d_ctx *ctx = prv;
> -	struct g2d_dev *dev = ctx->dev;
> -
> -	if (dev->curr == NULL) /* No job currently running */
> -		return;
> -
> -	wait_event_timeout(dev->irq_queue,
> -			   dev->curr == NULL,
> -			   msecs_to_jiffies(G2D_TIMEOUT));
> -}
> -
>  static void device_run(void *prv)
>  {
>  	struct g2d_ctx *ctx = prv;
> @@ -613,7 +600,6 @@ static const struct video_device g2d_videodev = {
>  
>  static const struct v4l2_m2m_ops g2d_m2m_ops = {
>  	.device_run	= device_run,
> -	.job_abort	= job_abort,
>  };
>  
>  static const struct of_device_id exynos_g2d_match[];
> diff --git a/drivers/media/platform/s5p-jpeg/jpeg-core.c b/drivers/media/platform/s5p-jpeg/jpeg-core.c
> index 79b63da27f53..04fd2e0493c0 100644
> --- a/drivers/media/platform/s5p-jpeg/jpeg-core.c
> +++ b/drivers/media/platform/s5p-jpeg/jpeg-core.c
> @@ -2467,26 +2467,19 @@ static int s5p_jpeg_job_ready(void *priv)
>  	return 1;
>  }
>  
> -static void s5p_jpeg_job_abort(void *priv)
> -{
> -}
> -
>  static struct v4l2_m2m_ops s5p_jpeg_m2m_ops = {
>  	.device_run	= s5p_jpeg_device_run,
>  	.job_ready	= s5p_jpeg_job_ready,
> -	.job_abort	= s5p_jpeg_job_abort,
>  };
>  
>  static struct v4l2_m2m_ops exynos3250_jpeg_m2m_ops = {
>  	.device_run	= exynos3250_jpeg_device_run,
>  	.job_ready	= s5p_jpeg_job_ready,
> -	.job_abort	= s5p_jpeg_job_abort,
>  };
>  
>  static struct v4l2_m2m_ops exynos4_jpeg_m2m_ops = {
>  	.device_run	= exynos4_jpeg_device_run,
>  	.job_ready	= s5p_jpeg_job_ready,
> -	.job_abort	= s5p_jpeg_job_abort,
>  };
>  
>  /*
> diff --git a/drivers/media/v4l2-core/v4l2-mem2mem.c b/drivers/media/v4l2-core/v4l2-mem2mem.c
> index c4f963d96a79..7bae19ca611e 100644
> --- a/drivers/media/v4l2-core/v4l2-mem2mem.c
> +++ b/drivers/media/v4l2-core/v4l2-mem2mem.c
> @@ -300,7 +300,8 @@ static void v4l2_m2m_cancel_job(struct v4l2_m2m_ctx *m2m_ctx)
>  	m2m_ctx->job_flags |= TRANS_ABORT;
>  	if (m2m_ctx->job_flags & TRANS_RUNNING) {
>  		spin_unlock_irqrestore(&m2m_dev->job_spinlock, flags);
> -		m2m_dev->m2m_ops->job_abort(m2m_ctx->priv);
> +		if (m2m_dev->m2m_ops->job_abort)
> +			m2m_dev->m2m_ops->job_abort(m2m_ctx->priv);
>  		dprintk("m2m_ctx %p running, will wait to complete", m2m_ctx);
>  		wait_event(m2m_ctx->finished,
>  				!(m2m_ctx->job_flags & TRANS_RUNNING));
> @@ -599,8 +600,7 @@ struct v4l2_m2m_dev *v4l2_m2m_init(const struct v4l2_m2m_ops *m2m_ops)
>  {
>  	struct v4l2_m2m_dev *m2m_dev;
>  
> -	if (!m2m_ops || WARN_ON(!m2m_ops->device_run) ||
> -			WARN_ON(!m2m_ops->job_abort))
> +	if (!m2m_ops || WARN_ON(!m2m_ops->device_run))
>  		return ERR_PTR(-EINVAL);
>  
>  	m2m_dev = kzalloc(sizeof *m2m_dev, GFP_KERNEL);
> diff --git a/include/media/v4l2-mem2mem.h b/include/media/v4l2-mem2mem.h
> index 8f4b208cfee7..c2d817d3ff42 100644
> --- a/include/media/v4l2-mem2mem.h
> +++ b/include/media/v4l2-mem2mem.h
> @@ -32,7 +32,7 @@
>   *		assumed that one source and one destination buffer are all
>   *		that is required for the driver to perform one full transaction.
>   *		This method may not sleep.
> - * @job_abort:	required. Informs the driver that it has to abort the currently
> + * @job_abort:	optional. Informs the driver that it has to abort the currently
>   *		running transaction as soon as possible (i.e. as soon as it can
>   *		stop the device safely; e.g. in the next interrupt handler),
>   *		even if the transaction would not have been finished by then.
> 

  reply	other threads:[~2018-06-15  8:43 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-06-14 15:34 [PATCH 0/3] mem2mem low-hanging fruit removal Ezequiel Garcia
2018-06-14 15:34 ` [PATCH 1/3] mem2mem: Remove unused v4l2_m2m_ops .lock/.unlock Ezequiel Garcia
2018-06-14 15:34 ` [PATCH 2/3] mem2mem: Make .job_abort optional Ezequiel Garcia
2018-06-15  8:43   ` Hans Verkuil [this message]
2018-06-15 19:20     ` Ezequiel Garcia
2018-06-14 15:34 ` [PATCH 3/3] rcar_vpu: Drop unneeded job_ready Ezequiel Garcia

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=326c082b-44e7-60d7-9d36-2d5f4713709f@xs4all.nl \
    --to=hverkuil@xs4all.nl \
    --cc=ezequiel@collabora.com \
    --cc=kernel@collabora.com \
    --cc=linux-media@vger.kernel.org \
    /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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.