|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH] xen/arm: p2m: Don't create new table when the mapping is removed
On Wed, 2013-12-18 at 17:31 +0000, Julien Grall wrote:
> When Xen is removing/relinquishing mapping, it will create second/third
> tables
> if they don't exist.
>
> Non-existent table means the address range was never mapped, so Xen can safely
> skip them.
>
> Signed-off-by: Julien Grall <julien.grall@xxxxxxxxxx>
>
> ---
> Release: This is an improvement for Xen 4.4. It will save time during
> relinquish phase and avoid dummy allocation.
> The downside is the patch is modifying p2m loop which is used everywhere.
> ---
> xen/arch/arm/p2m.c | 22 ++++++++++++++++++++--
> 1 file changed, 20 insertions(+), 2 deletions(-)
>
> diff --git a/xen/arch/arm/p2m.c b/xen/arch/arm/p2m.c
> index d24a6fc..9ef8819 100644
> --- a/xen/arch/arm/p2m.c
> +++ b/xen/arch/arm/p2m.c
> @@ -246,10 +246,12 @@ static int create_p2m_entries(struct domain *d,
> cur_first_offset = ~0,
> cur_second_offset = ~0;
> unsigned long count = 0;
> + bool_t populate = (op == INSERT || op == ALLOCATE);
>
> spin_lock(&p2m->lock);
>
> - for(addr = start_gpaddr; addr < end_gpaddr; addr += PAGE_SIZE)
> + addr = start_gpaddr;
> + while ( addr < end_gpaddr )
> {
> if ( cur_first_page != p2m_first_level_index(addr) )
> {
> @@ -265,8 +267,15 @@ static int create_p2m_entries(struct domain *d,
>
> if ( !first[first_table_offset(addr)].p2m.valid )
> {
> + if ( !populate )
> + {
> + addr += FIRST_SIZE;
I think this subtly does the wrong thing if addr is not FIRST_SIZE
aligned, which it might be on the first iteration. That will skip the
start of the next 1st level block.
I think addr needs to be rounded up to the next first boundary.
> + continue;
> + }
> +
> rc = p2m_create_table(d, &first[first_table_offset(addr)]);
> - if ( rc < 0 ) {
> + if ( rc < 0 )
> + {
> printk("p2m_populate_ram: L1 failed\n");
> goto out;
> }
> @@ -284,6 +293,12 @@ static int create_p2m_entries(struct domain *d,
>
> if ( !second[second_table_offset(addr)].p2m.valid )
> {
> + if ( !populate )
> + {
> + addr += SECOND_SIZE;
Likewise here.
> + continue;
> + }
> +
> rc = p2m_create_table(d, &second[second_table_offset(addr)]);
> if ( rc < 0 ) {
> printk("p2m_populate_ram: L2 failed\n");
> @@ -372,6 +387,9 @@ static int create_p2m_entries(struct domain *d,
> }
> count = 0;
> }
> +
> + /* Got the next page */
> + addr += PAGE_SIZE;
> }
>
> if ( op == ALLOCATE || op == INSERT )
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |