[{"id":17415,"web_url":"https://patchwork.libcamera.org/comment/17415/","msgid":"<YL0YcI4TTsCASQBP@pendragon.ideasonboard.com>","date":"2021-06-06T18:48:16","subject":"Re: [libcamera-devel] [RFC PATCH 09/10] libcamera: pipeline:\n\traspberrypi: DmaHeaps: Use ScopedFD 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 Hiro,\n\nThank you for the patch.\n\nOn Thu, Apr 15, 2021 at 05:38:42PM +0900, Hirokazu Honda wrote:\n> DmaHeaps owns a file descriptor for a dma handle. It should be\n> managed by ScopedFD to avoid the leakage. Furthermore,\n> DmaHeaps::alloc() creates a new file descriptor and the returned\n> file descriptor is owned by a caller. This also clarifies it by\n> changing the returned value to ScopedFD.\n> \n> Signed-off-by: Hirokazu Honda <hiroh@chromium.org>\n> ---\n>  .../pipeline/raspberrypi/dma_heaps.cpp        | 23 ++++++++-----------\n>  .../pipeline/raspberrypi/dma_heaps.h          | 10 ++++----\n>  .../pipeline/raspberrypi/raspberrypi.cpp      |  7 ++++--\n>  3 files changed, 21 insertions(+), 19 deletions(-)\n> \n> diff --git a/src/libcamera/pipeline/raspberrypi/dma_heaps.cpp b/src/libcamera/pipeline/raspberrypi/dma_heaps.cpp\n> index 4d5dd6cb..d5b000b8 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,47 @@ DmaHeap::DmaHeap()\n>  \t\t\tcontinue;\n>  \t\t}\n>  \n> -\t\tdmaHeapHandle_ = ret;\n> +\t\tdmaHeapHandle_ = ScopedFD(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>  \n> -FileDescriptor DmaHeap::alloc(const char *name, std::size_t size)\n> +ScopedFD DmaHeap::alloc(const char *name, std::size_t size)\n>  {\n>  \tint ret;\n>  \n>  \tif (!name)\n> -\t\treturn FileDescriptor();\n> +\t\treturn ScopedFD();\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> +\tret = ::ioctl(dmaHeapHandle_.get(), DMA_HEAP_IOCTL_ALLOC, &alloc);\n>  \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 ScopedFD();\n>  \t}\n>  \n> -\tret = ::ioctl(alloc.fd, DMA_BUF_SET_NAME, name);\n> +\tScopedFD 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 ScopedFD();\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 79f39c51..c49772df 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>  #ifndef __LIBCAMERA_PIPELINE_RASPBERRYPI_DMA_HEAPS_H__\n>  #define __LIBCAMERA_PIPELINE_RASPBERRYPI_DMA_HEAPS_H__\n>  \n> -#include <libcamera/file_descriptor.h>\n> +#include <cstddef>\n> +\n> +#include <libcamera/scoped_file_descriptor.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> +\tScopedFD alloc(const char *name, std::size_t size);\n>  \n>  private:\n> -\tint dmaHeapHandle_;\n> +\tScopedFD 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 f22e286e..0075fdb1 100644\n> --- a/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp\n> +++ b/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp\n> @@ -1256,10 +1256,13 @@ 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\tScopedFD scopedFD =\n> +\t\t\tdmaHeap_.alloc(\"ls_grid\", ipa::RPi::MaxLsGridSize);\n> +\t\tif (!scopedFD.isValid())\n>  \t\t\treturn -ENOMEM;\n>  \n> +\t\tlsTable_ = FileDescriptor(scopedFD.release());\n\nThis isn't very nice. One option could be to add a FileDescriptor\nconstructor that takes a ScopedFD. What do you think ?\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 3ED17C320B\n\tfor <parsemail@patchwork.libcamera.org>;\n\tSun,  6 Jun 2021 18:48:32 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id A62F76892B;\n\tSun,  6 Jun 2021 20:48:31 +0200 (CEST)","from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[213.167.242.64])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 5563D602A7\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tSun,  6 Jun 2021 20:48:30 +0200 (CEST)","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 B7D9FEF;\n\tSun,  6 Jun 2021 20:48:29 +0200 (CEST)"],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (1024-bit key;\n\tunprotected) header.d=ideasonboard.com header.i=@ideasonboard.com\n\theader.b=\"l6J5BH3P\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1623005310;\n\tbh=QMNBNs0s7eueqITfUKc0uaq4xRhLkH/JjO7MEpw9PuM=;\n\th=Date:From:To:Cc:Subject:References:In-Reply-To:From;\n\tb=l6J5BH3P/R0+8u1yjwyZEHgLClRuaBUmKQNqzdcXhjPjb6PHD+oAI4QYd2WYI3sJx\n\tyqvfJoyzUgOFdcfiLnTQTUUP4kNdvm7IMuZCpgLgCvAKvVw3CxCM2FNSia0/HEaLyR\n\tVECHSxsbskkZcmROyVN/Y0il5mhCf0rMa+afjH1c=","Date":"Sun, 6 Jun 2021 21:48:16 +0300","From":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>","To":"Hirokazu Honda <hiroh@chromium.org>","Message-ID":"<YL0YcI4TTsCASQBP@pendragon.ideasonboard.com>","References":"<20210415083843.3399502-1-hiroh@chromium.org>\n\t<20210415083843.3399502-9-hiroh@chromium.org>","MIME-Version":"1.0","Content-Type":"text/plain; charset=utf-8","Content-Disposition":"inline","In-Reply-To":"<20210415083843.3399502-9-hiroh@chromium.org>","Subject":"Re: [libcamera-devel] [RFC PATCH 09/10] libcamera: pipeline:\n\traspberrypi: DmaHeaps: Use ScopedFD 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":17437,"web_url":"https://patchwork.libcamera.org/comment/17437/","msgid":"<CAO5uPHMUOOD1=nkAK+UPrVpzj2UMTAHRDCn0xOHf_SxNDBK_UQ@mail.gmail.com>","date":"2021-06-07T10:02:14","subject":"Re: [libcamera-devel] [RFC PATCH 09/10] libcamera: pipeline:\n\traspberrypi: DmaHeaps: Use ScopedFD for a file descriptor","submitter":{"id":63,"url":"https://patchwork.libcamera.org/api/people/63/","name":"Hirokazu Honda","email":"hiroh@chromium.org"},"content":"Hi Laurent,\n\nOn Mon, Jun 7, 2021 at 3:48 AM Laurent Pinchart <\nlaurent.pinchart@ideasonboard.com> wrote:\n\n> Hi Hiro,\n>\n> Thank you for the patch.\n>\n> On Thu, Apr 15, 2021 at 05:38:42PM +0900, Hirokazu Honda wrote:\n> > DmaHeaps owns a file descriptor for a dma handle. It should be\n> > managed by ScopedFD to avoid the leakage. Furthermore,\n> > DmaHeaps::alloc() creates a new file descriptor and the returned\n> > file descriptor is owned by a caller. This also clarifies it by\n> > changing the returned value to ScopedFD.\n> >\n> > Signed-off-by: Hirokazu Honda <hiroh@chromium.org>\n> > ---\n> >  .../pipeline/raspberrypi/dma_heaps.cpp        | 23 ++++++++-----------\n> >  .../pipeline/raspberrypi/dma_heaps.h          | 10 ++++----\n> >  .../pipeline/raspberrypi/raspberrypi.cpp      |  7 ++++--\n> >  3 files changed, 21 insertions(+), 19 deletions(-)\n> >\n> > diff --git a/src/libcamera/pipeline/raspberrypi/dma_heaps.cpp\n> b/src/libcamera/pipeline/raspberrypi/dma_heaps.cpp\n> > index 4d5dd6cb..d5b000b8 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> > -     : dmaHeapHandle_(-1)\n> >  {\n> >       for (const char *name : heapNames) {\n> >               int ret = ::open(name, O_RDWR, 0);\n> > @@ -46,49 +45,47 @@ DmaHeap::DmaHeap()\n> >                       continue;\n> >               }\n> >\n> > -             dmaHeapHandle_ = ret;\n> > +             dmaHeapHandle_ = ScopedFD(ret);\n> >               break;\n> >       }\n> >\n> > -     if (dmaHeapHandle_ < 0)\n> > +     if (!dmaHeapHandle_.isValid())\n> >               LOG(RPI, Error) << \"Could not open any dmaHeap device\";\n> >  }\n> >\n> >  DmaHeap::~DmaHeap()\n> >  {\n> > -     if (dmaHeapHandle_ > -1)\n> > -             ::close(dmaHeapHandle_);\n> >  }\n> >\n> > -FileDescriptor DmaHeap::alloc(const char *name, std::size_t size)\n> > +ScopedFD DmaHeap::alloc(const char *name, std::size_t size)\n> >  {\n> >       int ret;\n> >\n> >       if (!name)\n> > -             return FileDescriptor();\n> > +             return ScopedFD();\n> >\n> >       struct dma_heap_allocation_data alloc = {};\n> >\n> >       alloc.len = size;\n> >       alloc.fd_flags = O_CLOEXEC | O_RDWR;\n> >\n> > -     ret = ::ioctl(dmaHeapHandle_, DMA_HEAP_IOCTL_ALLOC, &alloc);\n> > +     ret = ::ioctl(dmaHeapHandle_.get(), DMA_HEAP_IOCTL_ALLOC, &alloc);\n> >\n> >       if (ret < 0) {\n> >               LOG(RPI, Error) << \"dmaHeap allocation failure for \"\n> >                               << name;\n> > -             return FileDescriptor();\n> > +             return ScopedFD();\n> >       }\n> >\n> > -     ret = ::ioctl(alloc.fd, DMA_BUF_SET_NAME, name);\n> > +     ScopedFD allocFd(alloc.fd);\n> > +     ret = ::ioctl(allocFd.get(), DMA_BUF_SET_NAME, name);\n> >       if (ret < 0) {\n> >               LOG(RPI, Error) << \"dmaHeap naming failure for \"\n> >                               << name;\n> > -             ::close(alloc.fd);\n> > -             return FileDescriptor();\n> > +             return ScopedFD();\n> >       }\n> >\n> > -     return FileDescriptor(std::move(alloc.fd));\n> > +     return allocFd;\n> >  }\n> >\n> >  } /* namespace RPi */\n> > diff --git a/src/libcamera/pipeline/raspberrypi/dma_heaps.h\n> b/src/libcamera/pipeline/raspberrypi/dma_heaps.h\n> > index 79f39c51..c49772df 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> >  #ifndef __LIBCAMERA_PIPELINE_RASPBERRYPI_DMA_HEAPS_H__\n> >  #define __LIBCAMERA_PIPELINE_RASPBERRYPI_DMA_HEAPS_H__\n> >\n> > -#include <libcamera/file_descriptor.h>\n> > +#include <cstddef>\n> > +\n> > +#include <libcamera/scoped_file_descriptor.h>\n> >\n> >  namespace libcamera {\n> >\n> > @@ -18,11 +20,11 @@ class DmaHeap\n> >  public:\n> >       DmaHeap();\n> >       ~DmaHeap();\n> > -     bool isValid() const { return dmaHeapHandle_ > -1; }\n> > -     FileDescriptor alloc(const char *name, std::size_t size);\n> > +     bool isValid() const { return dmaHeapHandle_.isValid(); }\n> > +     ScopedFD alloc(const char *name, std::size_t size);\n> >\n> >  private:\n> > -     int dmaHeapHandle_;\n> > +     ScopedFD dmaHeapHandle_;\n> >  };\n> >\n> >  } /* namespace RPi */\n> > diff --git a/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp\n> b/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp\n> > index f22e286e..0075fdb1 100644\n> > --- a/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp\n> > +++ b/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp\n> > @@ -1256,10 +1256,13 @@ int RPiCameraData::configureIPA(const\n> CameraConfiguration *config)\n> >\n> >       /* Allocate the lens shading table via dmaHeap and pass to the\n> IPA. */\n> >       if (!lsTable_.isValid()) {\n> > -             lsTable_ = dmaHeap_.alloc(\"ls_grid\",\n> ipa::RPi::MaxLsGridSize);\n> > -             if (!lsTable_.isValid())\n> > +             ScopedFD scopedFD =\n> > +                     dmaHeap_.alloc(\"ls_grid\", ipa::RPi::MaxLsGridSize);\n> > +             if (!scopedFD.isValid())\n> >                       return -ENOMEM;\n> >\n> > +             lsTable_ = FileDescriptor(scopedFD.release());\n>\n> This isn't very nice. One option could be to add a FileDescriptor\n> constructor that takes a ScopedFD. What do you think ?\n>\n>\nThat sounds good to me.\n-Hiro\n\n\n> > +\n> >               /* Allow the IPA to mmap the LS table via the file\n> descriptor. */\n> >               /*\n> >                * \\todo Investigate if mapping the lens shading table\n> buffer\n>\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 68748C3206\n\tfor <parsemail@patchwork.libcamera.org>;\n\tMon,  7 Jun 2021 10:02:27 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id C23FE602A1;\n\tMon,  7 Jun 2021 12:02:26 +0200 (CEST)","from mail-ed1-x52e.google.com (mail-ed1-x52e.google.com\n\t[IPv6:2a00:1450:4864:20::52e])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id C1D6C602A1\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tMon,  7 Jun 2021 12:02:25 +0200 (CEST)","by mail-ed1-x52e.google.com with SMTP id i13so19616462edb.9\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tMon, 07 Jun 2021 03:02:25 -0700 (PDT)"],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (1024-bit key;\n\tunprotected) header.d=chromium.org header.i=@chromium.org\n\theader.b=\"XWcg6cK9\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org;\n\ts=google; \n\th=mime-version:references:in-reply-to:from:date:message-id:subject:to\n\t:cc; bh=ULAiEFCwwbZtxYeTcRexIson2JjnfN0C3MP0/0DunvU=;\n\tb=XWcg6cK9oWL1eVXEz3HDmJang37kIfqnAfI4bbNoFrYaP2N3d/uydADm3jEcmooIg2\n\tV6w1pSw0+I2jrDDMNb/9BFjFsW6m+Wx71FJAkevV37otZeKv9Sg5smZfCx0faiuAmvX5\n\tW0TWxsE2yN/e8yVcvLet5KRWgQ/si30lrf9Rc=","X-Google-DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=1e100.net; s=20161025;\n\th=x-gm-message-state:mime-version:references:in-reply-to:from:date\n\t:message-id:subject:to:cc;\n\tbh=ULAiEFCwwbZtxYeTcRexIson2JjnfN0C3MP0/0DunvU=;\n\tb=ZM8ZF/dZknQqe+/B4HwC8qHUEFnzSo9wklMaiUecDdmLbln3/j/MSqJORTclKrZ3Q5\n\tNyNNxEddtKDx11IDGiZJdowN3chvIOysuMJ4ineYeCnKgEB3V5G3o4kkyVcoLFKTTyUc\n\tzX73rZjnNjZnMRgeSSbRGoZS8tEHD8XqZrcU9AmLCo4K7zcp1pL9g0p73F4jWveKOzLS\n\traAtL9vnRoDnR9hSrTM6lr3pGe63EXfVdp5YLyaBJsCzxF0BTb6u2hibPDj0w3EK8Ahe\n\teM9H6mx4gZcYLZZO5sKj5H7trzvJGOUnipEnCs7EVhr7rbAKWYk90cFlnOsOHut5TdX/\n\tpvww==","X-Gm-Message-State":"AOAM533kQ7BT+HJuSs/hUBsd1bc5ATTQrZLgSuIwvZLyFZCF/D1SqyXG\n\tPEuf1bBvRK/RNldJCzASowl7DUbh7pNDtKJTYxVSqA==","X-Google-Smtp-Source":"ABdhPJypQEey7cgI30CgCsmPBk2dmZxRFMz2XOLiSJ/U+iOlFwZZJM6jyMlWeGnLZUXBX+e5yilNR+2ALCInnu0Oko8=","X-Received":"by 2002:a05:6402:3198:: with SMTP id\n\tdi24mr18569297edb.244.1623060145468; \n\tMon, 07 Jun 2021 03:02:25 -0700 (PDT)","MIME-Version":"1.0","References":"<20210415083843.3399502-1-hiroh@chromium.org>\n\t<20210415083843.3399502-9-hiroh@chromium.org>\n\t<YL0YcI4TTsCASQBP@pendragon.ideasonboard.com>","In-Reply-To":"<YL0YcI4TTsCASQBP@pendragon.ideasonboard.com>","From":"Hirokazu Honda <hiroh@chromium.org>","Date":"Mon, 7 Jun 2021 19:02:14 +0900","Message-ID":"<CAO5uPHMUOOD1=nkAK+UPrVpzj2UMTAHRDCn0xOHf_SxNDBK_UQ@mail.gmail.com>","To":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>","Content-Type":"multipart/alternative; boundary=\"0000000000006b85c605c42a2396\"","Subject":"Re: [libcamera-devel] [RFC PATCH 09/10] libcamera: pipeline:\n\traspberrypi: DmaHeaps: Use ScopedFD 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 <libcamera-devel@lists.libcamera.org>","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}}]