media: vb2: core: Finish buffers at the end of the stream
authorSakari Ailus <sakari.ailus@linux.intel.com>
Fri, 2 Feb 2018 10:08:59 +0000 (05:08 -0500)
committerMauro Carvalho Chehab <mchehab@s-opensource.com>
Mon, 26 Feb 2018 13:02:52 +0000 (08:02 -0500)
If buffers were prepared or queued and the buffers were released without
starting the queue, the finish mem op (corresponding to the prepare mem
op) was never called to the buffers.

Before commit a136f59c0a1f there was no need to do this as in such a case
the prepare mem op had not been called yet. Address the problem by
explicitly calling finish mem op when the queue is stopped if the buffer
is in either prepared or queued state.

Fixes: a136f59c0a1f ("[media] vb2: Move buffer cache synchronisation to prepare from queue")
Cc: stable@vger.kernel.org # for v4.13 and up
Signed-off-by: Sakari Ailus <sakari.ailus@linux.intel.com>
Tested-by: Devin Heitmueller <dheitmueller@kernellabs.com>
Signed-off-by: Hans Verkuil <hans.verkuil@cisco.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@s-opensource.com>
drivers/media/common/videobuf2/videobuf2-core.c

index debe35fc66b4102559f4ea1ba5deb079be526b61..d3f7bb33a54dd1cd21e321757e5d1b54664f6024 100644 (file)
@@ -1696,6 +1696,15 @@ static void __vb2_queue_cancel(struct vb2_queue *q)
        for (i = 0; i < q->num_buffers; ++i) {
                struct vb2_buffer *vb = q->bufs[i];
 
+               if (vb->state == VB2_BUF_STATE_PREPARED ||
+                   vb->state == VB2_BUF_STATE_QUEUED) {
+                       unsigned int plane;
+
+                       for (plane = 0; plane < vb->num_planes; ++plane)
+                               call_void_memop(vb, finish,
+                                               vb->planes[plane].mem_priv);
+               }
+
                if (vb->state != VB2_BUF_STATE_DEQUEUED) {
                        vb->state = VB2_BUF_STATE_PREPARED;
                        call_void_vb_qop(vb, buf_finish, vb);