[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 |