Commit 1d8aaa86 authored by Hans Verkuil's avatar Hans Verkuil
Browse files

media: videobuf2-core: update vb2_thread if wait_finish/prepare are NULL



The vb2_thread is used for DVB support. This will queue and dequeue buffers
automatically.

It calls wait_finish/prepare around vb2_core_dqbuf() and vb2_core_qbuf(),
but that assumes all drivers have these ops set. But that will change
due to commit 88785982 ("media: vb2: use lock if wait_prepare/finish
are NULL").

So instead just check if the callback is available, and if not, use
q->lock, just as __vb2_wait_for_done_vb() does.

Signed-off-by: default avatarHans Verkuil <hverkuil@xs4all.nl>
Reviewed-by: default avatarMauro Carvalho Chehab <mchehab+huawei@kernel.org>
parent c9ec6f17
Loading
Loading
Loading
Loading
+20 −6
Original line number Diff line number Diff line
@@ -3218,10 +3218,17 @@ static int vb2_thread(void *data)
				continue;
			prequeue--;
		} else {
			if (!threadio->stop) {
				if (q->ops->wait_finish)
					call_void_qop(q, wait_finish, q);
			if (!threadio->stop)
				else if (q->lock)
					mutex_lock(q->lock);
				ret = vb2_core_dqbuf(q, &index, NULL, 0);
				if (q->ops->wait_prepare)
					call_void_qop(q, wait_prepare, q);
				else if (q->lock)
					mutex_unlock(q->lock);
			}
			dprintk(q, 5, "file io: vb2_dqbuf result: %d\n", ret);
			if (!ret)
				vb = vb2_get_buffer(q, index);
@@ -3233,12 +3240,19 @@ static int vb2_thread(void *data)
		if (vb->state != VB2_BUF_STATE_ERROR)
			if (threadio->fnc(vb, threadio->priv))
				break;
		call_void_qop(q, wait_finish, q);
		if (copy_timestamp)
			vb->timestamp = ktime_get_ns();
		if (!threadio->stop)
		if (!threadio->stop) {
			if (q->ops->wait_finish)
				call_void_qop(q, wait_finish, q);
			else if (q->lock)
				mutex_lock(q->lock);
			ret = vb2_core_qbuf(q, vb, NULL, NULL);
			if (q->ops->wait_prepare)
				call_void_qop(q, wait_prepare, q);
			else if (q->lock)
				mutex_unlock(q->lock);
		}
		if (ret || threadio->stop)
			break;
	}