[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH 18/22] xen/arm: p2m: Rework the context switch to another VTTBR in flush_tlb_domain
On Wed, 20 Jul 2016, Julien Grall wrote: > The current implementation of flush_tlb_domain is relying on the domain > to have a single p2m. With the upcoming feature altp2m, a single domain > may have different p2m. So we would need to switch to the correct p2m in > order to flush the TLBs. > > Rather than checking whether the domain is not the current domain, check > whether the VTTBR is different. The resulting assembly code is much > smaller: from 38 instructions (+ 2 functions call) to 22 instructions. That's true but SYSREG reads are more expensive than regular instructions. > Signed-off-by: Julien Grall <julien.grall@xxxxxxx> > --- > xen/arch/arm/p2m.c | 18 +++++++++++------- > 1 file changed, 11 insertions(+), 7 deletions(-) > > diff --git a/xen/arch/arm/p2m.c b/xen/arch/arm/p2m.c > index d1b6009..015c1e8 100644 > --- a/xen/arch/arm/p2m.c > +++ b/xen/arch/arm/p2m.c > @@ -151,24 +151,28 @@ void p2m_restore_state(struct vcpu *n) > > void flush_tlb_domain(struct domain *d) > { > + struct p2m_domain *p2m = &d->arch.p2m; > unsigned long flags = 0; > + uint64_t ovttbr; > > /* > - * Update the VTTBR if necessary with the domain d. In this case, > - * it's only necessary to flush TLBs on every CPUs with the current VMID > - * (our domain). > + * ARM only provides an instruction to flush TLBs for the current > + * VMID. So switch to the VTTBR of a given P2M if different. > */ > - if ( d != current->domain ) > + ovttbr = READ_SYSREG64(VTTBR_EL2); > + if ( ovttbr != p2m->vttbr ) > { > local_irq_save(flags); > - p2m_load_VTTBR(d); > + WRITE_SYSREG64(p2m->vttbr, VTTBR_EL2); > + isb(); > } > > flush_tlb(); > > - if ( d != current->domain ) > + if ( ovttbr != READ_SYSREG64(VTTBR_EL2) ) You should be able to remove this second SYSREG read and optimize the code further. > { > - p2m_load_VTTBR(current->domain); > + WRITE_SYSREG64(ovttbr, VTTBR_EL2); > + isb(); > local_irq_restore(flags); > } > } > -- > 1.9.1 > _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx https://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |