From: Julien Grall <julien.grall@linaro.org>
To: Ian Campbell <ian.campbell@citrix.com>, xen-devel@lists.xen.org
Cc: tim@xen.org, vijay.kilari@gmail.com, stefano.stabellini@eu.citrix.com
Subject: Re: [PATCH RFC 6/9] xen: arm: handle variable p2m levels in p2m_lookup
Date: Thu, 31 Jul 2014 12:14:18 +0100 [thread overview]
Message-ID: <53DA250A.7090307@linaro.org> (raw)
In-Reply-To: <5a0397cc676556da56a3204c9e056052f5dcb9da.1406728037.git.ian.campbell@citrix.com>
Hi Ian,
On 07/30/2014 02:47 PM, Ian Campbell wrote:
> This paves the way for boot-time selection of the number of levels to
> use in the p2m, which is required to support both 40-bit and 48-bit
> systems. For now the starting level remains a compile time constant.
>
> Implemented by turning the linear sequence of lookups into a loop.
>
> Signed-off-by: Ian Campbell <ian.campbell@citrix.com>
> ---
> xen/arch/arm/p2m.c | 70 +++++++++++++++++++++++++++++++++-------------------
> 1 file changed, 45 insertions(+), 25 deletions(-)
>
> diff --git a/xen/arch/arm/p2m.c b/xen/arch/arm/p2m.c
> index 225d125..557663f 100644
> --- a/xen/arch/arm/p2m.c
> +++ b/xen/arch/arm/p2m.c
> @@ -149,45 +149,69 @@ static lpae_t *p2m_map_first(struct p2m_domain *p2m, paddr_t addr)
> paddr_t p2m_lookup(struct domain *d, paddr_t paddr, p2m_type_t *t)
> {
> struct p2m_domain *p2m = &d->arch.p2m;
> - lpae_t pte, *first = NULL, *second = NULL, *third = NULL;
> + const unsigned int offsets[4] = {
> + zeroeth_table_offset(paddr),
> + first_table_offset(paddr),
> + second_table_offset(paddr),
> + third_table_offset(paddr)
> + };
> + const paddr_t masks[4] = {
> + ZEROETH_MASK, FIRST_MASK, SECOND_MASK, THIRD_MASK
> + };
> + lpae_t pte, *map;
> paddr_t maddr = INVALID_PADDR;
> paddr_t mask;
> p2m_type_t _t;
> + int level, root_table;
I would use unsigned int here.
> +
> + BUILD_BUG_ON(THIRD_MASK != PAGE_MASK);
>
> /* Allow t to be NULL */
> t = t ?: &_t;
>
> *t = p2m_invalid;
>
> + if ( P2M_ROOT_PAGES > 1 )
> + {
> + /*
> + * Concatenated root-level tables. The table number will be
> + * the offset at the previous level. It is not possible to
> + * concetenate a level-0 root.
concatenate
> + */
> + BUG_ON(P2M_ROOT_LEVEL == 0);
I don't think this check is necessary in a production build (ie
debug=n). If people is porting a new board, then it should be done in
debug mode.
Hence it should be a bit "faster" as this code will be called often.
I would switch this BUG_ON to ASSERT.
> + root_table = offsets[P2M_ROOT_LEVEL - 1];
> + if ( root_table >= P2M_ROOT_PAGES )
> + goto err;
> + }
> + else
> + root_table = 0;
> +
> spin_lock(&p2m->lock);
>
> - first = p2m_map_first(p2m, paddr);
> - if ( !first )
> - goto err;
> + map = __map_domain_page(p2m->root + root_table);
>
> - mask = FIRST_MASK;
> - pte = first[first_table_offset(paddr)];
> - if ( !p2m_table(pte) )
> - goto done;
> + for ( level = P2M_ROOT_LEVEL ; level < 4 ; level++ )
> + {
> + mask = masks[level];
>
> - mask = SECOND_MASK;
> - second = map_domain_page(pte.p2m.base);
> - pte = second[second_table_offset(paddr)];
> - if ( !p2m_table(pte) )
> - goto done;
> + pte = map[offsets[level]];
>
> - mask = THIRD_MASK;
> + if ( level == 3 && !p2m_table(pte) )
> + /* Invalid, clobber the pte */
> + pte.bits = 0;
> + if ( level == 3 || !p2m_table(pte) )
> + /* Done */
> + break;
>
> - BUILD_BUG_ON(THIRD_MASK != PAGE_MASK);
> + BUG_ON(level == 3);
Rather than checking level == 3, I would add
BUG_ON(level < 4) at the end of loop.
The only drawback to be there is we map one more page.
And same remark as the previous BUG_ON().
Regards,
--
Julien Grall
next prev parent reply other threads:[~2014-07-31 11:14 UTC|newest]
Thread overview: 30+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-07-30 13:44 [PATCH RFC 0/9] xen: arm: support for > 40-bit physical addressing Ian Campbell
2014-07-30 13:47 ` [PATCH RFC 1/9] xen: arm: rename p2m->first_level to p2m->root Ian Campbell
2014-07-30 13:47 ` [PATCH RFC 2/9] xen: arm: Implement variable levels in dump_pt_walk Ian Campbell
2014-07-30 16:40 ` Julien Grall
2014-07-30 13:47 ` [PATCH RFC 3/9] xen: arm: handle concatenated root tables " Ian Campbell
2014-07-30 16:58 ` Julien Grall
2014-09-04 14:40 ` Ian Campbell
2014-09-08 20:54 ` Julien Grall
2014-07-30 13:47 ` [PATCH RFC 4/9] xen: arm: move setup_virt_paging to p2m.c Ian Campbell
2014-07-30 17:00 ` Julien Grall
2014-07-30 13:47 ` [PATCH RFC 5/9] xen: arm: Defer setting of VTCR_EL2 until after CPUs are up Ian Campbell
2014-07-30 17:11 ` Julien Grall
2014-09-04 14:50 ` Ian Campbell
2014-07-30 13:47 ` [PATCH RFC 6/9] xen: arm: handle variable p2m levels in p2m_lookup Ian Campbell
2014-07-31 11:14 ` Julien Grall [this message]
2014-09-04 14:54 ` Ian Campbell
2014-07-30 13:47 ` [PATCH RFC 7/9] xen: arm: handle variable p2m levels in apply_p2m_changes Ian Campbell
2014-07-31 15:38 ` Julien Grall
2014-08-11 7:00 ` Vijay Kilari
2014-08-26 9:11 ` Vijay Kilari
2014-09-04 14:01 ` Ian Campbell
2014-07-30 13:47 ` [PATCH RFC 8/9] xen: arm: support for up to 48-bit physical addressing on arm64 Ian Campbell
2014-08-07 15:33 ` Julien Grall
2014-07-30 13:47 ` [PATCH RFC 9/9] xen: arm: support for up to 48-bit IPA " Ian Campbell
2014-08-07 15:49 ` Julien Grall
2014-07-30 16:06 ` [PATCH RFC 1/9] xen: arm: rename p2m->first_level to p2m->root Julien Grall
2014-07-30 16:19 ` Ian Campbell
2014-07-30 16:23 ` Julien Grall
2014-07-31 8:22 ` [PATCH RFC 0/9] xen: arm: support for > 40-bit physical addressing Vijay Kilari
2014-07-31 8:54 ` Ian Campbell
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=53DA250A.7090307@linaro.org \
--to=julien.grall@linaro.org \
--cc=ian.campbell@citrix.com \
--cc=stefano.stabellini@eu.citrix.com \
--cc=tim@xen.org \
--cc=vijay.kilari@gmail.com \
--cc=xen-devel@lists.xen.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.