Commit 0cc581bb authored by Hans Verkuil's avatar Hans Verkuil Committed by Greg Kroah-Hartman

media: vb2: fix vb2 state check when start_streaming fails

commit bf3593d9 upstream.

Commit bd994ddb (vb2: Fix stream start and
buffer completion race) broke the buffer state check in vb2_buffer_done.

So accept all three possible states there since I can no longer tell the
difference between vb2_buffer_done called from start_streaming or from
elsewhere.

Instead add a WARN_ON at the end of start_streaming that will check whether
any buffers were added to the done list, since that implies that the wrong
state was used as well.
Signed-off-by: default avatarHans Verkuil <hans.verkuil@cisco.com>
Acked-by: default avatarLaurent Pinchart <laurent.pinchart@ideasonboard.com>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@osg.samsung.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent dac6454d
...@@ -1161,13 +1161,10 @@ void vb2_buffer_done(struct vb2_buffer *vb, enum vb2_buffer_state state) ...@@ -1161,13 +1161,10 @@ void vb2_buffer_done(struct vb2_buffer *vb, enum vb2_buffer_state state)
if (WARN_ON(vb->state != VB2_BUF_STATE_ACTIVE)) if (WARN_ON(vb->state != VB2_BUF_STATE_ACTIVE))
return; return;
if (!q->start_streaming_called) { if (WARN_ON(state != VB2_BUF_STATE_DONE &&
if (WARN_ON(state != VB2_BUF_STATE_QUEUED)) state != VB2_BUF_STATE_ERROR &&
state = VB2_BUF_STATE_QUEUED; state != VB2_BUF_STATE_QUEUED))
} else if (WARN_ON(state != VB2_BUF_STATE_DONE &&
state != VB2_BUF_STATE_ERROR)) {
state = VB2_BUF_STATE_ERROR; state = VB2_BUF_STATE_ERROR;
}
#ifdef CONFIG_VIDEO_ADV_DEBUG #ifdef CONFIG_VIDEO_ADV_DEBUG
/* /*
...@@ -1774,6 +1771,12 @@ static int vb2_start_streaming(struct vb2_queue *q) ...@@ -1774,6 +1771,12 @@ static int vb2_start_streaming(struct vb2_queue *q)
/* Must be zero now */ /* Must be zero now */
WARN_ON(atomic_read(&q->owned_by_drv_count)); WARN_ON(atomic_read(&q->owned_by_drv_count));
} }
/*
* If done_list is not empty, then start_streaming() didn't call
* vb2_buffer_done(vb, VB2_BUF_STATE_QUEUED) but STATE_ERROR or
* STATE_DONE.
*/
WARN_ON(!list_empty(&q->done_list));
return ret; return ret;
} }
......
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