[libcamera-devel] [PATCH 3/3] libcamera: v4l2_videodevice: Prevent queueing buffers without a cache
Kieran Bingham
kieran.bingham at ideasonboard.com
Mon Mar 8 17:22:41 CET 2021
Hi Laurent,
On 08/03/2021 15:05, Laurent Pinchart wrote:
> Hi Kieran,
>
> Thank you for the patch.
>
> On Wed, Mar 03, 2021 at 05:04:26PM +0000, Kieran Bingham wrote:
>> The v4l2 buffer cache allows us to map incoming buffers to an instance
>> of the V4L2 Buffer required to actually queue.
>>
>> If the cache_ is not available, then the buffers required to allow
>> queuing to a device have been released, and this indicates an issue at
>> the pipeline handler.
>>
>> This could be a common mistake, as it could happen if a pipeline handler
>> always requeues buffers to the device after they complete, without
>> checking if they are cancelled.
>>
>> That can then lead to trying to queue a buffer to a device which no
>> longer expects buffers, so add a loud message to indicate what has
>> happened but return an error without fatally crashing.
>
> As discussed in replies to the cover letter, this should be a fatal
> error. I'm fine relaxing to check with an error instead until we fix the
> IPU3 pipeline handler to avoid blocking IPA development. Could the
I don't mind it being fatal (and indeed, we've long ago discussed
letting FATAL continue in non-debug) ... so that's fine too.
> commit message be reworded to explain that this is a fatal error as it
> denotes a bug in the pipeline handler that can also likely result in
> other undefined behaviour, but that it's currently downgraded to a
> normal error to avoid blocking development ?
It looks like the IPU3 Pipeline handler is stopping the IPA /after/
stopping the video devices.
Taht's a bug there, so patch to hit the list soon, and JM is just
testing it on his side.
If that resolves this, I'll simply make a v2 of this one as Fatal.
--
Kieran
>
>> Signed-off-by: Kieran Bingham <kieran.bingham at ideasonboard.com>
>> ---
>> src/libcamera/v4l2_videodevice.cpp | 10 ++++++++++
>> 1 file changed, 10 insertions(+)
>>
>> diff --git a/src/libcamera/v4l2_videodevice.cpp b/src/libcamera/v4l2_videodevice.cpp
>> index c77e1aff7978..6129ce529afc 100644
>> --- a/src/libcamera/v4l2_videodevice.cpp
>> +++ b/src/libcamera/v4l2_videodevice.cpp
>> @@ -1390,6 +1390,16 @@ int V4L2VideoDevice::queueBuffer(FrameBuffer *buffer)
>> struct v4l2_buffer buf = {};
>> int ret;
>>
>> + /*
>> + * Pipeline handlers should not requeue buffers after releasing the
>> + * buffers on the device. Any occurence of this error should be fixed
>> + * in the pipeline handler directly.
>> + */
>> + if (!cache_) {
>
> /* \todo Make this a Fatal error */
>
> ?
>
>> + LOG(V4L2, Error) << "No BufferCache available to queue.";
>
> I'd write "No buffers allocated", or "Can't queue a buffer with no
> buffers allocated", as that's what is visible to pipeline handlers (the
> cache is an internal implementation detail).
>
> Reviewed-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>
>
>> + return -ENOENT;
>> + }
>> +
>> ret = cache_->get(*buffer);
>> if (ret < 0)
>> return ret;
>
--
Regards
--
Kieran
More information about the libcamera-devel
mailing list