[RFC,2/2] media: v4l2-mem2mem: return for polling if a buffer is available

Message ID 1364798447-32224-3-git-send-email-sw0312.kim@samsung.com (mailing list archive)
State RFC, archived
Headers

Commit Message

Seung-Woo Kim April 1, 2013, 6:40 a.m. UTC
  The v4l2_m2m_poll() does not need to wait if there is already a buffer in
done_list of source and destination queues, but current v4l2_m2m_poll() always
waits. So done_list of each queue is checked before calling poll_wait().

Signed-off-by: Seung-Woo Kim <sw0312.kim@samsung.com>
---
 drivers/media/v4l2-core/v4l2-mem2mem.c |    6 ++++--
 1 files changed, 4 insertions(+), 2 deletions(-)
  

Comments

Marek Szyprowski May 7, 2013, 1:43 p.m. UTC | #1
Hello,

On 4/1/2013 8:40 AM, Seung-Woo Kim wrote:
> The v4l2_m2m_poll() does not need to wait if there is already a buffer in
> done_list of source and destination queues, but current v4l2_m2m_poll() always
> waits. So done_list of each queue is checked before calling poll_wait().
>
> Signed-off-by: Seung-Woo Kim <sw0312.kim@samsung.com>

Right now I have no idea how to fix this better than it has been 
proposed in your patch. I wonder what will happen if the device doesn't 
release both source and destination buffers at the same time, but this 
situation is purely hypothetical as there is no driver which does it 
such way, therefore:

Acked-by: Marek Szyprowski <m.szyprowski@samsung.com>

Sorry for a long delay, I had to find some time to analyze the code.

> ---
>   drivers/media/v4l2-core/v4l2-mem2mem.c |    6 ++++--
>   1 files changed, 4 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/media/v4l2-core/v4l2-mem2mem.c b/drivers/media/v4l2-core/v4l2-mem2mem.c
> index da99cf7..b6f0316 100644
> --- a/drivers/media/v4l2-core/v4l2-mem2mem.c
> +++ b/drivers/media/v4l2-core/v4l2-mem2mem.c
> @@ -458,8 +458,10 @@ unsigned int v4l2_m2m_poll(struct file *file, struct v4l2_m2m_ctx *m2m_ctx,
>   	if (m2m_ctx->m2m_dev->m2m_ops->unlock)
>   		m2m_ctx->m2m_dev->m2m_ops->unlock(m2m_ctx->priv);
>   
> -	poll_wait(file, &src_q->done_wq, wait);
> -	poll_wait(file, &dst_q->done_wq, wait);
> +	if (list_empty(&src_q->done_list))
> +		poll_wait(file, &src_q->done_wq, wait);
> +	if (list_empty(&dst_q->done_list))
> +		poll_wait(file, &dst_q->done_wq, wait);
>   
>   	if (m2m_ctx->m2m_dev->m2m_ops->lock)
>   		m2m_ctx->m2m_dev->m2m_ops->lock(m2m_ctx->priv);

Best regards
  

Patch

diff --git a/drivers/media/v4l2-core/v4l2-mem2mem.c b/drivers/media/v4l2-core/v4l2-mem2mem.c
index da99cf7..b6f0316 100644
--- a/drivers/media/v4l2-core/v4l2-mem2mem.c
+++ b/drivers/media/v4l2-core/v4l2-mem2mem.c
@@ -458,8 +458,10 @@  unsigned int v4l2_m2m_poll(struct file *file, struct v4l2_m2m_ctx *m2m_ctx,
 	if (m2m_ctx->m2m_dev->m2m_ops->unlock)
 		m2m_ctx->m2m_dev->m2m_ops->unlock(m2m_ctx->priv);
 
-	poll_wait(file, &src_q->done_wq, wait);
-	poll_wait(file, &dst_q->done_wq, wait);
+	if (list_empty(&src_q->done_list))
+		poll_wait(file, &src_q->done_wq, wait);
+	if (list_empty(&dst_q->done_list))
+		poll_wait(file, &dst_q->done_wq, wait);
 
 	if (m2m_ctx->m2m_dev->m2m_ops->lock)
 		m2m_ctx->m2m_dev->m2m_ops->lock(m2m_ctx->priv);