| From dbe3c838841c240191362b722a7f1109ef1b077f Mon Sep 17 00:00:00 2001 |
| From: Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com> |
| Date: Mon, 23 Jun 2014 23:00:22 +0200 |
| Subject: v4l: vb2: Fix stream start and buffer completion race |
| |
| videobuf2 stores the driver streaming state internally in the queue in |
| the start_streaming_called variable. The state is set right after the |
| driver start_stream operation returns, and checked in the |
| vb2_buffer_done() function, typically called from the frame completion |
| interrupt handler. A race condition exists if the hardware finishes |
| processing the first frame before the start_stream operation returns. |
| |
| Fix this by setting start_streaming_called to 1 before calling the |
| start_stream operation, and resetting it to 0 if the operation fails. |
| |
| Signed-off-by: Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com> |
| (cherry picked from commit 752bfe5395aa0609def7292c97a37c314ace5837) |
| Signed-off-by: Simon Horman <horms+renesas@verge.net.au> |
| |
| Conflicts: |
| drivers/media/v4l2-core/videobuf2-core.c |
| --- |
| drivers/media/v4l2-core/videobuf2-core.c | 4 +++- |
| 1 file changed, 3 insertions(+), 1 deletion(-) |
| |
| --- a/drivers/media/v4l2-core/videobuf2-core.c |
| +++ b/drivers/media/v4l2-core/videobuf2-core.c |
| @@ -1429,12 +1429,14 @@ static int vb2_start_streaming(struct vb |
| __enqueue_in_driver(vb); |
| |
| /* Tell the driver to start streaming */ |
| + q->start_streaming_called = 1; |
| ret = call_qop(q, start_streaming, q, |
| atomic_read(&q->owned_by_drv_count)); |
| - q->start_streaming_called = ret == 0; |
| if (!ret) |
| return 0; |
| |
| + q->start_streaming_called = 0; |
| + |
| dprintk(1, "qbuf: driver refused to start streaming\n"); |
| if (WARN_ON(atomic_read(&q->owned_by_drv_count))) { |
| unsigned i; |