mirror of https://gitee.com/openkylin/linux.git
KVM: x86/mmu: Move root_hpa validity checks to top of page fault handler
Add a check on root_hpa at the beginning of the page fault handler to consolidate several checks on root_hpa that are scattered throughout the page fault code. This is a preparatory step towards eventually removing such checks altogether, or at the very least WARNing if an invalid root is encountered. Remove only the checks that can be easily audited to confirm that root_hpa cannot be invalidated between their current location and the new check in kvm_mmu_page_fault(), and aren't currently protected by mmu_lock, i.e. keep the checks in __direct_map() and FNAME(fetch) for the time being. The root_hpa checks that are consolidate were all added by commit37f6a4e237
("KVM: x86: handle invalid root_hpa everywhere") which was a follow up to a bug fix for __direct_map(), commit989c6b34f6
("KVM: MMU: handle invalid root_hpa at __direct_map") At the time, nested VMX had, in hindsight, crazy handling of nested interrupts and would trigger a nested VM-Exit in ->interrupt_allowed(), and thus unexpectedly reset the MMU in flows such as can_do_async_pf(). Now that the wonky nested VM-Exit behavior is gone, the root_hpa checks are bogus and confusing, e.g. it's not at all obvious what they actually protect against, and at first glance they appear to be broken since many of them run without holding mmu_lock. Signed-off-by: Sean Christopherson <sean.j.christopherson@intel.com> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
parent
4cd071d13c
commit
ddce620821
|
@ -3565,9 +3565,6 @@ static bool fast_page_fault(struct kvm_vcpu *vcpu, gpa_t cr2_or_gpa, int level,
|
||||||
u64 spte = 0ull;
|
u64 spte = 0ull;
|
||||||
uint retry_count = 0;
|
uint retry_count = 0;
|
||||||
|
|
||||||
if (!VALID_PAGE(vcpu->arch.mmu->root_hpa))
|
|
||||||
return false;
|
|
||||||
|
|
||||||
if (!page_fault_can_be_fast(error_code))
|
if (!page_fault_can_be_fast(error_code))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
|
@ -4011,9 +4008,6 @@ walk_shadow_page_get_mmio_spte(struct kvm_vcpu *vcpu, u64 addr, u64 *sptep)
|
||||||
int root, leaf;
|
int root, leaf;
|
||||||
bool reserved = false;
|
bool reserved = false;
|
||||||
|
|
||||||
if (!VALID_PAGE(vcpu->arch.mmu->root_hpa))
|
|
||||||
goto exit;
|
|
||||||
|
|
||||||
walk_shadow_page_lockless_begin(vcpu);
|
walk_shadow_page_lockless_begin(vcpu);
|
||||||
|
|
||||||
for (shadow_walk_init(&iterator, vcpu, addr),
|
for (shadow_walk_init(&iterator, vcpu, addr),
|
||||||
|
@ -4043,7 +4037,7 @@ walk_shadow_page_get_mmio_spte(struct kvm_vcpu *vcpu, u64 addr, u64 *sptep)
|
||||||
root--;
|
root--;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
exit:
|
|
||||||
*sptep = spte;
|
*sptep = spte;
|
||||||
return reserved;
|
return reserved;
|
||||||
}
|
}
|
||||||
|
@ -4107,9 +4101,6 @@ static void shadow_page_table_clear_flood(struct kvm_vcpu *vcpu, gva_t addr)
|
||||||
struct kvm_shadow_walk_iterator iterator;
|
struct kvm_shadow_walk_iterator iterator;
|
||||||
u64 spte;
|
u64 spte;
|
||||||
|
|
||||||
if (!VALID_PAGE(vcpu->arch.mmu->root_hpa))
|
|
||||||
return;
|
|
||||||
|
|
||||||
walk_shadow_page_lockless_begin(vcpu);
|
walk_shadow_page_lockless_begin(vcpu);
|
||||||
for_each_shadow_entry_lockless(vcpu, addr, iterator, spte) {
|
for_each_shadow_entry_lockless(vcpu, addr, iterator, spte) {
|
||||||
clear_sp_write_flooding_count(iterator.sptep);
|
clear_sp_write_flooding_count(iterator.sptep);
|
||||||
|
@ -5472,6 +5463,9 @@ int kvm_mmu_page_fault(struct kvm_vcpu *vcpu, gpa_t cr2_or_gpa, u64 error_code,
|
||||||
int r, emulation_type = 0;
|
int r, emulation_type = 0;
|
||||||
bool direct = vcpu->arch.mmu->direct_map;
|
bool direct = vcpu->arch.mmu->direct_map;
|
||||||
|
|
||||||
|
if (!VALID_PAGE(vcpu->arch.mmu->root_hpa))
|
||||||
|
return RET_PF_RETRY;
|
||||||
|
|
||||||
/* With shadow page tables, fault_address contains a GVA or nGPA. */
|
/* With shadow page tables, fault_address contains a GVA or nGPA. */
|
||||||
if (vcpu->arch.mmu->direct_map) {
|
if (vcpu->arch.mmu->direct_map) {
|
||||||
vcpu->arch.gpa_available = true;
|
vcpu->arch.gpa_available = true;
|
||||||
|
|
Loading…
Reference in New Issue