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.