]> git.proxmox.com Git - mirror_ubuntu-hirsute-kernel.git/commitdiff
media: videobuf2-core: don't call memop 'finish' when queueing
authorHans Verkuil <hans.verkuil@cisco.com>
Mon, 21 May 2018 12:43:02 +0000 (08:43 -0400)
committerMauro Carvalho Chehab <mchehab+samsung@kernel.org>
Mon, 28 May 2018 19:51:46 +0000 (15:51 -0400)
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>
drivers/media/common/videobuf2/videobuf2-core.c

index d3f7bb33a54dd1cd21e321757e5d1b54664f6024..f32ec7342ef0ff52d6f8b2d0b1df6d762f1c45bb 100644 (file)
@@ -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",
                        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 ||