4.16-stable review patch.  If anyone has any objections, please let me know.

------------------

From: Sakari Ailus <[email protected]>

commit 03703ed1debf777ea845aa9b50ba2e80a5e7dd3c upstream.

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: [email protected] # for v4.13 and up
Signed-off-by: Sakari Ailus <[email protected]>
Tested-by: Devin Heitmueller <[email protected]>
Signed-off-by: Hans Verkuil <[email protected]>
Signed-off-by: Mauro Carvalho Chehab <[email protected]>
Signed-off-by: Greg Kroah-Hartman <[email protected]>

---
 drivers/media/common/videobuf2/videobuf2-core.c |    9 +++++++++
 1 file changed, 9 insertions(+)

--- a/drivers/media/common/videobuf2/videobuf2-core.c
+++ b/drivers/media/common/videobuf2/videobuf2-core.c
@@ -1696,6 +1696,15 @@ static void __vb2_queue_cancel(struct vb
        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);


Reply via email to