|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH for-4.12 5/8] xen/arm: p2m: Only use isb() when it is necessary
On Wed, 28 Nov 2018, Julien Grall wrote:
> The EL1 translation regime is out-of-context when running at EL2. This
> means the processor cannot speculate memory accesses using the registers
> associated to that regime.
>
> An isb() is only need if Xen is going to use the translation regime
^ needed
> before returning to the guest (exception returns will synchronized the
^ synchronize
> context).
>
> Remove unecessary isb() and document the ones left.
^ unnecessary
> Signed-off-by: Julien Grall <julien.grall@xxxxxxx>
> ---
> xen/arch/arm/p2m.c | 19 +++++++++++++------
> 1 file changed, 13 insertions(+), 6 deletions(-)
>
> diff --git a/xen/arch/arm/p2m.c b/xen/arch/arm/p2m.c
> index e8bacab9d2..844833c4c3 100644
> --- a/xen/arch/arm/p2m.c
> +++ b/xen/arch/arm/p2m.c
> @@ -112,22 +112,28 @@ void p2m_restore_state(struct vcpu *n)
> return;
>
> WRITE_SYSREG64(p2m->vttbr, VTTBR_EL2);
> - isb();
> -
> WRITE_SYSREG(n->arch.sctlr, SCTLR_EL1);
> - isb();
> -
> WRITE_SYSREG(n->arch.hcr_el2, HCR_EL2);
> - isb();
>
> last_vcpu_ran = &p2m->last_vcpu_ran[smp_processor_id()];
>
> /*
> + * While we are restoring an out-of-context translation regime
> + * we still need to ensure:
> + * - VTTBR_EL2 is synchronized before flushing the TLBs
> + * - All registers for EL1 are synchronized before executing an AT
> + * instructions targeting S1/S2.
> + */
> + isb();
This explanation makes sense to me
> + /*
> * Flush local TLB for the domain to prevent wrong TLB translation
> * when running multiple vCPU of the same domain on a single pCPU.
> */
> if ( *last_vcpu_ran != INVALID_VCPU_ID && *last_vcpu_ran != n->vcpu_id )
> + {
> flush_tlb_local();
> + }
Spurious change?
> *last_vcpu_ran = n->vcpu_id;
> }
> @@ -153,6 +159,7 @@ static void p2m_force_tlb_flush_sync(struct p2m_domain
> *p2m)
> {
> local_irq_save(flags);
> WRITE_SYSREG64(p2m->vttbr, VTTBR_EL2);
> + /* Ensure VTTBR_EL2 is synchronized before flushing the TLBs */
> isb();
> }
>
> @@ -161,6 +168,7 @@ static void p2m_force_tlb_flush_sync(struct p2m_domain
> *p2m)
> if ( ovttbr != READ_SYSREG64(VTTBR_EL2) )
> {
> WRITE_SYSREG64(ovttbr, VTTBR_EL2);
> + /* Ensure VTTBR_EL2 is back in place before continuing. */
> isb();
> local_irq_restore(flags);
> }
> @@ -1496,7 +1504,6 @@ static uint32_t __read_mostly vtcr;
> static void setup_virt_paging_one(void *data)
> {
> WRITE_SYSREG32(vtcr, VTCR_EL2);
> - isb();
> }
>
> void __init setup_virt_paging(void)
> --
> 2.11.0
>
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/mailman/listinfo/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |