Message ID | 1364798447-32224-3-git-send-email-sw0312.kim@samsung.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
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
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);
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(-)