Message ID | 1398172475-27873-5-git-send-email-julien.grall@linaro.org |
---|---|
State | Accepted, archived |
Headers | show |
On Tue, 2014-04-22 at 14:14 +0100, Julien Grall wrote: > apply_p2m_changes needs to switch to another VTTBR temporarily to avoid > flush every TLBs. > > As it's only needed there, we can restrict the scope where the VTTBR of this > domain is loaded. > > Signed-off-by: Julien Grall <julien.grall@linaro.org> Acked-by: Ian Campbell <ian.campbell@citrix.com> Athough a flush_tlb_domain(d) type thing might be a nice addition. > > --- > Changes in v4: > - Patch added > --- > xen/arch/arm/p2m.c | 19 +++++++++---------- > 1 file changed, 9 insertions(+), 10 deletions(-) > > diff --git a/xen/arch/arm/p2m.c b/xen/arch/arm/p2m.c > index 0730da4..603c097 100644 > --- a/xen/arch/arm/p2m.c > +++ b/xen/arch/arm/p2m.c > @@ -296,9 +296,6 @@ static int apply_p2m_changes(struct domain *d, > > spin_lock(&p2m->lock); > > - if ( d != current->domain ) > - p2m_load_VTTBR(d); > - > addr = start_gpaddr; > while ( addr < end_gpaddr ) > { > @@ -454,12 +451,17 @@ static int apply_p2m_changes(struct domain *d, > > if ( flush ) > { > - /* At the beginning of the function, Xen is updating VTTBR > - * with the domain where the mappings are created. In this > - * case it's only necessary to flush TLBs on every CPUs with > - * the current VMID (our domain). > + /* Update the VTTBR if necessary with the domain where mappings > + * are created. In this case it's only necessary to flush TLBs > + * on every CPUs with the current VMID (our domain). > */ > + if ( d != current->domain ) > + p2m_load_VTTBR(d); > + > flush_tlb(); > + > + if ( d != current->domain ) > + p2m_load_VTTBR(current->domain); > } > > if ( op == ALLOCATE || op == INSERT ) > @@ -478,9 +480,6 @@ out: > if (second) unmap_domain_page(second); > if (first) unmap_domain_page(first); > > - if ( d != current->domain ) > - p2m_load_VTTBR(current->domain); > - > spin_unlock(&p2m->lock); > > return rc;
On 04/28/2014 02:54 PM, Ian Campbell wrote: > On Tue, 2014-04-22 at 14:14 +0100, Julien Grall wrote: >> apply_p2m_changes needs to switch to another VTTBR temporarily to avoid >> flush every TLBs. >> >> As it's only needed there, we can restrict the scope where the VTTBR of this >> domain is loaded. >> >> Signed-off-by: Julien Grall <julien.grall@linaro.org> > > Acked-by: Ian Campbell <ian.campbell@citrix.com> > > Athough a flush_tlb_domain(d) type thing might be a nice addition. I will add a flush_tlb_domain in the next version of this patch series. Regards,
diff --git a/xen/arch/arm/p2m.c b/xen/arch/arm/p2m.c index 0730da4..603c097 100644 --- a/xen/arch/arm/p2m.c +++ b/xen/arch/arm/p2m.c @@ -296,9 +296,6 @@ static int apply_p2m_changes(struct domain *d, spin_lock(&p2m->lock); - if ( d != current->domain ) - p2m_load_VTTBR(d); - addr = start_gpaddr; while ( addr < end_gpaddr ) { @@ -454,12 +451,17 @@ static int apply_p2m_changes(struct domain *d, if ( flush ) { - /* At the beginning of the function, Xen is updating VTTBR - * with the domain where the mappings are created. In this - * case it's only necessary to flush TLBs on every CPUs with - * the current VMID (our domain). + /* Update the VTTBR if necessary with the domain where mappings + * are created. In this case it's only necessary to flush TLBs + * on every CPUs with the current VMID (our domain). */ + if ( d != current->domain ) + p2m_load_VTTBR(d); + flush_tlb(); + + if ( d != current->domain ) + p2m_load_VTTBR(current->domain); } if ( op == ALLOCATE || op == INSERT ) @@ -478,9 +480,6 @@ out: if (second) unmap_domain_page(second); if (first) unmap_domain_page(first); - if ( d != current->domain ) - p2m_load_VTTBR(current->domain); - spin_unlock(&p2m->lock); return rc;
apply_p2m_changes needs to switch to another VTTBR temporarily to avoid flush every TLBs. As it's only needed there, we can restrict the scope where the VTTBR of this domain is loaded. Signed-off-by: Julien Grall <julien.grall@linaro.org> --- Changes in v4: - Patch added --- xen/arch/arm/p2m.c | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-)