Commit e4e70a14 authored by Laurent Pinchart's avatar Laurent Pinchart Committed by Mauro Carvalho Chehab

[media] v4l: vsp1: Prevent pipelines from running when not streaming

Pipelines can only be run if all their video nodes are streaming. Commit
b4dfb9b3 ("[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: b4dfb9b3 ("[media] v4l: vsp1: Stop the pipeline upon the first STREAMOFF")
Reported-by: default avatarKieran Bingham <kieran@bingham.xyz>
Tested-by: default avatarKieran Bingham <kieran@bingham.xyz>
Signed-off-by: default avatarLaurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@s-opensource.com>
parent 3c3ba545
...@@ -675,6 +675,13 @@ static void vsp1_video_stop_streaming(struct vb2_queue *vq) ...@@ -675,6 +675,13 @@ static void vsp1_video_stop_streaming(struct vb2_queue *vq)
unsigned long flags; unsigned long flags;
int ret; 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); mutex_lock(&pipe->lock);
if (--pipe->stream_count == pipe->num_inputs) { if (--pipe->stream_count == pipe->num_inputs) {
/* Stop the pipeline. */ /* Stop the pipeline. */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment