diff options
| author | Marc Zyngier <maz@kernel.org> | 2025-08-25 11:24:11 +0100 |
|---|---|---|
| committer | Marc Zyngier <maz@kernel.org> | 2025-09-20 11:05:13 +0100 |
| commit | 61b0280a670bdbb3a209ae474625f387788af0a8 (patch) | |
| tree | 8822828e49c6018cdbb7d47767601af37b628f06 | |
| parent | cb1762904c5000220a0facf9bcab68ba687ec417 (diff) | |
KVM: arm64: Don't switch MMU on translation from non-NV context
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>
| -rw-r--r-- | arch/arm64/kvm/at.c | 11 |
1 files changed, 8 insertions, 3 deletions
diff --git a/arch/arm64/kvm/at.c b/arch/arm64/kvm/at.c index 4efa2167116f..c06a8e831f33 100644 --- a/arch/arm64/kvm/at.c +++ b/arch/arm64/kvm/at.c @@ -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; |
