]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/commitdiff
3.10-stable patches
authorGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Mon, 6 Oct 2014 15:43:20 +0000 (08:43 -0700)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Mon, 6 Oct 2014 15:43:20 +0000 (08:43 -0700)
added patches:
media-vb2-fix-vbi-poll-regression.patch

queue-3.10/media-vb2-fix-vbi-poll-regression.patch [new file with mode: 0644]
queue-3.10/series

diff --git a/queue-3.10/media-vb2-fix-vbi-poll-regression.patch b/queue-3.10/media-vb2-fix-vbi-poll-regression.patch
new file mode 100644 (file)
index 0000000..f54c47e
--- /dev/null
@@ -0,0 +1,105 @@
+From 58d75f4b1ce26324b4d809b18f94819843a98731 Mon Sep 17 00:00:00 2001
+From: Hans Verkuil <hans.verkuil@cisco.com>
+Date: Sat, 20 Sep 2014 16:16:35 -0300
+Subject: media: vb2: fix VBI/poll regression
+
+From: Hans Verkuil <hans.verkuil@cisco.com>
+
+commit 58d75f4b1ce26324b4d809b18f94819843a98731 upstream.
+
+The recent conversion of saa7134 to vb2 unconvered a poll() bug that
+broke the teletext applications alevt and mtt. These applications
+expect that calling poll() without having called VIDIOC_STREAMON will
+cause poll() to return POLLERR. That did not happen in vb2.
+
+This patch fixes that behavior. It also fixes what should happen when
+poll() is called when STREAMON is called but no buffers have been
+queued. In that case poll() will also return POLLERR, but only for
+capture queues since output queues will always return POLLOUT
+anyway in that situation.
+
+This brings the vb2 behavior in line with the old videobuf behavior.
+
+Signed-off-by: Hans Verkuil <hans.verkuil@cisco.com>
+Acked-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
+Signed-off-by: Mauro Carvalho Chehab <mchehab@osg.samsung.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ drivers/media/v4l2-core/videobuf2-core.c |   15 +++++++++++++--
+ include/media/videobuf2-core.h           |    4 ++++
+ 2 files changed, 17 insertions(+), 2 deletions(-)
+
+--- a/drivers/media/v4l2-core/videobuf2-core.c
++++ b/drivers/media/v4l2-core/videobuf2-core.c
+@@ -666,6 +666,7 @@ static int __reqbufs(struct vb2_queue *q
+        * to the userspace.
+        */
+       req->count = allocated_buffers;
++      q->waiting_for_buffers = !V4L2_TYPE_IS_OUTPUT(q->type);
+       return 0;
+ }
+@@ -714,6 +715,7 @@ static int __create_bufs(struct vb2_queu
+               memset(q->plane_sizes, 0, sizeof(q->plane_sizes));
+               memset(q->alloc_ctx, 0, sizeof(q->alloc_ctx));
+               q->memory = create->memory;
++              q->waiting_for_buffers = !V4L2_TYPE_IS_OUTPUT(q->type);
+       }
+       num_buffers = min(create->count, VIDEO_MAX_FRAME - q->num_buffers);
+@@ -1355,6 +1357,7 @@ int vb2_qbuf(struct vb2_queue *q, struct
+        * dequeued in dqbuf.
+        */
+       list_add_tail(&vb->queued_entry, &q->queued_list);
++      q->waiting_for_buffers = false;
+       vb->state = VB2_BUF_STATE_QUEUED;
+       /*
+@@ -1724,6 +1727,7 @@ int vb2_streamoff(struct vb2_queue *q, e
+        * and videobuf, effectively returning control over them to userspace.
+        */
+       __vb2_queue_cancel(q);
++      q->waiting_for_buffers = !V4L2_TYPE_IS_OUTPUT(q->type);
+       dprintk(3, "Streamoff successful\n");
+       return 0;
+@@ -2009,9 +2013,16 @@ unsigned int vb2_poll(struct vb2_queue *
+       }
+       /*
+-       * There is nothing to wait for if no buffers have already been queued.
++       * There is nothing to wait for if the queue isn't streaming.
+        */
+-      if (list_empty(&q->queued_list))
++      if (!vb2_is_streaming(q))
++              return res | POLLERR;
++      /*
++       * For compatibility with vb1: if QBUF hasn't been called yet, then
++       * return POLLERR as well. This only affects capture queues, output
++       * queues will always initialize waiting_for_buffers to false.
++       */
++      if (q->waiting_for_buffers)
+               return res | POLLERR;
+       if (list_empty(&q->done_list))
+--- a/include/media/videobuf2-core.h
++++ b/include/media/videobuf2-core.h
+@@ -318,6 +318,9 @@ struct v4l2_fh;
+  * @done_wq:  waitqueue for processes waiting for buffers ready to be dequeued
+  * @alloc_ctx:        memory type/allocator-specific contexts for each plane
+  * @streaming:        current streaming state
++ * @waiting_for_buffers: used in poll() to check if vb2 is still waiting for
++ *            buffers. Only set for capture queues if qbuf has not yet been
++ *            called since poll() needs to return POLLERR in that situation.
+  * @fileio:   file io emulator internal data, used only if emulator is active
+  */
+ struct vb2_queue {
+@@ -350,6 +353,7 @@ struct vb2_queue {
+       unsigned int                    plane_sizes[VIDEO_MAX_PLANES];
+       unsigned int                    streaming:1;
++      unsigned int                    waiting_for_buffers:1;
+       struct vb2_fileio_data          *fileio;
+ };
index b7ddf1c0ddd1dc3cbd509e062f0e6573e50b6c7c..a2db7bc7032ee73bc6b65c1101294332f0d4beed 100644 (file)
@@ -4,3 +4,4 @@ init-kconfig-fix-have_futex_cmpxchg-to-not-break-up-the-expert-menu.patch
 ring-buffer-fix-infinite-spin-in-reading-buffer.patch
 mm-thp-move-invariant-bug-check-out-of-loop-in-__split_huge_page_map.patch
 mm-numa-do-not-mark-ptes-pte_numa-when-splitting-huge-pages.patch
+media-vb2-fix-vbi-poll-regression.patch