From: Greg Kroah-Hartman Date: Mon, 6 Oct 2014 15:43:20 +0000 (-0700) Subject: 3.10-stable patches X-Git-Tag: v3.10.57~18 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=8a79d2b0db1f435b33a4733f98eb70ee2d272793;p=thirdparty%2Fkernel%2Fstable-queue.git 3.10-stable patches added patches: media-vb2-fix-vbi-poll-regression.patch --- 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 index 00000000000..f54c47e31f7 --- /dev/null +++ b/queue-3.10/media-vb2-fix-vbi-poll-regression.patch @@ -0,0 +1,105 @@ +From 58d75f4b1ce26324b4d809b18f94819843a98731 Mon Sep 17 00:00:00 2001 +From: Hans Verkuil +Date: Sat, 20 Sep 2014 16:16:35 -0300 +Subject: media: vb2: fix VBI/poll regression + +From: Hans Verkuil + +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 +Acked-by: Laurent Pinchart +Signed-off-by: Mauro Carvalho Chehab +Signed-off-by: Greg Kroah-Hartman + +--- + 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; + }; diff --git a/queue-3.10/series b/queue-3.10/series index b7ddf1c0ddd..a2db7bc7032 100644 --- a/queue-3.10/series +++ b/queue-3.10/series @@ -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