[{"id":21422,"web_url":"https://patchwork.libcamera.org/comment/21422/","msgid":"<20211130080655.k745xv2rocrwqk6y@uno.localdomain>","date":"2021-11-30T08:06:55","subject":"Re: [libcamera-devel] [PATCH v4 17/22] libcamera: pipeline:\n\traspberrypi: DmaHeaps: Use UniqueFD for a file descriptor","submitter":{"id":3,"url":"https://patchwork.libcamera.org/api/people/3/","name":"Jacopo Mondi","email":"jacopo@jmondi.org"},"content":"Hi LAurent\n\nOn Tue, Nov 30, 2021 at 05:38:15AM +0200, Laurent Pinchart wrote:\n> From: Hirokazu Honda <hiroh@chromium.org>\n>\n> Manages a file descriptor owned by DmaHeaps for a dma handle by\n> UniqueFD. Furthermore, DmaHeaps::alloc() creates a new file\n> descriptor and the returned file descriptor is owned by a caller.\n> This also clarifies it by changing the returned value to UniqueFD.\n>\n> Signed-off-by: Hirokazu Honda <hiroh@chromium.org>\n> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>\n> Reviewed-by: Hirokazu Honda <hiroh@chromium.org>\n> ---\n> Changes since v2:\n>\n> - Use default destructor\n> - Return {}\n> ---\n>  .../pipeline/raspberrypi/dma_heaps.cpp        | 28 ++++++++-----------\n>  .../pipeline/raspberrypi/dma_heaps.h          | 10 ++++---\n>  .../pipeline/raspberrypi/raspberrypi.cpp      |  6 ++--\n>  3 files changed, 21 insertions(+), 23 deletions(-)\n>\n> diff --git a/src/libcamera/pipeline/raspberrypi/dma_heaps.cpp b/src/libcamera/pipeline/raspberrypi/dma_heaps.cpp\n> index 573ea11de607..69831dabbe75 100644\n> --- a/src/libcamera/pipeline/raspberrypi/dma_heaps.cpp\n> +++ b/src/libcamera/pipeline/raspberrypi/dma_heaps.cpp\n> @@ -35,7 +35,6 @@ LOG_DECLARE_CATEGORY(RPI)\n>  namespace RPi {\n>\n>  DmaHeap::DmaHeap()\n> -\t: dmaHeapHandle_(-1)\n>  {\n>  \tfor (const char *name : heapNames) {\n>  \t\tint ret = ::open(name, O_RDWR, 0);\n> @@ -46,49 +45,44 @@ DmaHeap::DmaHeap()\n>  \t\t\tcontinue;\n>  \t\t}\n>\n> -\t\tdmaHeapHandle_ = ret;\n> +\t\tdmaHeapHandle_ = UniqueFD(ret);\n>  \t\tbreak;\n>  \t}\n>\n> -\tif (dmaHeapHandle_ < 0)\n> +\tif (!dmaHeapHandle_.isValid())\n>  \t\tLOG(RPI, Error) << \"Could not open any dmaHeap device\";\n>  }\n>\n> -DmaHeap::~DmaHeap()\n> -{\n> -\tif (dmaHeapHandle_ > -1)\n> -\t\t::close(dmaHeapHandle_);\n> -}\n> +DmaHeap::~DmaHeap() = default;\n>\n> -FileDescriptor DmaHeap::alloc(const char *name, std::size_t size)\n> +UniqueFD DmaHeap::alloc(const char *name, std::size_t size)\n>  {\n>  \tint ret;\n>\n>  \tif (!name)\n> -\t\treturn FileDescriptor();\n> +\t\treturn {};\n>\n>  \tstruct dma_heap_allocation_data alloc = {};\n>\n>  \talloc.len = size;\n>  \talloc.fd_flags = O_CLOEXEC | O_RDWR;\n>\n> -\tret = ::ioctl(dmaHeapHandle_, DMA_HEAP_IOCTL_ALLOC, &alloc);\n> -\n> +\tret = ::ioctl(dmaHeapHandle_.get(), DMA_HEAP_IOCTL_ALLOC, &alloc);\n>  \tif (ret < 0) {\n>  \t\tLOG(RPI, Error) << \"dmaHeap allocation failure for \"\n>  \t\t\t\t<< name;\n> -\t\treturn FileDescriptor();\n> +\t\treturn {};\n>  \t}\n>\n> -\tret = ::ioctl(alloc.fd, DMA_BUF_SET_NAME, name);\n> +\tUniqueFD allocFd(alloc.fd);\n> +\tret = ::ioctl(allocFd.get(), DMA_BUF_SET_NAME, name);\n>  \tif (ret < 0) {\n>  \t\tLOG(RPI, Error) << \"dmaHeap naming failure for \"\n>  \t\t\t\t<< name;\n> -\t\t::close(alloc.fd);\n> -\t\treturn FileDescriptor();\n> +\t\treturn {};\n>  \t}\n>\n> -\treturn FileDescriptor(std::move(alloc.fd));\n> +\treturn allocFd;\n>  }\n>\n>  } /* namespace RPi */\n> diff --git a/src/libcamera/pipeline/raspberrypi/dma_heaps.h b/src/libcamera/pipeline/raspberrypi/dma_heaps.h\n> index 57beaeb2e48a..d38f41eae1a2 100644\n> --- a/src/libcamera/pipeline/raspberrypi/dma_heaps.h\n> +++ b/src/libcamera/pipeline/raspberrypi/dma_heaps.h\n> @@ -7,7 +7,9 @@\n>\n>  #pragma once\n>\n> -#include <libcamera/base/file_descriptor.h>\n> +#include <stddef.h>\n> +\n> +#include <libcamera/base/unique_fd.h>\n>\n>  namespace libcamera {\n>\n> @@ -18,11 +20,11 @@ class DmaHeap\n>  public:\n>  \tDmaHeap();\n>  \t~DmaHeap();\n> -\tbool isValid() const { return dmaHeapHandle_ > -1; }\n> -\tFileDescriptor alloc(const char *name, std::size_t size);\n> +\tbool isValid() const { return dmaHeapHandle_.isValid(); }\n> +\tUniqueFD alloc(const char *name, std::size_t size);\n>\n>  private:\n> -\tint dmaHeapHandle_;\n> +\tUniqueFD dmaHeapHandle_;\n>  };\n>\n>  } /* namespace RPi */\n> diff --git a/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp b/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp\n> index d82cb30f0e77..d4f248a799e5 100644\n> --- a/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp\n> +++ b/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp\n> @@ -1382,10 +1382,12 @@ int RPiCameraData::configureIPA(const CameraConfiguration *config)\n>\n>  \t/* Allocate the lens shading table via dmaHeap and pass to the IPA. */\n>  \tif (!lsTable_.isValid()) {\n> -\t\tlsTable_ = dmaHeap_.alloc(\"ls_grid\", ipa::RPi::MaxLsGridSize);\n> -\t\tif (!lsTable_.isValid())\n> +\t\tUniqueFD fd = dmaHeap_.alloc(\"ls_grid\", ipa::RPi::MaxLsGridSize);\n> +\t\tif (!fd.isValid())\n>  \t\t\treturn -ENOMEM;\n>\n> +\t\tlsTable_ = FileDescriptor(std::move(fd));\n\nAs lsTable_ is initialized once, why going through a UniqueFD and then\na FileDescriptor ?\n\nOtherwise\nReviewed-by: Jacopo Mondi <jacopo@jmondi.org>\n\nThanks\n  j\n\n> +\n>  \t\t/* Allow the IPA to mmap the LS table via the file descriptor. */\n>  \t\t/*\n>  \t\t * \\todo Investigate if mapping the lens shading table buffer\n> --\n> Regards,\n>\n> Laurent Pinchart\n>","headers":{"Return-Path":"<libcamera-devel-bounces@lists.libcamera.org>","X-Original-To":"parsemail@patchwork.libcamera.org","Delivered-To":"parsemail@patchwork.libcamera.org","Received":["from lancelot.ideasonboard.com (lancelot.ideasonboard.com\n\t[92.243.16.209])\n\tby patchwork.libcamera.org (Postfix) with ESMTPS id 151A0BF415\n\tfor <parsemail@patchwork.libcamera.org>;\n\tTue, 30 Nov 2021 08:06:05 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 8359F605B4;\n\tTue, 30 Nov 2021 09:06:04 +0100 (CET)","from relay7-d.mail.gandi.net (relay7-d.mail.gandi.net\n\t[217.70.183.200])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 4336C60230\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tTue, 30 Nov 2021 09:06:03 +0100 (CET)","(Authenticated sender: jacopo@jmondi.org)\n\tby relay7-d.mail.gandi.net (Postfix) with ESMTPSA id B868D20008;\n\tTue, 30 Nov 2021 08:06:02 +0000 (UTC)"],"Date":"Tue, 30 Nov 2021 09:06:55 +0100","From":"Jacopo Mondi <jacopo@jmondi.org>","To":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>","Message-ID":"<20211130080655.k745xv2rocrwqk6y@uno.localdomain>","References":"<20211130033820.18235-1-laurent.pinchart@ideasonboard.com>\n\t<20211130033820.18235-18-laurent.pinchart@ideasonboard.com>","MIME-Version":"1.0","Content-Type":"text/plain; charset=utf-8","Content-Disposition":"inline","In-Reply-To":"<20211130033820.18235-18-laurent.pinchart@ideasonboard.com>","Subject":"Re: [libcamera-devel] [PATCH v4 17/22] libcamera: pipeline:\n\traspberrypi: DmaHeaps: Use UniqueFD for a file descriptor","X-BeenThere":"libcamera-devel@lists.libcamera.org","X-Mailman-Version":"2.1.29","Precedence":"list","List-Id":"<libcamera-devel.lists.libcamera.org>","List-Unsubscribe":"<https://lists.libcamera.org/options/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=unsubscribe>","List-Archive":"<https://lists.libcamera.org/pipermail/libcamera-devel/>","List-Post":"<mailto:libcamera-devel@lists.libcamera.org>","List-Help":"<mailto:libcamera-devel-request@lists.libcamera.org?subject=help>","List-Subscribe":"<https://lists.libcamera.org/listinfo/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=subscribe>","Cc":"libcamera-devel@lists.libcamera.org","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}},{"id":21436,"web_url":"https://patchwork.libcamera.org/comment/21436/","msgid":"<YaX554xqv8m2sh7+@pendragon.ideasonboard.com>","date":"2021-11-30T10:16:07","subject":"Re: [libcamera-devel] [PATCH v4 17/22] libcamera: pipeline:\n\traspberrypi: DmaHeaps: Use UniqueFD for a file descriptor","submitter":{"id":2,"url":"https://patchwork.libcamera.org/api/people/2/","name":"Laurent Pinchart","email":"laurent.pinchart@ideasonboard.com"},"content":"Hi Jacopo,\n\nOn Tue, Nov 30, 2021 at 09:06:55AM +0100, Jacopo Mondi wrote:\n> On Tue, Nov 30, 2021 at 05:38:15AM +0200, Laurent Pinchart wrote:\n> > From: Hirokazu Honda <hiroh@chromium.org>\n> >\n> > Manages a file descriptor owned by DmaHeaps for a dma handle by\n> > UniqueFD. Furthermore, DmaHeaps::alloc() creates a new file\n> > descriptor and the returned file descriptor is owned by a caller.\n> > This also clarifies it by changing the returned value to UniqueFD.\n> >\n> > Signed-off-by: Hirokazu Honda <hiroh@chromium.org>\n> > Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>\n> > Reviewed-by: Hirokazu Honda <hiroh@chromium.org>\n> > ---\n> > Changes since v2:\n> >\n> > - Use default destructor\n> > - Return {}\n> > ---\n> >  .../pipeline/raspberrypi/dma_heaps.cpp        | 28 ++++++++-----------\n> >  .../pipeline/raspberrypi/dma_heaps.h          | 10 ++++---\n> >  .../pipeline/raspberrypi/raspberrypi.cpp      |  6 ++--\n> >  3 files changed, 21 insertions(+), 23 deletions(-)\n> >\n> > diff --git a/src/libcamera/pipeline/raspberrypi/dma_heaps.cpp b/src/libcamera/pipeline/raspberrypi/dma_heaps.cpp\n> > index 573ea11de607..69831dabbe75 100644\n> > --- a/src/libcamera/pipeline/raspberrypi/dma_heaps.cpp\n> > +++ b/src/libcamera/pipeline/raspberrypi/dma_heaps.cpp\n> > @@ -35,7 +35,6 @@ LOG_DECLARE_CATEGORY(RPI)\n> >  namespace RPi {\n> >\n> >  DmaHeap::DmaHeap()\n> > -\t: dmaHeapHandle_(-1)\n> >  {\n> >  \tfor (const char *name : heapNames) {\n> >  \t\tint ret = ::open(name, O_RDWR, 0);\n> > @@ -46,49 +45,44 @@ DmaHeap::DmaHeap()\n> >  \t\t\tcontinue;\n> >  \t\t}\n> >\n> > -\t\tdmaHeapHandle_ = ret;\n> > +\t\tdmaHeapHandle_ = UniqueFD(ret);\n> >  \t\tbreak;\n> >  \t}\n> >\n> > -\tif (dmaHeapHandle_ < 0)\n> > +\tif (!dmaHeapHandle_.isValid())\n> >  \t\tLOG(RPI, Error) << \"Could not open any dmaHeap device\";\n> >  }\n> >\n> > -DmaHeap::~DmaHeap()\n> > -{\n> > -\tif (dmaHeapHandle_ > -1)\n> > -\t\t::close(dmaHeapHandle_);\n> > -}\n> > +DmaHeap::~DmaHeap() = default;\n> >\n> > -FileDescriptor DmaHeap::alloc(const char *name, std::size_t size)\n> > +UniqueFD DmaHeap::alloc(const char *name, std::size_t size)\n> >  {\n> >  \tint ret;\n> >\n> >  \tif (!name)\n> > -\t\treturn FileDescriptor();\n> > +\t\treturn {};\n> >\n> >  \tstruct dma_heap_allocation_data alloc = {};\n> >\n> >  \talloc.len = size;\n> >  \talloc.fd_flags = O_CLOEXEC | O_RDWR;\n> >\n> > -\tret = ::ioctl(dmaHeapHandle_, DMA_HEAP_IOCTL_ALLOC, &alloc);\n> > -\n> > +\tret = ::ioctl(dmaHeapHandle_.get(), DMA_HEAP_IOCTL_ALLOC, &alloc);\n> >  \tif (ret < 0) {\n> >  \t\tLOG(RPI, Error) << \"dmaHeap allocation failure for \"\n> >  \t\t\t\t<< name;\n> > -\t\treturn FileDescriptor();\n> > +\t\treturn {};\n> >  \t}\n> >\n> > -\tret = ::ioctl(alloc.fd, DMA_BUF_SET_NAME, name);\n> > +\tUniqueFD allocFd(alloc.fd);\n> > +\tret = ::ioctl(allocFd.get(), DMA_BUF_SET_NAME, name);\n> >  \tif (ret < 0) {\n> >  \t\tLOG(RPI, Error) << \"dmaHeap naming failure for \"\n> >  \t\t\t\t<< name;\n> > -\t\t::close(alloc.fd);\n> > -\t\treturn FileDescriptor();\n> > +\t\treturn {};\n> >  \t}\n> >\n> > -\treturn FileDescriptor(std::move(alloc.fd));\n> > +\treturn allocFd;\n> >  }\n> >\n> >  } /* namespace RPi */\n> > diff --git a/src/libcamera/pipeline/raspberrypi/dma_heaps.h b/src/libcamera/pipeline/raspberrypi/dma_heaps.h\n> > index 57beaeb2e48a..d38f41eae1a2 100644\n> > --- a/src/libcamera/pipeline/raspberrypi/dma_heaps.h\n> > +++ b/src/libcamera/pipeline/raspberrypi/dma_heaps.h\n> > @@ -7,7 +7,9 @@\n> >\n> >  #pragma once\n> >\n> > -#include <libcamera/base/file_descriptor.h>\n> > +#include <stddef.h>\n> > +\n> > +#include <libcamera/base/unique_fd.h>\n> >\n> >  namespace libcamera {\n> >\n> > @@ -18,11 +20,11 @@ class DmaHeap\n> >  public:\n> >  \tDmaHeap();\n> >  \t~DmaHeap();\n> > -\tbool isValid() const { return dmaHeapHandle_ > -1; }\n> > -\tFileDescriptor alloc(const char *name, std::size_t size);\n> > +\tbool isValid() const { return dmaHeapHandle_.isValid(); }\n> > +\tUniqueFD alloc(const char *name, std::size_t size);\n> >\n> >  private:\n> > -\tint dmaHeapHandle_;\n> > +\tUniqueFD dmaHeapHandle_;\n> >  };\n> >\n> >  } /* namespace RPi */\n> > diff --git a/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp b/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp\n> > index d82cb30f0e77..d4f248a799e5 100644\n> > --- a/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp\n> > +++ b/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp\n> > @@ -1382,10 +1382,12 @@ int RPiCameraData::configureIPA(const CameraConfiguration *config)\n> >\n> >  \t/* Allocate the lens shading table via dmaHeap and pass to the IPA. */\n> >  \tif (!lsTable_.isValid()) {\n> > -\t\tlsTable_ = dmaHeap_.alloc(\"ls_grid\", ipa::RPi::MaxLsGridSize);\n> > -\t\tif (!lsTable_.isValid())\n> > +\t\tUniqueFD fd = dmaHeap_.alloc(\"ls_grid\", ipa::RPi::MaxLsGridSize);\n> > +\t\tif (!fd.isValid())\n> >  \t\t\treturn -ENOMEM;\n> >\n> > +\t\tlsTable_ = FileDescriptor(std::move(fd));\n> \n> As lsTable_ is initialized once, why going through a UniqueFD and then\n> a FileDescriptor ?\n\nGood point. I'll change this to\n\n\tlsTable_ = FileDescriptor(dmaHeap_.alloc(\"ls_grid\", ipa::RPi::MaxLsGridSize));\n\tif (!lsTable_.isValid())\n\t\treturn -ENOMEM;\n\n> Otherwise\n> Reviewed-by: Jacopo Mondi <jacopo@jmondi.org>\n> \n> > +\n> >  \t\t/* Allow the IPA to mmap the LS table via the file descriptor. */\n> >  \t\t/*\n> >  \t\t * \\todo Investigate if mapping the lens shading table buffer","headers":{"Return-Path":"<libcamera-devel-bounces@lists.libcamera.org>","X-Original-To":"parsemail@patchwork.libcamera.org","Delivered-To":"parsemail@patchwork.libcamera.org","Received":["from lancelot.ideasonboard.com (lancelot.ideasonboard.com\n\t[92.243.16.209])\n\tby patchwork.libcamera.org (Postfix) with ESMTPS id C97E9BF415\n\tfor <parsemail@patchwork.libcamera.org>;\n\tTue, 30 Nov 2021 10:16:33 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 360BB605B4;\n\tTue, 30 Nov 2021 11:16:33 +0100 (CET)","from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[IPv6:2001:4b98:dc2:55:216:3eff:fef7:d647])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 4D5A260230\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tTue, 30 Nov 2021 11:16:32 +0100 (CET)","from pendragon.ideasonboard.com (62-78-145-57.bb.dnainternet.fi\n\t[62.78.145.57])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id BBC0BEE;\n\tTue, 30 Nov 2021 11:16:31 +0100 (CET)"],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (1024-bit key;\n\tunprotected) header.d=ideasonboard.com header.i=@ideasonboard.com\n\theader.b=\"Dub98pAd\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1638267392;\n\tbh=WSAXmQ51GMo8Q4OoBZ1uxAaPbnnCjTIJLYLjiskzSEk=;\n\th=Date:From:To:Cc:Subject:References:In-Reply-To:From;\n\tb=Dub98pAdWD126Vp4txE7kF1OApDP97v2njqGccyupEncGGIvDr/rMymti3d98wbrH\n\tauKWvdBQX8M8By/oJ/kiuEBn82c4J9EqlgH2Pu3Ql5g++7svz/MWFGhPbtqpfQ6ZVH\n\tbj+LJc0G2K9RpkdpKazPAuX4TmZxrQ27dWV1V9ic=","Date":"Tue, 30 Nov 2021 12:16:07 +0200","From":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>","To":"Jacopo Mondi <jacopo@jmondi.org>","Message-ID":"<YaX554xqv8m2sh7+@pendragon.ideasonboard.com>","References":"<20211130033820.18235-1-laurent.pinchart@ideasonboard.com>\n\t<20211130033820.18235-18-laurent.pinchart@ideasonboard.com>\n\t<20211130080655.k745xv2rocrwqk6y@uno.localdomain>","MIME-Version":"1.0","Content-Type":"text/plain; charset=utf-8","Content-Disposition":"inline","In-Reply-To":"<20211130080655.k745xv2rocrwqk6y@uno.localdomain>","Subject":"Re: [libcamera-devel] [PATCH v4 17/22] libcamera: pipeline:\n\traspberrypi: DmaHeaps: Use UniqueFD for a file descriptor","X-BeenThere":"libcamera-devel@lists.libcamera.org","X-Mailman-Version":"2.1.29","Precedence":"list","List-Id":"<libcamera-devel.lists.libcamera.org>","List-Unsubscribe":"<https://lists.libcamera.org/options/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=unsubscribe>","List-Archive":"<https://lists.libcamera.org/pipermail/libcamera-devel/>","List-Post":"<mailto:libcamera-devel@lists.libcamera.org>","List-Help":"<mailto:libcamera-devel-request@lists.libcamera.org?subject=help>","List-Subscribe":"<https://lists.libcamera.org/listinfo/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=subscribe>","Cc":"libcamera-devel@lists.libcamera.org","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}}]