On Mon, 13 Jul 2020 10:47:49 +0100, Andrew Scull <ascull@xxxxxxxxxx> wrote: > > On Mon, Jun 15, 2020 at 02:27:03PM +0100, Marc Zyngier wrote: > > -static void __hyp_text __tlb_switch_to_guest_nvhe(struct kvm *kvm, > > +static void __hyp_text __tlb_switch_to_guest_nvhe(struct kvm_s2_mmu *mmu, > > struct tlb_inv_context *cxt) > > { > > if (cpus_have_final_cap(ARM64_WORKAROUND_SPECULATIVE_AT)) { > > @@ -79,22 +79,19 @@ static void __hyp_text __tlb_switch_to_guest_nvhe(struct kvm *kvm, > > isb(); > > } > > > > - /* __load_guest_stage2() includes an ISB for the workaround. */ > > - __load_guest_stage2(kvm); > > - asm(ALTERNATIVE("isb", "nop", ARM64_WORKAROUND_SPECULATIVE_AT)); > > + __load_guest_stage2(mmu); > > } > > Just noticed that this drops the ISB when the speculative AT workaround > is not active. > > This alternative is 'backwards' to avoid a double ISB as there is one in > __load_guest_stage2 when the workaround is active. I hope to address > this smell in an upcoming series but, for now, we should at least have > an ISB. Indeed. I must have messed up a conflict resolution here. I'll stick this fix on top. Thanks, M. >From 997c17ffe879dcad40b49a0c844c39f5d071dee9 Mon Sep 17 00:00:00 2001 From: Marc Zyngier <maz@xxxxxxxxxx> Date: Mon, 13 Jul 2020 15:15:14 +0100 Subject: [PATCH] KVM: arm64: Restore missing ISB on nVHE __tlb_switch_to_guest Commit a0e50aa3f4a8 ("KVM: arm64: Factor out stage 2 page table data from struct kvm") dropped the ISB after __load_guest_stage2(), only leaving the one that is required when the speculative AT workaround is in effect. As Andrew points it: "This alternative is 'backwards' to avoid a double ISB as there is one in __load_guest_stage2 when the workaround is active." Restore the missing ISB, conditionned on the AT workaround not being active. Fixes: a0e50aa3f4a8 ("KVM: arm64: Factor out stage 2 page table data from struct kvm") Reported-by: Andrew Scull <ascull@xxxxxxxxxx> Signed-off-by: Marc Zyngier <maz@xxxxxxxxxx> --- arch/arm64/kvm/hyp/nvhe/tlb.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/arch/arm64/kvm/hyp/nvhe/tlb.c b/arch/arm64/kvm/hyp/nvhe/tlb.c index 69eae608d670..f31185272b50 100644 --- a/arch/arm64/kvm/hyp/nvhe/tlb.c +++ b/arch/arm64/kvm/hyp/nvhe/tlb.c @@ -31,7 +31,9 @@ static void __tlb_switch_to_guest(struct kvm_s2_mmu *mmu, isb(); } + /* __load_guest_stage2() includes an ISB for the workaround. */ __load_guest_stage2(mmu); + asm(ALTERNATIVE("isb", "nop", ARM64_WORKAROUND_SPECULATIVE_AT)); } static void __tlb_switch_to_host(struct tlb_inv_context *cxt) -- 2.27.0 -- Without deviation from the norm, progress is not possible.