From: Greg Kroah-Hartman Date: Mon, 6 Oct 2014 15:43:24 +0000 (-0700) Subject: 3.16-stable patches X-Git-Tag: v3.10.57~16 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=21c94c82dbb32c7913b29777a656f1ab2ef09291;p=thirdparty%2Fkernel%2Fstable-queue.git 3.16-stable patches added patches: media-vb2-fix-vbi-poll-regression.patch --- diff --git a/queue-3.16/media-vb2-fix-vbi-poll-regression.patch b/queue-3.16/media-vb2-fix-vbi-poll-regression.patch new file mode 100644 index 00000000000..448bd73a323 --- /dev/null +++ b/queue-3.16/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 +@@ -967,6 +967,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; + } +@@ -1014,6 +1015,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); +@@ -1812,6 +1814,7 @@ static int vb2_internal_qbuf(struct vb2_ + */ + list_add_tail(&vb->queued_entry, &q->queued_list); + q->queued_count++; ++ q->waiting_for_buffers = false; + vb->state = VB2_BUF_STATE_QUEUED; + if (V4L2_TYPE_IS_OUTPUT(q->type)) { + /* +@@ -2244,6 +2247,7 @@ static int vb2_internal_streamoff(struct + * their normal dequeued state. + */ + __vb2_queue_cancel(q); ++ q->waiting_for_buffers = !V4L2_TYPE_IS_OUTPUT(q->type); + + dprintk(3, "successful\n"); + return 0; +@@ -2562,9 +2566,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 +@@ -375,6 +375,9 @@ struct v4l2_fh; + * @streaming: current streaming state + * @start_streaming_called: start_streaming() was called successfully and we + * started streaming. ++ * @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 + * @threadio: thread io internal data, used only if thread is active + */ +@@ -411,6 +414,7 @@ struct vb2_queue { + + unsigned int streaming:1; + unsigned int start_streaming_called:1; ++ unsigned int waiting_for_buffers:1; + + struct vb2_fileio_data *fileio; + struct vb2_threadio_data *threadio; diff --git a/queue-3.16/series b/queue-3.16/series index 7949c92646f..57225d84831 100644 --- a/queue-3.16/series +++ b/queue-3.16/series @@ -22,3 +22,4 @@ x86-ia64-move-efi_fb-vga_default_device-initialization-to-pci_vga_fixup.patch vgaarb-don-t-default-exclusively-to-first-video-device-with-mem-io.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