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