[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH] xen/arm: p2m: flush TLB by VMID when a new domain is creating
On Thu, 14 Nov 2013, Julien Grall wrote: > Once the VMID is marked unused, a new domain can reuse the VMID for its > own. If the TLB is not flushed, entries can contain wrong translation. > When a new p2m is allocated, switch to the new VMID and flush TLB on > every physical CPUs. > > Signed-off-by: Julien Grall <julien.grall@xxxxxxxxxx> > --- > Changes in v2: > - This patch was formerly "xen/arm: p2m: flush TLB when a domain > is destroyed > - Flush TLB by VMID in p2m_alloc_table. It will avoid to flush > all TLBs every domain destruction. > > --- > xen/arch/arm/p2m.c | 10 ++++++++++ > xen/include/asm-arm/arm32/flushtlb.h | 11 +++++++++++ > xen/include/asm-arm/arm64/flushtlb.h | 11 +++++++++++ > 3 files changed, 32 insertions(+) > > diff --git a/xen/arch/arm/p2m.c b/xen/arch/arm/p2m.c > index 2d09fef..82dda65 100644 > --- a/xen/arch/arm/p2m.c > +++ b/xen/arch/arm/p2m.c > @@ -302,6 +302,15 @@ int p2m_alloc_table(struct domain *d) > d->arch.vttbr = page_to_maddr(p2m->first_level) > | ((uint64_t)p2m->vmid&0xff)<<48; > > + p2m_load_VTTBR(d); > + > + /* Make sure that all TLBs corresponding to the new VMID are flushed > + * before using it > + */ > + flush_tlb(); > + > + p2m_load_VTTBR(current->domain); > + > spin_unlock(&p2m->lock); > > return 0; > @@ -357,6 +366,7 @@ static void p2m_free_vmid(struct domain *d) > spin_lock(&vmid_alloc_lock); > if ( p2m->vmid != INVALID_VMID ) > clear_bit(p2m->vmid, vmid_mask); > + > spin_unlock(&vmid_alloc_lock); > } > > diff --git a/xen/include/asm-arm/arm32/flushtlb.h > b/xen/include/asm-arm/arm32/flushtlb.h > index a258f58..ab166f3 100644 > --- a/xen/include/asm-arm/arm32/flushtlb.h > +++ b/xen/include/asm-arm/arm32/flushtlb.h > @@ -12,6 +12,17 @@ static inline void flush_tlb_local(void) > isb(); > } > > +/* Flush inner shareable TLBs, current VMID only */ > +static inline void flush_tlb(void) > +{ > + dsb(); > + > + WRITE_CP32((uint32_t) 0, TLBIALLIS); > + > + dsb(); > + isb(); > +} Why only inner shareable? Shouldn't we use the existing flush_tlb_local instead? _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |