[libcamera-devel] libcamera: v4l2_videodevice: Guard against releasing unallocated buffers
diff mbox series

Message ID 20221028133847.12944-1-naush@raspberrypi.com
State Accepted
Commit a2bdff6d0b67475492ac7cf9318866b6d89a28fd
Headers show
Series
  • [libcamera-devel] libcamera: v4l2_videodevice: Guard against releasing unallocated buffers
Related show

Commit Message

Naushir Patuck Oct. 28, 2022, 1:38 p.m. UTC
releaseBuffers() unconditionally calls ioctl(REQBUFS, 0) to release device
buffer allocations through the close() and class destructor functions. If
another libcamera process is running concurrently with a different sensor, it
would cause the ioctl to fail in the kernel because the buffer queue is owned
owned by the other process. This in turn would cause libcamera to generate an
error log message.

Fix this by ensuring the releaseBuffers() only calls ioctl(REQBUFS, 0) if there
have been buffers previously allocated by the device. This is done by testing
the presense of the V4L2BufferCache in the object.

Signed-off-by: Naushir Patuck <naush@raspberrypi.com>
---
 src/libcamera/v4l2_videodevice.cpp | 3 +++
 1 file changed, 3 insertions(+)

Comments

David Plowman Oct. 28, 2022, 1:40 p.m. UTC | #1
Hi Naush

Thanks for the update!

On Fri, 28 Oct 2022 at 14:38, Naushir Patuck via libcamera-devel
<libcamera-devel@lists.libcamera.org> wrote:
>
> releaseBuffers() unconditionally calls ioctl(REQBUFS, 0) to release device
> buffer allocations through the close() and class destructor functions. If
> another libcamera process is running concurrently with a different sensor, it
> would cause the ioctl to fail in the kernel because the buffer queue is owned
> owned by the other process. This in turn would cause libcamera to generate an
> error log message.
>
> Fix this by ensuring the releaseBuffers() only calls ioctl(REQBUFS, 0) if there
> have been buffers previously allocated by the device. This is done by testing
> the presense of the V4L2BufferCache in the object.
>
> Signed-off-by: Naushir Patuck <naush@raspberrypi.com>

Tested-by: David Plowman <david.plowman@raspberrypi.com>

Thanks!
David

> ---
>  src/libcamera/v4l2_videodevice.cpp | 3 +++
>  1 file changed, 3 insertions(+)
>
> diff --git a/src/libcamera/v4l2_videodevice.cpp b/src/libcamera/v4l2_videodevice.cpp
> index e30858c9fa02..0d60dbd1c23d 100644
> --- a/src/libcamera/v4l2_videodevice.cpp
> +++ b/src/libcamera/v4l2_videodevice.cpp
> @@ -1533,6 +1533,9 @@ int V4L2VideoDevice::importBuffers(unsigned int count)
>   */
>  int V4L2VideoDevice::releaseBuffers()
>  {
> +       if (!cache_)
> +               return 0;
> +
>         LOG(V4L2, Debug) << "Releasing buffers";
>
>         delete cache_;
> --
> 2.25.1
>
Kieran Bingham Oct. 28, 2022, 1:42 p.m. UTC | #2
Quoting Naushir Patuck via libcamera-devel (2022-10-28 14:38:47)
> releaseBuffers() unconditionally calls ioctl(REQBUFS, 0) to release device
> buffer allocations through the close() and class destructor functions. If
> another libcamera process is running concurrently with a different sensor, it
> would cause the ioctl to fail in the kernel because the buffer queue is owned
> owned by the other process. This in turn would cause libcamera to generate an
> error log message.
> 
> Fix this by ensuring the releaseBuffers() only calls ioctl(REQBUFS, 0) if there
> have been buffers previously allocated by the device. This is done by testing
> the presense of the V4L2BufferCache in the object.
> 
> Signed-off-by: Naushir Patuck <naush@raspberrypi.com>
> ---
>  src/libcamera/v4l2_videodevice.cpp | 3 +++
>  1 file changed, 3 insertions(+)
> 
> diff --git a/src/libcamera/v4l2_videodevice.cpp b/src/libcamera/v4l2_videodevice.cpp
> index e30858c9fa02..0d60dbd1c23d 100644
> --- a/src/libcamera/v4l2_videodevice.cpp
> +++ b/src/libcamera/v4l2_videodevice.cpp
> @@ -1533,6 +1533,9 @@ int V4L2VideoDevice::importBuffers(unsigned int count)
>   */
>  int V4L2VideoDevice::releaseBuffers()
>  {
> +       if (!cache_)
> +               return 0;

Return 0 looks like it will keep the compiler happier than return;


Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>

> +
>         LOG(V4L2, Debug) << "Releasing buffers";
>  
>         delete cache_;
> -- 
> 2.25.1
>

Patch
diff mbox series

diff --git a/src/libcamera/v4l2_videodevice.cpp b/src/libcamera/v4l2_videodevice.cpp
index e30858c9fa02..0d60dbd1c23d 100644
--- a/src/libcamera/v4l2_videodevice.cpp
+++ b/src/libcamera/v4l2_videodevice.cpp
@@ -1533,6 +1533,9 @@  int V4L2VideoDevice::importBuffers(unsigned int count)
  */
 int V4L2VideoDevice::releaseBuffers()
 {
+	if (!cache_)
+		return 0;
+
 	LOG(V4L2, Debug) << "Releasing buffers";
 
 	delete cache_;