vb2: fix vb2_poll for output streams
PATCH 1/1 vb2: fix vb2_poll for output streams
vb2_poll should always return POLLOUT | POLLWRNORM as long as there are fewer buffers queued than there are buffers available. Poll for an output stream should only wait if all buffers are queued and nobody is dequeuing them.
Signed-off-by Hans Verkuil <[email protected]>
--- drivers/media/v4l2-core/videobuf2-core.c | 7 +++++++ 1 file changed, 7 insertions(+)
drivers/media/v4l2-core/videobuf2-core.c +7 -0
@@ -2596,6 +2596,13 @@ unsigned int vb2_poll(struct vb2_queue *q, struct file *file, poll_table *wait)if ((list_empty (&q->queued_list) && !vb2_is_streaming (q)) || q->error)return res |POLLERR ; +/* +* For output streams you can write as long as there are fewer buffers +* queued than there are buffers available. +*/ +if (V4L2_TYPE_IS_OUTPUT (q->type) && q->queued_count < q->num_buffers) +return res |POLLOUT |POLLWRNORM ; +if (list_empty (&q->done_list))poll_wait (file, &q->done_wq, wait);
Signature · 1 line
2.0.0.rc0
Hello,
Quoted 6 lines · Hans Verkuil
vb2_pollshould always return POLLOUT | POLLWRNORM as long as there are fewer buffers queued than there are buffers available. Poll for an output stream should only wait if all buffers are queued and nobody is dequeuing them.Signed-off-by Hans Verkuil <[email protected]>
Acked-by Marek Szyprowski <[email protected]>
Quoted 12 lines
--- drivers/media/v4l2-core/videobuf2-core.c | 7 +++++++ 1 file changed, 7 insertions(+)drivers/media/v4l2-core/videobuf2-core.c +0
-0@@ -2596,6 +2596,13 @@ unsigned int vb2_poll(struct vb2_queue *q, struct file *file, poll_table *wait)if ((list_empty (&q->queued_list) && !vb2_is_streaming (q)) || q->error)return res |POLLERR ;
drivers/media/v4l2-core/videobuf2-core.c unsigned int vb2_poll(struct vb2_queue *q, struct file *file, poll_table *wait) · line 2608
Quoted 10 lines
drivers/media/v4l2-core/videobuf2-core.c +7
-0+/* +* For output streams you can write as long as there are fewer buffers +* queued than there are buffers available. +*/ +if (V4L2_TYPE_IS_OUTPUT (q->type) && q->queued_count < q->num_buffers) +return res |POLLOUT |POLLWRNORM ; +if (list_empty (&q->done_list))poll_wait (file, &q->done_wq, wait);
Best regards
Signature · 2 lines
Marek Szyprowski, PhD Samsung R&D Institute Poland