| From e4e70a147a48618a36ae1b81c641516cb9d45993 Mon Sep 17 00:00:00 2001 |
| From: Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com> |
| Date: Fri, 8 Jul 2016 06:20:51 -0300 |
| Subject: [media] v4l: vsp1: Prevent pipelines from running when not streaming |
| |
| From: Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com> |
| |
| commit e4e70a147a48618a36ae1b81c641516cb9d45993 upstream. |
| |
| Pipelines can only be run if all their video nodes are streaming. Commit |
| b4dfb9b35a19 ("[media] v4l: vsp1: Stop the pipeline upon the first |
| STREAMOFF") fixed the pipeline stop sequence, but introduced a race |
| condition that makes it possible to run a pipeline after stopping the |
| stream on a video node by queuing a buffer on the other side of the |
| pipeline. |
| |
| Fix this by clearing the buffers ready flag when stopping the stream, |
| which will prevent the QBUF handler from running the pipeline. |
| |
| Fixes: b4dfb9b35a19 ("[media] v4l: vsp1: Stop the pipeline upon the first STREAMOFF") |
| |
| Reported-by: Kieran Bingham <kieran@bingham.xyz> |
| Tested-by: Kieran Bingham <kieran@bingham.xyz> |
| Signed-off-by: Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com> |
| Signed-off-by: Mauro Carvalho Chehab <mchehab@s-opensource.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| drivers/media/platform/vsp1/vsp1_video.c | 7 +++++++ |
| 1 file changed, 7 insertions(+) |
| |
| --- a/drivers/media/platform/vsp1/vsp1_video.c |
| +++ b/drivers/media/platform/vsp1/vsp1_video.c |
| @@ -675,6 +675,13 @@ static void vsp1_video_stop_streaming(st |
| unsigned long flags; |
| int ret; |
| |
| + /* Clear the buffers ready flag to make sure the device won't be started |
| + * by a QBUF on the video node on the other side of the pipeline. |
| + */ |
| + spin_lock_irqsave(&video->irqlock, flags); |
| + pipe->buffers_ready &= ~(1 << video->pipe_index); |
| + spin_unlock_irqrestore(&video->irqlock, flags); |
| + |
| mutex_lock(&pipe->lock); |
| if (--pipe->stream_count == pipe->num_inputs) { |
| /* Stop the pipeline. */ |