[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH v2] xen/arm: p2m: Don't create new table when the mapping is removed
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> Acked-by: Stefano Stabellini <stefano.stabellini@xxxxxxxxxxxxx> --- 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. Changes in v2: - Handle case where address is not {FIRST,SECOND}_SIZE aligned. We can't use ROUND macro because if the address is aligned, it doesn't add the size. So it will end up in an infinite loop. --- 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..11f4714 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 = (addr + FIRST_SIZE) & FIRST_MASK; + 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 = (addr + SECOND_SIZE) & SECOND_MASK; + 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 ) -- 1.7.10.4 _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |