Skip to content

Commit 5d816c1

Browse files
committed
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().
2 parents ebd38b2 + 6a3d704 commit 5d816c1

File tree

2 files changed

+12
-12
lines changed

2 files changed

+12
-12
lines changed

arch/x86/kvm/mmu/mmu.c

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3020,7 +3020,8 @@ static int mmu_set_spte(struct kvm_vcpu *vcpu, struct kvm_memory_slot *slot,
30203020
}
30213021

30223022
if (is_shadow_present_pte(*sptep)) {
3023-
if (prefetch)
3023+
if (prefetch && is_last_spte(*sptep, level) &&
3024+
pfn == spte_to_pfn(*sptep))
30243025
return RET_PF_SPURIOUS;
30253026

30263027
/*
@@ -3034,7 +3035,7 @@ static int mmu_set_spte(struct kvm_vcpu *vcpu, struct kvm_memory_slot *slot,
30343035
child = spte_to_child_sp(pte);
30353036
drop_parent_pte(vcpu->kvm, child, sptep);
30363037
flush = true;
3037-
} else if (pfn != spte_to_pfn(*sptep)) {
3038+
} else if (WARN_ON_ONCE(pfn != spte_to_pfn(*sptep))) {
30383039
drop_spte(vcpu->kvm, sptep);
30393040
flush = true;
30403041
} else

arch/x86/kvm/mmu/tdp_mmu.c

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -378,7 +378,7 @@ static void remove_external_spte(struct kvm *kvm, gfn_t gfn, u64 old_spte,
378378
/* Zapping leaf spte is allowed only when write lock is held. */
379379
lockdep_assert_held_write(&kvm->mmu_lock);
380380
/* Because write lock is held, operation should success. */
381-
ret = static_call(kvm_x86_remove_external_spte)(kvm, gfn, level, old_pfn);
381+
ret = kvm_x86_call(remove_external_spte)(kvm, gfn, level, old_pfn);
382382
KVM_BUG_ON(ret, kvm);
383383
}
384384

@@ -485,8 +485,8 @@ static void handle_removed_pt(struct kvm *kvm, tdp_ptep_t pt, bool shared)
485485
}
486486

487487
if (is_mirror_sp(sp) &&
488-
WARN_ON(static_call(kvm_x86_free_external_spt)(kvm, base_gfn, sp->role.level,
489-
sp->external_spt))) {
488+
WARN_ON(kvm_x86_call(free_external_spt)(kvm, base_gfn, sp->role.level,
489+
sp->external_spt))) {
490490
/*
491491
* Failed to free page table page in mirror page table and
492492
* 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
538538
* external page table, or leaf.
539539
*/
540540
if (is_leaf) {
541-
ret = static_call(kvm_x86_set_external_spte)(kvm, gfn, level, new_pfn);
541+
ret = kvm_x86_call(set_external_spte)(kvm, gfn, level, new_pfn);
542542
} else {
543543
void *external_spt = get_external_spt(gfn, new_spte, level);
544544

545545
KVM_BUG_ON(!external_spt, kvm);
546-
ret = static_call(kvm_x86_link_external_spt)(kvm, gfn, level, external_spt);
546+
ret = kvm_x86_call(link_external_spt)(kvm, gfn, level, external_spt);
547547
}
548548
if (ret)
549549
__kvm_tdp_mmu_write_spte(sptep, old_spte);
@@ -1153,13 +1153,12 @@ static int tdp_mmu_map_handle_target_level(struct kvm_vcpu *vcpu,
11531153
if (WARN_ON_ONCE(sp->role.level != fault->goal_level))
11541154
return RET_PF_RETRY;
11551155

1156-
if (fault->prefetch && is_shadow_present_pte(iter->old_spte))
1157-
return RET_PF_SPURIOUS;
1158-
11591156
if (is_shadow_present_pte(iter->old_spte) &&
1160-
is_access_allowed(fault, iter->old_spte) &&
1161-
is_last_spte(iter->old_spte, iter->level))
1157+
(fault->prefetch || is_access_allowed(fault, iter->old_spte)) &&
1158+
is_last_spte(iter->old_spte, iter->level)) {
1159+
WARN_ON_ONCE(fault->pfn != spte_to_pfn(iter->old_spte));
11621160
return RET_PF_SPURIOUS;
1161+
}
11631162

11641163
if (unlikely(!fault->slot))
11651164
new_spte = make_mmio_spte(vcpu, iter->gfn, ACC_ALL);

0 commit comments

Comments
 (0)