| From foo@baz Sat Jul 28 10:25:26 CEST 2018 |
| From: Hans Verkuil <hans.verkuil@cisco.com> |
| Date: Mon, 21 May 2018 08:43:02 -0400 |
| Subject: media: videobuf2-core: don't call memop 'finish' when queueing |
| |
| From: Hans Verkuil <hans.verkuil@cisco.com> |
| |
| [ Upstream commit 90b2da89a083e1395cb322521a42397c49ae4500 ] |
| |
| 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> |
| Signed-off-by: Sasha Levin <alexander.levin@microsoft.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| drivers/media/v4l2-core/videobuf2-core.c | 9 ++++++--- |
| 1 file changed, 6 insertions(+), 3 deletions(-) |
| |
| --- a/drivers/media/v4l2-core/videobuf2-core.c |
| +++ b/drivers/media/v4l2-core/videobuf2-core.c |
| @@ -912,9 +912,12 @@ void vb2_buffer_done(struct vb2_buffer * |
| dprintk(4, "done processing on buffer %d, state: %d\n", |
| vb->index, state); |
| |
| - /* sync buffers */ |
| - for (plane = 0; plane < vb->num_planes; ++plane) |
| - call_void_memop(vb, finish, vb->planes[plane].mem_priv); |
| + if (state != VB2_BUF_STATE_QUEUED && |
| + state != VB2_BUF_STATE_REQUEUEING) { |
| + /* 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); |
| if (state == VB2_BUF_STATE_QUEUED || |