summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLaurent Pinchart <laurent.pinchart@ideasonboard.com>2014-06-03 17:41:06 -0300
committerMauro Carvalho Chehab <m.chehab@samsung.com>2014-07-17 12:55:09 -0300
commit9241650d62f79a3da01f1d5e8ebd195083330b75 (patch)
treec3b8ab85ba34a02a7dc28d95fc97637ef628ee30
parentbdc2df62ae38bbab044078f4d25a7a3d9e2379c9 (diff)
downloadlinux-stable-9241650d62f79a3da01f1d5e8ebd195083330b75.tar.gz
linux-stable-9241650d62f79a3da01f1d5e8ebd195083330b75.tar.bz2
linux-stable-9241650d62f79a3da01f1d5e8ebd195083330b75.zip
[media] v4l: vb2: Don't return POLLERR during transient buffer underruns
The V4L2 specification states that "When the application did not call VIDIOC_QBUF or VIDIOC_STREAMON yet the poll() function succeeds, but sets the POLLERR flag in the revents field." The vb2_poll() function sets POLLERR when the queued buffers list is empty, regardless of whether this is caused by the stream not being active yet, or by a transient buffer underrun. Bring the implementation in line with the specification by returning POLLERR if no buffer has been queued only when the queue is not streaming. Buffer underruns during streaming are not treated specially anymore and just result in poll() blocking until the next event. Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Acked-by: Hans Verkuil <hans.verkuil@cisco.com> Acked-by: Pawel Osciak <pawel@osciak.com> Signed-off-by: Mauro Carvalho Chehab <m.chehab@samsung.com>
-rw-r--r--drivers/media/v4l2-core/videobuf2-core.c5
1 files changed, 3 insertions, 2 deletions
diff --git a/drivers/media/v4l2-core/videobuf2-core.c b/drivers/media/v4l2-core/videobuf2-core.c
index 1d67e95311d6..1fc85fb964ce 100644
--- a/drivers/media/v4l2-core/videobuf2-core.c
+++ b/drivers/media/v4l2-core/videobuf2-core.c
@@ -2559,9 +2559,10 @@ unsigned int vb2_poll(struct vb2_queue *q, struct file *file, poll_table *wait)
}
/*
- * There is nothing to wait for if no buffers have already been queued.
+ * There is nothing to wait for if no buffer has been queued and the
+ * queue isn't streaming.
*/
- if (list_empty(&q->queued_list))
+ if (list_empty(&q->queued_list) && !vb2_is_streaming(q))
return res | POLLERR;
if (list_empty(&q->done_list))