From: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
To: Kieran Bingham <kieran.bingham+renesas@ideasonboard.com>
Cc: linux-renesas-soc@vger.kernel.org, linux-media@vger.kernel.org
Subject: Re: [PATCH v2 4/8] v4l: vsp1: Use reference counting for fragments
Date: Thu, 17 Aug 2017 15:53:31 +0300 [thread overview]
Message-ID: <1718495.alvb22IHZk@avalon> (raw)
In-Reply-To: <d28cb6bce32d33479f5d5b49e67c4c79a9b7b4bc.1502723341.git-series.kieran.bingham+renesas@ideasonboard.com>
Hi Kieran,
Thank you for the patch.
On Monday 14 Aug 2017 16:13:27 Kieran Bingham wrote:
> Extend the display list body with a reference count, allowing bodies to
> be kept as long as a reference is maintained. This provides the ability
> to keep a cached copy of bodies which will not change, so that they can
> be re-applied to multiple display lists.
>
> Signed-off-by: Kieran Bingham <kieran.bingham+renesas@ideasonboard.com>
>
> ---
> This could be squashed into the fragment update code, but it's not a
> straightforward squash as the refcounts will affect both:
> v4l: vsp1: Provide a fragment pool
> and
> v4l: vsp1: Convert display lists to use new fragment pool
> therefore, I have kept this separate to prevent breaking bisectability
> of the vsp-tests.
Sounds good to me.
> ---
> drivers/media/platform/vsp1/vsp1_clu.c | 7 ++++++-
> drivers/media/platform/vsp1/vsp1_dl.c | 15 ++++++++++++++-
> drivers/media/platform/vsp1/vsp1_lut.c | 7 ++++++-
> 3 files changed, 26 insertions(+), 3 deletions(-)
>
> diff --git a/drivers/media/platform/vsp1/vsp1_clu.c
> b/drivers/media/platform/vsp1/vsp1_clu.c index 52c523625e2f..175717018e11
> 100644
> --- a/drivers/media/platform/vsp1/vsp1_clu.c
> +++ b/drivers/media/platform/vsp1/vsp1_clu.c
> @@ -257,8 +257,13 @@ static void clu_configure(struct vsp1_entity *entity,
> clu->clu = NULL;
> spin_unlock_irqrestore(&clu->lock, flags);
>
> - if (dlb)
> + if (dlb) {
> vsp1_dl_list_add_fragment(dl, dlb);
> +
> + /* release our local reference */
> + vsp1_dl_fragment_put(dlb);
> + }
> +
> break;
> }
> }
> diff --git a/drivers/media/platform/vsp1/vsp1_dl.c
> b/drivers/media/platform/vsp1/vsp1_dl.c index 6ffdc3549283..37feda248946
> 100644
> --- a/drivers/media/platform/vsp1/vsp1_dl.c
> +++ b/drivers/media/platform/vsp1/vsp1_dl.c
> @@ -14,6 +14,7 @@
> #include <linux/device.h>
> #include <linux/dma-mapping.h>
> #include <linux/gfp.h>
> +#include <linux/refcount.h>
> #include <linux/slab.h>
> #include <linux/workqueue.h>
>
> @@ -58,6 +59,8 @@ struct vsp1_dl_body {
> struct list_head list;
> struct list_head free;
>
> + refcount_t refcnt;
> +
> struct vsp1_dl_fragment_pool *pool;
> struct vsp1_device *vsp1;
>
> @@ -230,6 +233,7 @@ struct vsp1_dl_body *vsp1_dl_fragment_get(struct
> vsp1_dl_fragment_pool *pool)
> if (!list_empty(&pool->free)) {
> dlb = list_first_entry(&pool->free, struct vsp1_dl_body,
> free);
> list_del(&dlb->free);
> + refcount_set(&dlb->refcnt, 1);
> }
>
> spin_unlock_irqrestore(&pool->lock, flags);
> @@ -244,6 +248,9 @@ void vsp1_dl_fragment_put(struct vsp1_dl_body *dlb)
> if (!dlb)
> return;
>
> + if (!refcount_dec_and_test(&dlb->refcnt))
> + return;
> +
> dlb->num_entries = 0;
>
> spin_lock_irqsave(&dlb->pool->lock, flags);
> @@ -428,7 +435,11 @@ void vsp1_dl_list_write(struct vsp1_dl_list *dl, u32
> reg, u32 data)
> * list, in the order in which fragments are added.
> *
> * Adding a fragment to a display list passes ownership of the fragment to
> the
> - * list. The caller must not touch the fragment after this call.
> + * list. The caller must not modify the fragment after this call, but can
> retain
> + * a reference to it for future use if necessary, to add to subsequent
> lists.
I think there's a bit of contradiction here, if the ownership passes to the
list then the caller shouldn't touch it anymore. How about stating it as
follows ?
* The caller retains its reference to the fragment when adding it to a
* display list, but is not allowed to add new entries to the fragment.
* The reference must be explicitly released by a call to
* vsp1_dl_fragment_put() when the fragment isn't needed anymore.
> the
> - * list. The caller must not touch the fragment after this call.
> + * list. The caller must not modify the fragment after this call, but can
> retain
> + * a reference to it for future use if necessary, to add to subsequent
> lists.
> + *
> + * The reference count of the body is incremented by this attachment, and
> thus
> + * the caller should release it's reference if does not want to cache the
> body.
> *
> * Fragments are only usable for display lists in header mode. Attempt to
> * add a fragment to a header-less display list will return an error.
> @@ -440,6 +451,8 @@ int vsp1_dl_list_add_fragment(struct vsp1_dl_list *dl,
> if (dl->dlm->mode != VSP1_DL_MODE_HEADER)
> return -EINVAL;
>
> + refcount_inc(&dlb->refcnt);
> +
> list_add_tail(&dlb->list, &dl->fragments);
> return 0;
> }
> diff --git a/drivers/media/platform/vsp1/vsp1_lut.c
> b/drivers/media/platform/vsp1/vsp1_lut.c index 57482e057e54..388bd89ade0b
> 100644
> --- a/drivers/media/platform/vsp1/vsp1_lut.c
> +++ b/drivers/media/platform/vsp1/vsp1_lut.c
> @@ -213,8 +213,13 @@ static void lut_configure(struct vsp1_entity *entity,
> lut->lut = NULL;
> spin_unlock_irqrestore(&lut->lock, flags);
>
> - if (dlb)
> + if (dlb) {
> vsp1_dl_list_add_fragment(dl, dlb);
> +
> + /* release our local reference */
> + vsp1_dl_fragment_put(dlb);
> + }
> +
> break;
> }
> }
--
Regards,
Laurent Pinchart
next prev parent reply other threads:[~2017-08-17 12:53 UTC|newest]
Thread overview: 32+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-08-14 15:13 [PATCH v2 0/8] vsp1: TLB optimisation and DL caching Kieran Bingham
2017-08-14 15:13 ` [PATCH v2 1/8] v4l: vsp1: Protect fragments against overflow Kieran Bingham
2017-08-16 21:53 ` Laurent Pinchart
2017-08-17 8:16 ` Kieran Bingham
2017-08-14 15:13 ` [PATCH v2 2/8] v4l: vsp1: Provide a fragment pool Kieran Bingham
2017-08-17 12:13 ` Laurent Pinchart
2017-09-11 20:30 ` Kieran Bingham
2017-09-13 2:15 ` Laurent Pinchart
2017-08-14 15:13 ` [PATCH v2 3/8] v4l: vsp1: Convert display lists to use new " Kieran Bingham
2017-08-17 12:13 ` Laurent Pinchart
2017-09-11 20:27 ` Kieran Bingham
2017-09-13 2:26 ` Laurent Pinchart
2017-08-14 15:13 ` [PATCH v2 4/8] v4l: vsp1: Use reference counting for fragments Kieran Bingham
2017-08-17 12:53 ` Laurent Pinchart [this message]
2017-08-14 15:13 ` [PATCH v2 5/8] v4l: vsp1: Refactor display list configure operations Kieran Bingham
2017-08-17 18:13 ` Laurent Pinchart
2017-09-11 21:16 ` Kieran Bingham
2017-09-12 19:19 ` Laurent Pinchart
2017-11-17 15:07 ` Kieran Bingham
2018-02-28 16:41 ` Kieran Bingham
2018-02-28 21:04 ` Laurent Pinchart
2017-08-14 15:13 ` [PATCH v2 6/8] v4l: vsp1: Adapt entities to configure into a body Kieran Bingham
2017-08-17 17:58 ` Laurent Pinchart
2017-09-11 21:42 ` Kieran Bingham
2017-09-12 19:18 ` Laurent Pinchart
2017-11-17 13:40 ` Kieran Bingham
2017-08-14 15:13 ` [PATCH v2 7/8] v4l: vsp1: Move video configuration to a cached dlb Kieran Bingham
2017-08-17 18:10 ` Laurent Pinchart
2017-11-16 18:19 ` Kieran Bingham
2017-08-14 15:13 ` [PATCH v2 8/8] v4l: vsp1: Reduce display list body size Kieran Bingham
2017-08-17 16:11 ` Laurent Pinchart
2017-09-11 21:15 ` Kieran Bingham
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1718495.alvb22IHZk@avalon \
--to=laurent.pinchart@ideasonboard.com \
--cc=kieran.bingham+renesas@ideasonboard.com \
--cc=linux-media@vger.kernel.org \
--cc=linux-renesas-soc@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.