]> www.infradead.org Git - users/hch/misc.git/commitdiff
KVM: arm64: Don't switch MMU on translation from non-NV context
authorMarc Zyngier <maz@kernel.org>
Mon, 25 Aug 2025 10:24:11 +0000 (11:24 +0100)
committerMarc Zyngier <maz@kernel.org>
Sat, 20 Sep 2025 10:05:13 +0000 (11:05 +0100)
If calling into the AT code from guest EL1, there is no need
to consider any context switch, as we are guaranteed to be
in the correct context.

Reviewed-by: Oliver Upton <oliver.upton@linux.dev>
Signed-off-by: Marc Zyngier <maz@kernel.org>
arch/arm64/kvm/at.c

index 4efa2167116fe9143a4cb2b48cd6ef347577a1ed..c06a8e831f331f57f4f5fe9b230038f720a477db 100644 (file)
@@ -1285,7 +1285,7 @@ static u64 __kvm_at_s1e01_fast(struct kvm_vcpu *vcpu, u32 op, u64 vaddr)
 {
        struct mmu_config config;
        struct kvm_s2_mmu *mmu;
-       bool fail;
+       bool fail, mmu_cs;
        u64 par;
 
        par = SYS_PAR_EL1_F;
@@ -1301,8 +1301,13 @@ static u64 __kvm_at_s1e01_fast(struct kvm_vcpu *vcpu, u32 op, u64 vaddr)
         * If HCR_EL2.{E2H,TGE} == {1,1}, the MMU context is already
         * the right one (as we trapped from vEL2). If not, save the
         * full MMU context.
+        *
+        * We are also guaranteed to be in the correct context if
+        * we're not in a nested VM.
         */
-       if (vcpu_el2_e2h_is_set(vcpu) && vcpu_el2_tge_is_set(vcpu))
+       mmu_cs = (vcpu_has_nv(vcpu) &&
+                 !(vcpu_el2_e2h_is_set(vcpu) && vcpu_el2_tge_is_set(vcpu)));
+       if (!mmu_cs)
                goto skip_mmu_switch;
 
        /*
@@ -1370,7 +1375,7 @@ skip_mmu_switch:
 
        write_sysreg_hcr(HCR_HOST_VHE_FLAGS);
 
-       if (!(vcpu_el2_e2h_is_set(vcpu) && vcpu_el2_tge_is_set(vcpu)))
+       if (mmu_cs)
                __mmu_config_restore(&config);
 
        return par;