From: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
To: kieran.bingham@ideasonboard.com
Cc: linux-renesas-soc@vger.kernel.org, linux-media@vger.kernel.org
Subject: Re: [PATCH v2 2/8] v4l: vsp1: Provide a fragment pool
Date: Wed, 13 Sep 2017 05:15:29 +0300 [thread overview]
Message-ID: <1597664.yeZO11HtTZ@avalon> (raw)
In-Reply-To: <ce5f2a44-6d66-2822-450f-ece7f8d819f0@ideasonboard.com>
Hi Kieran,
On Monday, 11 September 2017 23:30:25 EEST Kieran Bingham wrote:
> On 17/08/17 13:13, Laurent Pinchart wrote:
> > On Monday 14 Aug 2017 16:13:25 Kieran Bingham wrote:
> >> Each display list allocates a body to store register values in a dma
> >> accessible buffer from a dma_alloc_wc() allocation. Each of these
> >> results in an entry in the TLB, and a large number of display list
> >> allocations adds pressure to this resource.
> >>
> >> Reduce TLB pressure on the IPMMUs by allocating multiple display list
> >> bodies in a single allocation, and providing these to the display list
> >> through a 'fragment pool'. A pool can be allocated by the display list
> >> manager or entities which require their own body allocations.
> >>
> >> Signed-off-by: Kieran Bingham <kieran.bingham+renesas@ideasonboard.com>
> >>
> >> ---
> >>
> >> v2:
> >> - assign dlb->dma correctly
> >>
> >> ---
> >>
> >> drivers/media/platform/vsp1/vsp1_dl.c | 129 +++++++++++++++++++++++++++-
> >> drivers/media/platform/vsp1/vsp1_dl.h | 8 ++-
> >> 2 files changed, 137 insertions(+)
> >>
> >> diff --git a/drivers/media/platform/vsp1/vsp1_dl.c
> >> b/drivers/media/platform/vsp1/vsp1_dl.c index cb4625ae13c2..aab9dd6ec0eb
> >> 100644
> >> --- a/drivers/media/platform/vsp1/vsp1_dl.c
> >> +++ b/drivers/media/platform/vsp1/vsp1_dl.c
[snip]
> >> /*
> >> + * Fragment pool's reduce the pressure on the iommu TLB by allocating a
> >> single
> >> + * large area of DMA memory and allocating it as a pool of fragment
> >> bodies
> >> + */
> >
> > Could you document non-static function using kerneldoc ? Parameters to
> > this function would benefit from some documentation. I'd also like to see
> > the fragment get/put functions documented, as you remove existing
> > kerneldoc for the alloc/free existing functions in patch 3/8.
>
> Ah yes of course.
>
> >> +struct vsp1_dl_fragment_pool *
> >> +vsp1_dl_fragment_pool_alloc(struct vsp1_device *vsp1, unsigned int qty,
> >
> > I think I would name this function vsp1_dl_fragment_pool_create(), as it
> > does more than just allocating memory. Similarly I'd call the free
> > function vsp1_dl_fragment_pool_destroy().
>
> That sounds reasonable. Done.
>
> > qty is a bit vague, I'd rename it to num_fragments.
>
> Ok with me.
>
> >> + unsigned int num_entries, size_t extra_size)
> >> +{
> >> + struct vsp1_dl_fragment_pool *pool;
> >> + size_t dlb_size;
> >> + unsigned int i;
> >> +
> >> + pool = kzalloc(sizeof(*pool), GFP_KERNEL);
> >> + if (!pool)
> >> + return NULL;
> >> +
> >> + pool->vsp1 = vsp1;
> >> +
> >> + dlb_size = num_entries * sizeof(struct vsp1_dl_entry) + extra_size;
> >
> > extra_size is only used by vsp1_dlm_create(), to allocate extra memory for
> > the display list header. We need one header per display list, not per
> > display list body.
>
> Good catch, that will take a little bit of reworking.
I didn't propose a fix for this as I wasn't sure how to fix it properly. I
thus won't complain too loudly if you can't fix it either and waste a bit of
memory :-) But in that case please add a comment to explain what's going on.
> >> + pool->size = dlb_size * qty;
> >> +
> >> + pool->bodies = kcalloc(qty, sizeof(*pool->bodies), GFP_KERNEL);
> >> + if (!pool->bodies) {
> >> + kfree(pool);
> >> + return NULL;
> >> + }
> >> +
> >> + pool->mem = dma_alloc_wc(vsp1->bus_master, pool->size, &pool->dma,
> >> + GFP_KERNEL);
> >
> > This is a weird indentation.
>
> I know! - Not sure how that slipped by :)
>
> >> + if (!pool->mem) {
> >> + kfree(pool->bodies);
> >> + kfree(pool);
> >> + return NULL;
> >> + }
> >> +
> >> + spin_lock_init(&pool->lock);
> >> + INIT_LIST_HEAD(&pool->free);
> >> +
> >> + for (i = 0; i < qty; ++i) {
> >> + struct vsp1_dl_body *dlb = &pool->bodies[i];
> >> +
> >> + dlb->pool = pool;
> >> + dlb->max_entries = num_entries;
> >> +
> >> + dlb->dma = pool->dma + i * dlb_size;
> >> + dlb->entries = pool->mem + i * dlb_size;
> >> +
> >> + list_add_tail(&dlb->free, &pool->free);
> >> + }
> >> +
> >> + return pool;
> >> +}
> >> +
> >> +void vsp1_dl_fragment_pool_free(struct vsp1_dl_fragment_pool *pool)
> >> +{
> >> + if (!pool)
> >> + return;
> >
> > Can this happen ?
>
> I was mirroring 'kfree()' support here ... such that error paths can be
> simple.
>
> Would you prefer that it's required to be valid (non-null) pointer?
>
> Actually - I think it is better to leave this for now - as we now call this
> function from the .destroy() entity functions ...
It was a genuine question :-) We have more control over the
vsp1_dl_fragment_pool_free() callers as the function is internal to the
driver. If we have real use cases for pool being NULL then let's keep the
check.
> >> +
> >> + if (pool->mem)
> >> + dma_free_wc(pool->vsp1->bus_master, pool->size, pool->mem,
> >> + pool->dma);
> >> +
> >> + kfree(pool->bodies);
> >> + kfree(pool);
> >> +}
[snip]
--
Regards,
Laurent Pinchart
next prev parent reply other threads:[~2017-09-13 2:15 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 [this message]
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
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=1597664.yeZO11HtTZ@avalon \
--to=laurent.pinchart@ideasonboard.com \
--cc=kieran.bingham@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.