KVM: arm64: Revert accidental drop of kvm_uninit_stage2_mmu() for non-NV VMs
PATCH 1/1 KVM: arm64: Revert accidental drop of kvm_uninit_stage2_mmu() for non-NV VMs
Commit 0c4762e26879 ("KVM: arm64: nv: Avoid NV stage-2 code when NV is not supported") added an early return to several functions in arch/arm64/kvm/nested.c to prevent a UBSAN shift-out-of-bounds error when accessing the pgt union for non-nested VMs.
However, this early return was inadvertently applied to kvm_arch_flush_shadow_all() as well, causing it to skip the call to kvm_uninit_stage2_mmu(kvm) for all non-nested VMs.
For pKVM, skipping this teardown means the host never unshares the guest's memory with the EL2 hypervisor. When the host kernel later recycles these leaked pages for a new VM, it attempts to re-share them. The hypervisor correctly rejects this with -EPERM, triggering a host WARN_ON and hanging the guest.
Fix this by dropping the early return from kvm_arch_flush_shadow_all(). The for-loop guarding the nested MMU cleanup already bounds itself when nested_mmus_size == 0, allowing execution to proceed to kvm_uninit_stage2_mmu() as intended.
--- arch/arm64/kvm/nested.c | 3 --- 1 file changed, 3 deletions(-)
arch/arm64/kvm/nested.c +0 -3
@@ -1154,9 +1154,6 @@ void kvm_arch_flush_shadow_all(struct kvm *kvm) {int i; -if (!kvm->arch.nested_mmus_size) -return ; -for (i =0 ; i < kvm->arch.nested_mmus_size; i++) {struct kvm_s2_mmu *mmu = &kvm->arch.nested_mmus[i];
base-commit: 8bf22c33e7a172fbc72464f4cc484d23a6b412ba
Signature · 1 line
2.53.0.414.gf7e9f6c205-goog
Quoted 4 lines · Fuad Tabba
Commit
0c4762e26879("KVM: arm64: nv: Avoid NV stage-2 code when NV is not supported") added an early return to several functions inarch/arm64/kvm/nested.cto prevent a UBSAN shift-out-of-bounds error when accessing the pgt union for non-nested VMs.
Thanks Fuad, that seems to have been it:
The patch also seems to address some spurious OOMs that I was able to reproduce with qemu when running the kselftests on pKVM:
Quoted 10 lines · Fuad Tabba
Commit
0c4762e26879("KVM: arm64: nv: Avoid NV stage-2 code when NV is not supported") added an early return to several functions inarch/arm64/kvm/nested.cto prevent a UBSAN shift-out-of-bounds error when accessing the pgt union for non-nested VMs.However, this early return was inadvertently applied to
kvm_arch_flush_shadow_all()as well, causing it to skip the call tokvm_uninit_stage2_mmu(kvm)for all non-nested VMs.[...]
Applied to fixes, thanks!
[1/1] KVM: arm64: Revert accidental drop of kvm_uninit_stage2_mmu() for non-NV VMs
commit: ec197dca8735f7627e5cff7e3fa8839b53a28514
Cheers,
M.
Signature · 1 line
Without deviation from the norm, progress is not possible.