mirror of
https://github.com/torvalds/linux.git
synced 2026-05-25 23:52:08 +02:00
KVM x86 MMU changes for 6.16:
- Refine and harden handling of spurious faults. - Use kvm_x86_call() instead of open coding static_call(). -----BEGIN PGP SIGNATURE----- iQIzBAABCgAdFiEEKTobbabEP7vbhhN9OlYIJqCjN/0FAmgwmO0ACgkQOlYIJqCj N/050BAAhl1u8bFGhb4SYOjeZ7QBgqhbzm2kvODQ7nnq3lQdBh5F3PYcBqX05dNo ntT1w5g8LOoFQWQ0rHrCDxEraBecYI4GWtuvC567AtmvibTn6GKJ1drh3ekNKD0b 3Dr674PgOzTdXWmD74tVSa3VCQ2c0jvkkueF7aeAAlX20efkjqAiQauF2c0PFBrY eqPqICOoecDxlQ6O7wY5jxkxBBurk60a4TBByzp2fCvvkAOdt6cYt42SPjd3dnXu Hi3a2nIIYyTfF0jvXcbtvGzzOac1YbGP1wBGA3uiyCkMz7ABZfHoOD5O6+rzUYml 9j9Um4phbHgvvRRDfL6rv2rBFI6hs9c4NzAMv/gcgblJiNhbg1A4Hu3ykDNsHpUN nO1/GrCkHKXITU1za2Z6rf4X/QouBGVHphODB/TzLbyXV2xw1IU1TveWgvWT5yVF mZMWvpYJaGtOX/imMNxPwVcrX75HkSD1DU2r1CfV5CUfd87wIp6HkSBvqUneFScN v7S5OaWGce6/EOoI3bq2Dp+hJS3ZnNmXzknK5PHB+Nb/JuXVNIW/Meol85d+z7j9 A/I11shjNV6RwuFfpvj6yGQUtKU5mSkw4D4eUIA57K2HtxLVMuhxis45X2O8plDI pMU4KLXmq6nNU0MLTxNWMExXIQ1MWR35Ak/Q3JYdUVLXe6UIM9M= =ayRv -----END PGP SIGNATURE----- Merge tag 'kvm-x86-mmu-6.16' of https://github.com/kvm-x86/linux into HEAD KVM x86 MMU changes for 6.16: - Refine and harden handling of spurious faults. - Use kvm_x86_call() instead of open coding static_call().
This commit is contained in:
commit
5d816c1399
|
|
@ -3020,7 +3020,8 @@ static int mmu_set_spte(struct kvm_vcpu *vcpu, struct kvm_memory_slot *slot,
|
|||
}
|
||||
|
||||
if (is_shadow_present_pte(*sptep)) {
|
||||
if (prefetch)
|
||||
if (prefetch && is_last_spte(*sptep, level) &&
|
||||
pfn == spte_to_pfn(*sptep))
|
||||
return RET_PF_SPURIOUS;
|
||||
|
||||
/*
|
||||
|
|
@ -3034,7 +3035,7 @@ static int mmu_set_spte(struct kvm_vcpu *vcpu, struct kvm_memory_slot *slot,
|
|||
child = spte_to_child_sp(pte);
|
||||
drop_parent_pte(vcpu->kvm, child, sptep);
|
||||
flush = true;
|
||||
} else if (pfn != spte_to_pfn(*sptep)) {
|
||||
} else if (WARN_ON_ONCE(pfn != spte_to_pfn(*sptep))) {
|
||||
drop_spte(vcpu->kvm, sptep);
|
||||
flush = true;
|
||||
} else
|
||||
|
|
|
|||
|
|
@ -378,7 +378,7 @@ static void remove_external_spte(struct kvm *kvm, gfn_t gfn, u64 old_spte,
|
|||
/* Zapping leaf spte is allowed only when write lock is held. */
|
||||
lockdep_assert_held_write(&kvm->mmu_lock);
|
||||
/* Because write lock is held, operation should success. */
|
||||
ret = static_call(kvm_x86_remove_external_spte)(kvm, gfn, level, old_pfn);
|
||||
ret = kvm_x86_call(remove_external_spte)(kvm, gfn, level, old_pfn);
|
||||
KVM_BUG_ON(ret, kvm);
|
||||
}
|
||||
|
||||
|
|
@ -485,8 +485,8 @@ static void handle_removed_pt(struct kvm *kvm, tdp_ptep_t pt, bool shared)
|
|||
}
|
||||
|
||||
if (is_mirror_sp(sp) &&
|
||||
WARN_ON(static_call(kvm_x86_free_external_spt)(kvm, base_gfn, sp->role.level,
|
||||
sp->external_spt))) {
|
||||
WARN_ON(kvm_x86_call(free_external_spt)(kvm, base_gfn, sp->role.level,
|
||||
sp->external_spt))) {
|
||||
/*
|
||||
* Failed to free page table page in mirror page table and
|
||||
* there is nothing to do further.
|
||||
|
|
@ -538,12 +538,12 @@ static int __must_check set_external_spte_present(struct kvm *kvm, tdp_ptep_t sp
|
|||
* external page table, or leaf.
|
||||
*/
|
||||
if (is_leaf) {
|
||||
ret = static_call(kvm_x86_set_external_spte)(kvm, gfn, level, new_pfn);
|
||||
ret = kvm_x86_call(set_external_spte)(kvm, gfn, level, new_pfn);
|
||||
} else {
|
||||
void *external_spt = get_external_spt(gfn, new_spte, level);
|
||||
|
||||
KVM_BUG_ON(!external_spt, kvm);
|
||||
ret = static_call(kvm_x86_link_external_spt)(kvm, gfn, level, external_spt);
|
||||
ret = kvm_x86_call(link_external_spt)(kvm, gfn, level, external_spt);
|
||||
}
|
||||
if (ret)
|
||||
__kvm_tdp_mmu_write_spte(sptep, old_spte);
|
||||
|
|
@ -1153,13 +1153,12 @@ static int tdp_mmu_map_handle_target_level(struct kvm_vcpu *vcpu,
|
|||
if (WARN_ON_ONCE(sp->role.level != fault->goal_level))
|
||||
return RET_PF_RETRY;
|
||||
|
||||
if (fault->prefetch && is_shadow_present_pte(iter->old_spte))
|
||||
return RET_PF_SPURIOUS;
|
||||
|
||||
if (is_shadow_present_pte(iter->old_spte) &&
|
||||
is_access_allowed(fault, iter->old_spte) &&
|
||||
is_last_spte(iter->old_spte, iter->level))
|
||||
(fault->prefetch || is_access_allowed(fault, iter->old_spte)) &&
|
||||
is_last_spte(iter->old_spte, iter->level)) {
|
||||
WARN_ON_ONCE(fault->pfn != spte_to_pfn(iter->old_spte));
|
||||
return RET_PF_SPURIOUS;
|
||||
}
|
||||
|
||||
if (unlikely(!fault->slot))
|
||||
new_spte = make_mmio_spte(vcpu, iter->gfn, ACC_ALL);
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user