[v1] libcamera: request: addBuffer(): Do fence check earlier
diff mbox series

Message ID 20250120141657.95664-1-pobrn@protonmail.com
State New
Headers show
Series
  • [v1] libcamera: request: addBuffer(): Do fence check earlier
Related show

Commit Message

Barnabás Pőcze Jan. 20, 2025, 2:16 p.m. UTC
Check if the buffer has a fence before making any modifications because
otherwise it is possible for `Request::addBuffer()` to return an error code
while at the same time the buffer - for all intents and purposes - is added
to the request.

Signed-off-by: Barnabás Pőcze <pobrn@protonmail.com>
---
 src/libcamera/request.cpp | 18 +++++++++---------
 1 file changed, 9 insertions(+), 9 deletions(-)

Comments

Laurent Pinchart Jan. 21, 2025, 11:09 a.m. UTC | #1
Hi Barnabás,

Thank you for the patch.

On Mon, Jan 20, 2025 at 02:16:59PM +0000, Barnabás Pőcze wrote:
> Check if the buffer has a fence before making any modifications because
> otherwise it is possible for `Request::addBuffer()` to return an error code
> while at the same time the buffer - for all intents and purposes - is added
> to the request.
> 
> Signed-off-by: Barnabás Pőcze <pobrn@protonmail.com>

Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>

> ---
>  src/libcamera/request.cpp | 18 +++++++++---------
>  1 file changed, 9 insertions(+), 9 deletions(-)
> 
> diff --git a/src/libcamera/request.cpp b/src/libcamera/request.cpp
> index 5cfafea89..e7eb1c0c8 100644
> --- a/src/libcamera/request.cpp
> +++ b/src/libcamera/request.cpp
> @@ -466,6 +466,15 @@ int Request::addBuffer(const Stream *stream, FrameBuffer *buffer,
>  		return -EINVAL;
>  	}
>  
> +	/*
> +	 * Make sure the fence has been extracted from the buffer
> +	 * to avoid waiting on a stale fence.
> +	 */
> +	if (buffer->_d()->fence()) {
> +		LOG(Request, Error) << "Can't add buffer that still references a fence";
> +		return -EEXIST;
> +	}
> +
>  	auto it = bufferMap_.find(stream);
>  	if (it != bufferMap_.end()) {
>  		LOG(Request, Error) << "FrameBuffer already set for stream";
> @@ -476,15 +485,6 @@ int Request::addBuffer(const Stream *stream, FrameBuffer *buffer,
>  	_d()->pending_.insert(buffer);
>  	bufferMap_[stream] = buffer;
>  
> -	/*
> -	 * Make sure the fence has been extracted from the buffer
> -	 * to avoid waiting on a stale fence.
> -	 */
> -	if (buffer->_d()->fence()) {
> -		LOG(Request, Error) << "Can't add buffer that still references a fence";
> -		return -EEXIST;
> -	}
> -
>  	if (fence && fence->isValid())
>  		buffer->_d()->setFence(std::move(fence));
>

Patch
diff mbox series

diff --git a/src/libcamera/request.cpp b/src/libcamera/request.cpp
index 5cfafea89..e7eb1c0c8 100644
--- a/src/libcamera/request.cpp
+++ b/src/libcamera/request.cpp
@@ -466,6 +466,15 @@  int Request::addBuffer(const Stream *stream, FrameBuffer *buffer,
 		return -EINVAL;
 	}
 
+	/*
+	 * Make sure the fence has been extracted from the buffer
+	 * to avoid waiting on a stale fence.
+	 */
+	if (buffer->_d()->fence()) {
+		LOG(Request, Error) << "Can't add buffer that still references a fence";
+		return -EEXIST;
+	}
+
 	auto it = bufferMap_.find(stream);
 	if (it != bufferMap_.end()) {
 		LOG(Request, Error) << "FrameBuffer already set for stream";
@@ -476,15 +485,6 @@  int Request::addBuffer(const Stream *stream, FrameBuffer *buffer,
 	_d()->pending_.insert(buffer);
 	bufferMap_[stream] = buffer;
 
-	/*
-	 * Make sure the fence has been extracted from the buffer
-	 * to avoid waiting on a stale fence.
-	 */
-	if (buffer->_d()->fence()) {
-		LOG(Request, Error) << "Can't add buffer that still references a fence";
-		return -EEXIST;
-	}
-
 	if (fence && fence->isValid())
 		buffer->_d()->setFence(std::move(fence));