[{"id":3770,"web_url":"https://patchwork.libcamera.org/comment/3770/","msgid":"<20200216214311.GF28645@pendragon.ideasonboard.com>","date":"2020-02-16T21:43:11","subject":"Re: [libcamera-devel] [PATCH 1/2] libcamera: V4L2BufferCache:\n\tImprove cache eviction strategy","submitter":{"id":2,"url":"https://patchwork.libcamera.org/api/people/2/","name":"Laurent Pinchart","email":"laurent.pinchart@ideasonboard.com"},"content":"Hi Niklas,\n\nThank you for the patch.\n\nOn Sun, Feb 16, 2020 at 05:16:41PM +0100, Niklas Söderlund wrote:\n> The strategy used to find a free cache entry in the first implementation\n> was not the smartest, it picked the first free entry. This lead to\n> unwanted performance issues as they cache was not used as good as it\n> could for imported buffers.\n> \n> Improve this by adding a last usage timestamp to the cache entries and\n> change the eviction strategy to use the oldest free entry instead of the\n> first one it finds.\n\nWouldn't it be simpler to as a LRU mechanism, to avoid searching in the\nwhole cache every time ?\n\n> Signed-off-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>\n> ---\n>  src/libcamera/include/v4l2_videodevice.h | 1 +\n>  src/libcamera/v4l2_videodevice.cpp       | 9 ++++++---\n>  2 files changed, 7 insertions(+), 3 deletions(-)\n> \n> diff --git a/src/libcamera/include/v4l2_videodevice.h b/src/libcamera/include/v4l2_videodevice.h\n> index fcf072641420dacf..f04feed87b24f28f 100644\n> --- a/src/libcamera/include/v4l2_videodevice.h\n> +++ b/src/libcamera/include/v4l2_videodevice.h\n> @@ -125,6 +125,7 @@ private:\n>  \t\tbool operator==(const FrameBuffer &buffer);\n>  \n>  \t\tbool free;\n> +\t\tutils::time_point lastUsed;\n>  \n>  \tprivate:\n>  \t\tstruct Plane {\n> diff --git a/src/libcamera/v4l2_videodevice.cpp b/src/libcamera/v4l2_videodevice.cpp\n> index 99470ce11421c77c..9a4d2479b20f5e27 100644\n> --- a/src/libcamera/v4l2_videodevice.cpp\n> +++ b/src/libcamera/v4l2_videodevice.cpp\n> @@ -205,6 +205,7 @@ int V4L2BufferCache::get(const FrameBuffer &buffer)\n>  {\n>  \tbool hit = false;\n>  \tint use = -1;\n> +\tutils::time_point oldest = utils::clock::now();\n>  \n>  \tfor (unsigned int index = 0; index < cache_.size(); index++) {\n>  \t\tconst Entry &entry = cache_[index];\n> @@ -212,8 +213,10 @@ int V4L2BufferCache::get(const FrameBuffer &buffer)\n>  \t\tif (!entry.free)\n>  \t\t\tcontinue;\n>  \n> -\t\tif (use < 0)\n> +\t\tif (cache_[index].lastUsed < oldest) {\n>  \t\t\tuse = index;\n> +\t\t\toldest = cache_[index].lastUsed;\n> +\t\t}\n>  \n>  \t\t/* Try to find a cache hit by comparing the planes. */\n>  \t\tif (cache_[index] == buffer) {\n> @@ -245,12 +248,12 @@ void V4L2BufferCache::put(unsigned int index)\n>  }\n>  \n>  V4L2BufferCache::Entry::Entry()\n> -\t: free(true)\n> +\t: free(true), lastUsed(utils::clock::now())\n>  {\n>  }\n>  \n>  V4L2BufferCache::Entry::Entry(bool free, const FrameBuffer &buffer)\n> -\t: free(free)\n> +\t: free(free), lastUsed(utils::clock::now())\n>  {\n>  \tfor (const FrameBuffer::Plane &plane : buffer.planes())\n>  \t\tplanes_.emplace_back(plane);","headers":{"Return-Path":"<laurent.pinchart@ideasonboard.com>","Received":["from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[213.167.242.64])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 1C0BC60438\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tSun, 16 Feb 2020 22:43:30 +0100 (CET)","from pendragon.ideasonboard.com (81-175-216-236.bb.dnainternet.fi\n\t[81.175.216.236])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id 7AF4F2AF;\n\tSun, 16 Feb 2020 22:43:29 +0100 (CET)"],"DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1581889409;\n\tbh=kHPMxNloK+/oMEUDofMvP/Q8ZLJdlY2vyFQsK66aDfg=;\n\th=Date:From:To:Cc:Subject:References:In-Reply-To:From;\n\tb=pQqieVn29Q6JjFv1jPIDpfACmTTL0t4T4Fcv6L9s1hn7ZqzccNtrZwgpvBvjdSPSS\n\tR9XcFIGG6e5+ANIy34wwOHpGmBHNHuhz7IRq7djmwbnK+GvdBuIPembfFt7mOBVgdZ\n\tQw3BrI7M3hApCrbPe8Wb0bgfXJf8y18nXXC9as3M=","Date":"Sun, 16 Feb 2020 23:43:11 +0200","From":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>","To":"Niklas =?utf-8?q?S=C3=B6derlund?= <niklas.soderlund@ragnatech.se>","Cc":"libcamera-devel@lists.libcamera.org","Message-ID":"<20200216214311.GF28645@pendragon.ideasonboard.com>","References":"<20200216161642.152263-1-niklas.soderlund@ragnatech.se>\n\t<20200216161642.152263-2-niklas.soderlund@ragnatech.se>","MIME-Version":"1.0","Content-Type":"text/plain; charset=utf-8","Content-Disposition":"inline","Content-Transfer-Encoding":"8bit","In-Reply-To":"<20200216161642.152263-2-niklas.soderlund@ragnatech.se>","User-Agent":"Mutt/1.10.1 (2018-07-13)","Subject":"Re: [libcamera-devel] [PATCH 1/2] libcamera: V4L2BufferCache:\n\tImprove cache eviction strategy","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>","X-List-Received-Date":"Sun, 16 Feb 2020 21:43:30 -0000"}},{"id":3783,"web_url":"https://patchwork.libcamera.org/comment/3783/","msgid":"<20200217123617.GT3013231@oden.dyn.berto.se>","date":"2020-02-17T12:36:17","subject":"Re: [libcamera-devel] [PATCH 1/2] libcamera: V4L2BufferCache:\n\tImprove cache eviction strategy","submitter":{"id":5,"url":"https://patchwork.libcamera.org/api/people/5/","name":"Niklas Söderlund","email":"niklas.soderlund@ragnatech.se"},"content":"Hi Laurent,\n\nThanks for your feedback.\n\nOn 2020-02-16 23:43:11 +0200, Laurent Pinchart wrote:\n> Hi Niklas,\n> \n> Thank you for the patch.\n> \n> On Sun, Feb 16, 2020 at 05:16:41PM +0100, Niklas Söderlund wrote:\n> > The strategy used to find a free cache entry in the first implementation\n> > was not the smartest, it picked the first free entry. This lead to\n> > unwanted performance issues as they cache was not used as good as it\n> > could for imported buffers.\n> > \n> > Improve this by adding a last usage timestamp to the cache entries and\n> > change the eviction strategy to use the oldest free entry instead of the\n> > first one it finds.\n> \n> Wouldn't it be simpler to as a LRU mechanism, to avoid searching in the\n> whole cache every time ?\n\nIt's an option, but we need to search the whole cache anyhow to see if \nthere is a hot entry in their that should be reused. The change in this \npatch simply piggyback on that walk and provides the best fallback if no \nhit is found. Looking at LUR implementations they seems to be searching \nthe cache for a hit before moving on the eviction part. I'm sure we \ncould have two lists one hash map to lookup hot hits and a LUR to \nfallback to if no hit is found.\n\nBut I'm not sure LUR would be quicker or not, the cache sizes we have \ntoday are bellow 5 so not sure the extra complexity would pay of.\n\n> \n> > Signed-off-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>\n> > ---\n> >  src/libcamera/include/v4l2_videodevice.h | 1 +\n> >  src/libcamera/v4l2_videodevice.cpp       | 9 ++++++---\n> >  2 files changed, 7 insertions(+), 3 deletions(-)\n> > \n> > diff --git a/src/libcamera/include/v4l2_videodevice.h b/src/libcamera/include/v4l2_videodevice.h\n> > index fcf072641420dacf..f04feed87b24f28f 100644\n> > --- a/src/libcamera/include/v4l2_videodevice.h\n> > +++ b/src/libcamera/include/v4l2_videodevice.h\n> > @@ -125,6 +125,7 @@ private:\n> >  \t\tbool operator==(const FrameBuffer &buffer);\n> >  \n> >  \t\tbool free;\n> > +\t\tutils::time_point lastUsed;\n> >  \n> >  \tprivate:\n> >  \t\tstruct Plane {\n> > diff --git a/src/libcamera/v4l2_videodevice.cpp b/src/libcamera/v4l2_videodevice.cpp\n> > index 99470ce11421c77c..9a4d2479b20f5e27 100644\n> > --- a/src/libcamera/v4l2_videodevice.cpp\n> > +++ b/src/libcamera/v4l2_videodevice.cpp\n> > @@ -205,6 +205,7 @@ int V4L2BufferCache::get(const FrameBuffer &buffer)\n> >  {\n> >  \tbool hit = false;\n> >  \tint use = -1;\n> > +\tutils::time_point oldest = utils::clock::now();\n> >  \n> >  \tfor (unsigned int index = 0; index < cache_.size(); index++) {\n> >  \t\tconst Entry &entry = cache_[index];\n> > @@ -212,8 +213,10 @@ int V4L2BufferCache::get(const FrameBuffer &buffer)\n> >  \t\tif (!entry.free)\n> >  \t\t\tcontinue;\n> >  \n> > -\t\tif (use < 0)\n> > +\t\tif (cache_[index].lastUsed < oldest) {\n> >  \t\t\tuse = index;\n> > +\t\t\toldest = cache_[index].lastUsed;\n> > +\t\t}\n> >  \n> >  \t\t/* Try to find a cache hit by comparing the planes. */\n> >  \t\tif (cache_[index] == buffer) {\n> > @@ -245,12 +248,12 @@ void V4L2BufferCache::put(unsigned int index)\n> >  }\n> >  \n> >  V4L2BufferCache::Entry::Entry()\n> > -\t: free(true)\n> > +\t: free(true), lastUsed(utils::clock::now())\n> >  {\n> >  }\n> >  \n> >  V4L2BufferCache::Entry::Entry(bool free, const FrameBuffer &buffer)\n> > -\t: free(free)\n> > +\t: free(free), lastUsed(utils::clock::now())\n> >  {\n> >  \tfor (const FrameBuffer::Plane &plane : buffer.planes())\n> >  \t\tplanes_.emplace_back(plane);\n> \n> -- \n> Regards,\n> \n> Laurent Pinchart","headers":{"Return-Path":"<niklas.soderlund@ragnatech.se>","Received":["from mail-lj1-x243.google.com (mail-lj1-x243.google.com\n\t[IPv6:2a00:1450:4864:20::243])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id BF7D360C18\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tMon, 17 Feb 2020 13:36:19 +0100 (CET)","by mail-lj1-x243.google.com with SMTP id q8so18612817ljj.11\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tMon, 17 Feb 2020 04:36:19 -0800 (PST)","from localhost (h-200-138.A463.priv.bahnhof.se. [176.10.200.138])\n\tby smtp.gmail.com with ESMTPSA id\n\tf4sm314037ljo.79.2020.02.17.04.36.17\n\t(version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256);\n\tMon, 17 Feb 2020 04:36:17 -0800 (PST)"],"DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=ragnatech-se.20150623.gappssmtp.com; s=20150623;\n\th=date:from:to:cc:subject:message-id:references:mime-version\n\t:content-disposition:content-transfer-encoding:in-reply-to;\n\tbh=NgqSSwkB7KkHvha3oqANqsnjjBsqyW6vveDnol6jSLw=;\n\tb=p6vqPq7FrSrcbLmvgXQzpgmqUjQv8HVbVjYG7qIdSTcK2TjmRRegHc1p//ZkIwpUKw\n\tWg0zyRx+qT5VcCqEbx6/0ypphZwmHd57IGuHcneoTZvJNa7sI0nyYgnc10MMW7Ejqlm3\n\tAGPMJ4E7Q/RsA4zaRimDMtu1lcrXBkS7wWLvplJnysVOunl/TRdsBn8WlsQgTKnzQaCr\n\tNQhPFP8KaZDeZDfcrl0820k8TG3CxlXmerHoyi08m8xK6r5tkGyCyYNw4QJ6yonOb+Aj\n\tZqFhS2xSNjPBxYcQxHNnpMiC1blBy2iOlybrOfXqCCnAgN0DG08JCNur0cU/99Gl3Wv/\n\t3caA==","X-Google-DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=1e100.net; s=20161025;\n\th=x-gm-message-state:date:from:to:cc:subject:message-id:references\n\t:mime-version:content-disposition:content-transfer-encoding\n\t:in-reply-to;\n\tbh=NgqSSwkB7KkHvha3oqANqsnjjBsqyW6vveDnol6jSLw=;\n\tb=bss9veBFxmBH0Ni803KVYuCzig6LVK0Lm6dE+vGR3c0KJpF660QMf09Fqkf8bK/KP3\n\tQWy4Od6moZmnxhv99diUcU0vbZBNIxcvqfGR+0PTc0CxAreHUkiGWnQbgMHYqYwQ4d2K\n\tMlMnR9QYUdE/zds8iobSfy1+GO0kq5xDGxBn6MkROPD8Th2QEE6NXhVf8+hNL69WdEXL\n\tWpUckYFmMz0UbnIYJ8oG/cEjpVjbbzGgi+kWmqQSxbly1PPRh/Zza3f6Y/XBK5Y87BRw\n\t7Hu14bGtRbF7aIcfA3P9x7t90rynkOR+OfO8LZIaLAaZedRlD8DLK+UydRRzM+yL/8s8\n\teXcw==","X-Gm-Message-State":"APjAAAUQ4z7njHL2BGXah3MpB3/vUO44eV8W6frgNsTqR44dZDi3MpnR\n\tjUGoj+SVR/jDixib7w7jDp49O+bYnes=","X-Google-Smtp-Source":"APXvYqxozFypW1kIB7AEIsEegDqwDUlTwDIdcvcgyf8FBiiZWM+Su6xOvoDrQ3okkovf7rMCPhEK/g==","X-Received":"by 2002:a2e:81c3:: with SMTP id s3mr9620407ljg.168.1581942978967;\n\tMon, 17 Feb 2020 04:36:18 -0800 (PST)","Date":"Mon, 17 Feb 2020 13:36:17 +0100","From":"Niklas =?iso-8859-1?q?S=F6derlund?= <niklas.soderlund@ragnatech.se>","To":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>","Cc":"libcamera-devel@lists.libcamera.org","Message-ID":"<20200217123617.GT3013231@oden.dyn.berto.se>","References":"<20200216161642.152263-1-niklas.soderlund@ragnatech.se>\n\t<20200216161642.152263-2-niklas.soderlund@ragnatech.se>\n\t<20200216214311.GF28645@pendragon.ideasonboard.com>","MIME-Version":"1.0","Content-Type":"text/plain; charset=iso-8859-1","Content-Disposition":"inline","Content-Transfer-Encoding":"8bit","In-Reply-To":"<20200216214311.GF28645@pendragon.ideasonboard.com>","Subject":"Re: [libcamera-devel] [PATCH 1/2] libcamera: V4L2BufferCache:\n\tImprove cache eviction strategy","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>","X-List-Received-Date":"Mon, 17 Feb 2020 12:36:20 -0000"}},{"id":3787,"web_url":"https://patchwork.libcamera.org/comment/3787/","msgid":"<CAEmqJPqHP+GFx0K5z=sJpVpU_ibZEHdXrdymoW2RL10tn_0k-A@mail.gmail.com>","date":"2020-02-17T16:33:15","subject":"Re: [libcamera-devel] [PATCH 1/2] libcamera: V4L2BufferCache:\n\tImprove cache eviction strategy","submitter":{"id":34,"url":"https://patchwork.libcamera.org/api/people/34/","name":"Naushir Patuck","email":"naush@raspberrypi.com"},"content":"Hi Niklas,\n\n\nOn Sun, 16 Feb 2020 at 16:17, Niklas Söderlund\n<niklas.soderlund@ragnatech.se> wrote:\n>\n> The strategy used to find a free cache entry in the first implementation\n> was not the smartest, it picked the first free entry. This lead to\n> unwanted performance issues as they cache was not used as good as it\n> could for imported buffers.\n>\n> Improve this by adding a last usage timestamp to the cache entries and\n> change the eviction strategy to use the oldest free entry instead of the\n> first one it finds.\n>\n> Signed-off-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>\n> ---\n>  src/libcamera/include/v4l2_videodevice.h | 1 +\n>  src/libcamera/v4l2_videodevice.cpp       | 9 ++++++---\n>  2 files changed, 7 insertions(+), 3 deletions(-)\n>\n> diff --git a/src/libcamera/include/v4l2_videodevice.h b/src/libcamera/include/v4l2_videodevice.h\n> index fcf072641420dacf..f04feed87b24f28f 100644\n> --- a/src/libcamera/include/v4l2_videodevice.h\n> +++ b/src/libcamera/include/v4l2_videodevice.h\n> @@ -125,6 +125,7 @@ private:\n>                 bool operator==(const FrameBuffer &buffer);\n>\n>                 bool free;\n> +               utils::time_point lastUsed;\n>\n>         private:\n>                 struct Plane {\n> diff --git a/src/libcamera/v4l2_videodevice.cpp b/src/libcamera/v4l2_videodevice.cpp\n> index 99470ce11421c77c..9a4d2479b20f5e27 100644\n> --- a/src/libcamera/v4l2_videodevice.cpp\n> +++ b/src/libcamera/v4l2_videodevice.cpp\n> @@ -205,6 +205,7 @@ int V4L2BufferCache::get(const FrameBuffer &buffer)\n>  {\n>         bool hit = false;\n>         int use = -1;\n> +       utils::time_point oldest = utils::clock::now();\n>\n>         for (unsigned int index = 0; index < cache_.size(); index++) {\n>                 const Entry &entry = cache_[index];\n> @@ -212,8 +213,10 @@ int V4L2BufferCache::get(const FrameBuffer &buffer)\n>                 if (!entry.free)\n>                         continue;\n>\n> -               if (use < 0)\n> +               if (cache_[index].lastUsed < oldest) {\n>                         use = index;\n> +                       oldest = cache_[index].lastUsed;\n> +               }\n>\n>                 /* Try to find a cache hit by comparing the planes. */\n>                 if (cache_[index] == buffer) {\n> @@ -245,12 +248,12 @@ void V4L2BufferCache::put(unsigned int index)\n>  }\n>\n>  V4L2BufferCache::Entry::Entry()\n> -       : free(true)\n> +       : free(true), lastUsed(utils::clock::now())\n>  {\n>  }\n>\n>  V4L2BufferCache::Entry::Entry(bool free, const FrameBuffer &buffer)\n> -       : free(free)\n> +       : free(free), lastUsed(utils::clock::now())\n>  {\n>         for (const FrameBuffer::Plane &plane : buffer.planes())\n>                 planes_.emplace_back(plane);\n\nThank you, this does fix my issue with cache entry under-utilisation.\n\nReviewed-by: Naushir Patuck <naush@raspberrypi.com>\n\n> --\n> 2.25.0\n>\n> _______________________________________________\n> libcamera-devel mailing list\n> libcamera-devel@lists.libcamera.org\n> https://lists.libcamera.org/listinfo/libcamera-devel\n\nThanks,\nNaush","headers":{"Return-Path":"<naush@raspberrypi.com>","Received":["from mail-lf1-x142.google.com (mail-lf1-x142.google.com\n\t[IPv6:2a00:1450:4864:20::142])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 7770E61944\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tMon, 17 Feb 2020 17:33:31 +0100 (CET)","by mail-lf1-x142.google.com with SMTP id l18so12353818lfc.1\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tMon, 17 Feb 2020 08:33:31 -0800 (PST)"],"DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=raspberrypi.com; s=google;\n\th=mime-version:references:in-reply-to:from:date:message-id:subject:to\n\t:cc:content-transfer-encoding;\n\tbh=5cmC44ydo+m7trJ9LHYpo8TZmVEqSu+wrcpt+qTcmhQ=;\n\tb=Kk1nP73nAMXktLFAnRb4O6jAZozf03o9kFG2HuJEYc4juTea7fruLyz7q6NwTM1ht4\n\tugEHmsC27bnxvu3Lw5KT1XBti7lr42KPMDgm1hhopzUAJxedm53DJEFQFZDgJmfleZsP\n\tDmceV0L28l+3vmWh7MWYAe8Z+VDZpf9r/sE6NRwD/5vaA7lQlOgd157W9t0N1kcciEV/\n\tXEtYjOH7Xo4Z1+mRmLlbdbe5nw1cCQWnqL07GH5+1COdoee9WUTjyzcZEhPKDpn2dvCm\n\ty4nw8874ZKCS9l1TRDa949Q7Y7IEk7BO8QgK4UiAss38SpKx9W1JgdF6KgUmMQMFpxv1\n\txIgA==","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:content-transfer-encoding;\n\tbh=5cmC44ydo+m7trJ9LHYpo8TZmVEqSu+wrcpt+qTcmhQ=;\n\tb=Ud6ubMKNmiicNn5Slm22cGEoAOu45ezabJVGeIx700LkqfXIAfBXw8cA3/T7+tIBPj\n\tPQWPd5ghlBDJoj9bdLiQADAzkLn4ZWsvt52AgBzyVolbRzTQUWW+icMRjuFRVE7azDf7\n\t2Gyd8+h84eNVW12ileSyAYFJRDv4aL6tJemfKp8vscKUCrGM7HzHmrEBFqudNWwNpNqS\n\tUWAnkkm1UgmZqFksb4k+gI32algD7YRKVstZcsWW+scr0+Brtc55iRTZ65/kpg3tPZDX\n\tvG2DUXocgQy6YXD0ifmcj5Z00OCE3BBy7paVxdxjlOI483nzlhM0PTVaVHuzaz0iE/j8\n\tnuZQ==","X-Gm-Message-State":"APjAAAWl2cMnemaG9FxY5MVjMTE12bR34OpWH/RuwkWFWIr+p39nDlB5\n\tGbKg+rCH53glOil4MAScSeVMiNurb2o3obn0jkiy6Q==","X-Google-Smtp-Source":"APXvYqyiYhyOBSI9khduVIUF91H5ECHclDsrE9ouyKZsbiTKnwtoPwlMG4y4vu9GEK6B2albQrkgn6kzA3F5uKBQt/g=","X-Received":"by 2002:ac2:5e71:: with SMTP id\n\ta17mr8317132lfr.181.1581957210690; \n\tMon, 17 Feb 2020 08:33:30 -0800 (PST)","MIME-Version":"1.0","References":"<20200216161642.152263-1-niklas.soderlund@ragnatech.se>\n\t<20200216161642.152263-2-niklas.soderlund@ragnatech.se>","In-Reply-To":"<20200216161642.152263-2-niklas.soderlund@ragnatech.se>","From":"Naushir Patuck <naush@raspberrypi.com>","Date":"Mon, 17 Feb 2020 16:33:15 +0000","Message-ID":"<CAEmqJPqHP+GFx0K5z=sJpVpU_ibZEHdXrdymoW2RL10tn_0k-A@mail.gmail.com>","To":"=?utf-8?q?Niklas_S=C3=B6derlund?= <niklas.soderlund@ragnatech.se>","Cc":"libcamera-devel@lists.libcamera.org","Content-Type":"text/plain; charset=\"UTF-8\"","Content-Transfer-Encoding":"quoted-printable","Subject":"Re: [libcamera-devel] [PATCH 1/2] libcamera: V4L2BufferCache:\n\tImprove cache eviction strategy","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>","X-List-Received-Date":"Mon, 17 Feb 2020 16:33:31 -0000"}}]