summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSean Christopherson <seanjc@google.com>2024-07-12 17:13:34 +0200
committerPaolo Bonzini <pbonzini@redhat.com>2024-07-16 15:56:56 +0200
commit3d4415ed75a57fc96ea203a9832e3c5ac5982719 (patch)
tree371593c723778bea9035eb7b79f472c8717fd659
parentMerge tag 'kvm-x86-vmx-6.11' of https://github.com/kvm-x86/linux into HEAD (diff)
downloadlinux-3d4415ed75a57fc96ea203a9832e3c5ac5982719.tar.xz
linux-3d4415ed75a57fc96ea203a9832e3c5ac5982719.zip
KVM: x86/mmu: Bug the VM if KVM tries to split a !hugepage SPTE
Bug the VM instead of simply warning if KVM tries to split a SPTE that is non-present or not-huge. KVM is guaranteed to end up in a broken state as the callers fully expect a valid SPTE, e.g. the shadow MMU will add an rmap entry, and all MMUs will account the expected small page. Returning '0' is also technically wrong now that SHADOW_NONPRESENT_VALUE exists, i.e. would cause KVM to create a potential #VE SPTE. While it would be possible to have the callers gracefully handle failure, doing so would provide no practical value as the scenario really should be impossible, while the error handling would add a non-trivial amount of noise. Fixes: a3fe5dbda0a4 ("KVM: x86/mmu: Split huge pages mapped by the TDP MMU when dirty logging is enabled") Cc: David Matlack <dmatlack@google.com> Signed-off-by: Sean Christopherson <seanjc@google.com> Message-ID: <20240712151335.1242633-2-seanjc@google.com> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
-rw-r--r--arch/x86/kvm/mmu/spte.c6
1 files changed, 1 insertions, 5 deletions
diff --git a/arch/x86/kvm/mmu/spte.c b/arch/x86/kvm/mmu/spte.c
index 8275b96b6596..b15ce06edb46 100644
--- a/arch/x86/kvm/mmu/spte.c
+++ b/arch/x86/kvm/mmu/spte.c
@@ -296,11 +296,7 @@ u64 make_huge_page_split_spte(struct kvm *kvm, u64 huge_spte, union kvm_mmu_page
{
u64 child_spte;
- if (WARN_ON_ONCE(!is_shadow_present_pte(huge_spte)))
- return 0;
-
- if (WARN_ON_ONCE(!is_large_pte(huge_spte)))
- return 0;
+ KVM_BUG_ON(!is_shadow_present_pte(huge_spte) || !is_large_pte(huge_spte), kvm);
child_spte = huge_spte;