Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 9c0863b1 authored by Hans Verkuil's avatar Hans Verkuil Committed by Mauro Carvalho Chehab
Browse files

[media] vb2: call buf_finish from __queue_cancel



If a queue was canceled, then the buf_finish op was never called for the
pending buffers. So add this call to queue_cancel. Before calling buf_finish
set the buffer state to PREPARED, which is the correct state. That way the
states DONE and ERROR will only be seen in buf_finish if streaming is in
progress.

Since buf_finish can now be called from non-streaming state we need to
adapt the handful of drivers that actually need to know this.

Signed-off-by: default avatarHans Verkuil <hans.verkuil@cisco.com>
Acked-by: default avatarSakari Ailus <sakari.ailus@linux.intel.com>
Signed-off-by: default avatarMauro Carvalho Chehab <m.chehab@samsung.com>
parent 1a179481
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -674,6 +674,9 @@ static void buffer_finish(struct vb2_buffer *vb)
	int size = vb->vb2_queue->plane_sizes[0];
	int len;

	if (!vb2_is_streaming(vb->vb2_queue))
		return;

	mutex_lock(&qcam->lock);
	parport_claim_or_block(qcam->pdev);

+2 −1
Original line number Diff line number Diff line
@@ -337,6 +337,7 @@ static void buffer_finish(struct vb2_buffer *vb)
	list_del_init(&vip_buf->list);
	spin_unlock(&vip->lock);

	if (vb2_is_streaming(vb->vb2_queue))
		vip_active_buf_next(vip);
}

+2 −1
Original line number Diff line number Diff line
@@ -113,6 +113,7 @@ static void uvc_buffer_finish(struct vb2_buffer *vb)
			container_of(queue, struct uvc_streaming, queue);
	struct uvc_buffer *buf = container_of(vb, struct uvc_buffer, buf);

	if (vb->state == VB2_BUF_STATE_DONE)
		uvc_video_clock_update(stream, &vb->v4l2_buf, buf);
}

+15 −2
Original line number Diff line number Diff line
@@ -1929,9 +1929,22 @@ static void __vb2_queue_cancel(struct vb2_queue *q)

	/*
	 * Reinitialize all buffers for next use.
	 * Make sure to call buf_finish for any queued buffers. Normally
	 * that's done in dqbuf, but that's not going to happen when we
	 * cancel the whole queue. Note: this code belongs here, not in
	 * __vb2_dqbuf() since in vb2_internal_dqbuf() there is a critical
	 * call to __fill_v4l2_buffer() after buf_finish(). That order can't
	 * be changed, so we can't move the buf_finish() to __vb2_dqbuf().
	 */
	for (i = 0; i < q->num_buffers; ++i)
		__vb2_dqbuf(q->bufs[i]);
	for (i = 0; i < q->num_buffers; ++i) {
		struct vb2_buffer *vb = q->bufs[i];

		if (vb->state != VB2_BUF_STATE_DEQUEUED) {
			vb->state = VB2_BUF_STATE_PREPARED;
			call_vb_qop(vb, buf_finish, vb);
		}
		__vb2_dqbuf(vb);
	}
}

static int vb2_internal_streamon(struct vb2_queue *q, enum v4l2_buf_type type)
+9 −1
Original line number Diff line number Diff line
@@ -276,7 +276,15 @@ struct vb2_buffer {
 *			in driver; optional
 * @buf_finish:		called before every dequeue of the buffer back to
 *			userspace; drivers may perform any operations required
 *			before userspace accesses the buffer; optional
 *			before userspace accesses the buffer; optional. The
 *			buffer state can be one of the following: DONE and
 *			ERROR occur while streaming is in progress, and the
 *			PREPARED state occurs when the queue has been canceled
 *			and all pending buffers are being returned to their
 *			default DEQUEUED state. Typically you only have to do
 *			something if the state is VB2_BUF_STATE_DONE, since in
 *			all other cases the buffer contents will be ignored
 *			anyway.
 * @buf_cleanup:	called once before the buffer is freed; drivers may
 *			perform any additional cleanup; optional
 * @start_streaming:	called once to enter 'streaming' state; the driver may