[PATCH v4 3/3] libcamera: software_isp: Clean up pending requests on stop
Kieran Bingham
kieran.bingham at ideasonboard.com
Fri Oct 18 23:33:45 CEST 2024
Quoting Milan Zamazal (2024-10-18 10:27:16)
> PipelineHandler::stop() calls stopDevice() method to perform pipeline
> specific cleanup and then completes waiting requests. If any queued
> requests remain, an assertion error is raised.
>
> Software ISP stores request buffers in
> SimpleCameraData::conversionQueue_ and queues them as V4L2 signals
> bufferReady. stopDevice() cleanup forgets to clean up the buffers and
> their requests from conversionQueue_, possibly resulting in the
> assertion error. This patch fixes the omission.
>
> The problem wasn't very visible when
> SimplePipelineHandler::kNumInternalBuffers (the number of buffers
> allocated in V4L2) was equal to the number of buffers exported from
> software ISP. But when the number of the exported buffers was increased
> by one in commit abe2ec64f9e4e97bbdfe3a50372611bd7b5315c2, the assertion
> error started pop up in some environments. Increasing the number of the
> buffers much more, e.g. to 9, makes the problem very reproducible.
>
> Each pipeline uses its own mechanism to track the requests to clean up
> and it can't be excluded that similar omissions are present in other
> places. But there is no obvious way to make a common cleanup for all
> the pipelines (except for doing it instead of raising the assertion
> error, which is probably undesirable, in order not to hide incomplete
> pipeline specific cleanups).
Indeed, that's why I added the assertion in the common place instead
of a generic cleanup.
Reviewed-by: Kieran Bingham <kieran.bingham at ideasonboard.com>
Tested-by: Kieran Bingham <kieran.bingham at ideasonboard.com>
>
> Bug: https://bugs.libcamera.org/show_bug.cgi?id=234
> Signed-off-by: Milan Zamazal <mzamazal at redhat.com>
> ---
> src/libcamera/pipeline/simple/simple.cpp | 10 ++++++++++
> 1 file changed, 10 insertions(+)
>
> diff --git a/src/libcamera/pipeline/simple/simple.cpp b/src/libcamera/pipeline/simple/simple.cpp
> index a1339d87c..995223364 100644
> --- a/src/libcamera/pipeline/simple/simple.cpp
> +++ b/src/libcamera/pipeline/simple/simple.cpp
> @@ -284,6 +284,7 @@ public:
> std::vector<std::unique_ptr<FrameBuffer>> conversionBuffers_;
> std::queue<std::pair<Request *, std::map<const Stream *, FrameBuffer *>>> conversionQueue_;
> bool useConversion_;
> + void clearIncompleteRequests();
>
> std::unique_ptr<Converter> converter_;
> std::unique_ptr<SoftwareIsp> swIsp_;
> @@ -893,6 +894,14 @@ void SimpleCameraData::conversionOutputDone(FrameBuffer *buffer)
> pipe->completeRequest(request);
> }
>
> +void SimpleCameraData::clearIncompleteRequests()
> +{
> + while (!conversionQueue_.empty()) {
> + pipe()->cancelRequest(conversionQueue_.front().first);
> + conversionQueue_.pop();
> + }
> +}
> +
> void SimpleCameraData::ispStatsReady(uint32_t frame, uint32_t bufferId)
> {
> swIsp_->processStats(frame, bufferId,
> @@ -1402,6 +1411,7 @@ void SimplePipelineHandler::stopDevice(Camera *camera)
>
> video->bufferReady.disconnect(data, &SimpleCameraData::bufferReady);
>
> + data->clearIncompleteRequests();
> data->conversionBuffers_.clear();
>
> releasePipeline(data);
> --
> 2.44.1
>
More information about the libcamera-devel
mailing list