media: videobuf2-core: don't call memop 'finish' when queueing
When a buffer is queued or requeued in vb2_buffer_done, then don't call the finish memop. In this case the buffer is only returned to vb2, not to userspace. Calling 'finish' here will cause an unbalance when the queue is canceled, since the core will call the same memop again. Signed-off-by: Hans Verkuil <hans.verkuil@cisco.com> Signed-off-by: Mauro Carvalho Chehab <mchehab+samsung@kernel.org>
This commit is contained in:
Родитель
a024ee14cd
Коммит
90b2da89a0
|
@ -916,9 +916,12 @@ void vb2_buffer_done(struct vb2_buffer *vb, enum vb2_buffer_state state)
|
||||||
dprintk(4, "done processing on buffer %d, state: %d\n",
|
dprintk(4, "done processing on buffer %d, state: %d\n",
|
||||||
vb->index, state);
|
vb->index, state);
|
||||||
|
|
||||||
/* sync buffers */
|
if (state != VB2_BUF_STATE_QUEUED &&
|
||||||
for (plane = 0; plane < vb->num_planes; ++plane)
|
state != VB2_BUF_STATE_REQUEUEING) {
|
||||||
call_void_memop(vb, finish, vb->planes[plane].mem_priv);
|
/* sync buffers */
|
||||||
|
for (plane = 0; plane < vb->num_planes; ++plane)
|
||||||
|
call_void_memop(vb, finish, vb->planes[plane].mem_priv);
|
||||||
|
}
|
||||||
|
|
||||||
spin_lock_irqsave(&q->done_lock, flags);
|
spin_lock_irqsave(&q->done_lock, flags);
|
||||||
if (state == VB2_BUF_STATE_QUEUED ||
|
if (state == VB2_BUF_STATE_QUEUED ||
|
||||||
|
|
Загрузка…
Ссылка в новой задаче