mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-05-07 11:33:58 -04:00
KVM: x86/mmu: Invert @can_unsync and renamed to @synchronizing
Invert the polarity of "can_unsync" and rename the parameter to "synchronizing" to allow a future change to set the Accessed bit if KVM is synchronizing an existing SPTE. Querying "can_unsync" in that case is nonsensical, as the fact that KVM can't unsync SPTEs doesn't provide any justification for setting the Accessed bit. Signed-off-by: Sean Christopherson <seanjc@google.com> Tested-by: Dmitry Osipenko <dmitry.osipenko@collabora.com> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com> Message-ID: <20241010182427.1434605-7-seanjc@google.com>
This commit is contained in:
committed by
Paolo Bonzini
parent
6385d01eec
commit
63c5754472
@@ -2802,7 +2802,7 @@ static void kvm_unsync_page(struct kvm *kvm, struct kvm_mmu_page *sp)
|
||||
* be write-protected.
|
||||
*/
|
||||
int mmu_try_to_unsync_pages(struct kvm *kvm, const struct kvm_memory_slot *slot,
|
||||
gfn_t gfn, bool can_unsync, bool prefetch)
|
||||
gfn_t gfn, bool synchronizing, bool prefetch)
|
||||
{
|
||||
struct kvm_mmu_page *sp;
|
||||
bool locked = false;
|
||||
@@ -2817,12 +2817,12 @@ int mmu_try_to_unsync_pages(struct kvm *kvm, const struct kvm_memory_slot *slot,
|
||||
|
||||
/*
|
||||
* The page is not write-tracked, mark existing shadow pages unsync
|
||||
* unless KVM is synchronizing an unsync SP (can_unsync = false). In
|
||||
* that case, KVM must complete emulation of the guest TLB flush before
|
||||
* allowing shadow pages to become unsync (writable by the guest).
|
||||
* unless KVM is synchronizing an unsync SP. In that case, KVM must
|
||||
* complete emulation of the guest TLB flush before allowing shadow
|
||||
* pages to become unsync (writable by the guest).
|
||||
*/
|
||||
for_each_gfn_valid_sp_with_gptes(kvm, sp, gfn) {
|
||||
if (!can_unsync)
|
||||
if (synchronizing)
|
||||
return -EPERM;
|
||||
|
||||
if (sp->unsync)
|
||||
@@ -2948,7 +2948,7 @@ static int mmu_set_spte(struct kvm_vcpu *vcpu, struct kvm_memory_slot *slot,
|
||||
}
|
||||
|
||||
wrprot = make_spte(vcpu, sp, slot, pte_access, gfn, pfn, *sptep, prefetch,
|
||||
true, host_writable, &spte);
|
||||
false, host_writable, &spte);
|
||||
|
||||
if (*sptep == spte) {
|
||||
ret = RET_PF_SPURIOUS;
|
||||
|
||||
@@ -164,7 +164,7 @@ static inline gfn_t gfn_round_for_level(gfn_t gfn, int level)
|
||||
}
|
||||
|
||||
int mmu_try_to_unsync_pages(struct kvm *kvm, const struct kvm_memory_slot *slot,
|
||||
gfn_t gfn, bool can_unsync, bool prefetch);
|
||||
gfn_t gfn, bool synchronizing, bool prefetch);
|
||||
|
||||
void kvm_mmu_gfn_disallow_lpage(const struct kvm_memory_slot *slot, gfn_t gfn);
|
||||
void kvm_mmu_gfn_allow_lpage(const struct kvm_memory_slot *slot, gfn_t gfn);
|
||||
|
||||
@@ -963,7 +963,7 @@ static int FNAME(sync_spte)(struct kvm_vcpu *vcpu, struct kvm_mmu_page *sp, int
|
||||
host_writable = spte & shadow_host_writable_mask;
|
||||
slot = kvm_vcpu_gfn_to_memslot(vcpu, gfn);
|
||||
make_spte(vcpu, sp, slot, pte_access, gfn,
|
||||
spte_to_pfn(spte), spte, true, false,
|
||||
spte_to_pfn(spte), spte, true, true,
|
||||
host_writable, &spte);
|
||||
|
||||
return mmu_spte_update(sptep, spte);
|
||||
|
||||
@@ -157,7 +157,7 @@ bool spte_has_volatile_bits(u64 spte)
|
||||
bool make_spte(struct kvm_vcpu *vcpu, struct kvm_mmu_page *sp,
|
||||
const struct kvm_memory_slot *slot,
|
||||
unsigned int pte_access, gfn_t gfn, kvm_pfn_t pfn,
|
||||
u64 old_spte, bool prefetch, bool can_unsync,
|
||||
u64 old_spte, bool prefetch, bool synchronizing,
|
||||
bool host_writable, u64 *new_spte)
|
||||
{
|
||||
int level = sp->role.level;
|
||||
@@ -248,7 +248,7 @@ bool make_spte(struct kvm_vcpu *vcpu, struct kvm_mmu_page *sp,
|
||||
* e.g. it's write-tracked (upper-level SPs) or has one or more
|
||||
* shadow pages and unsync'ing pages is not allowed.
|
||||
*/
|
||||
if (mmu_try_to_unsync_pages(vcpu->kvm, slot, gfn, can_unsync, prefetch)) {
|
||||
if (mmu_try_to_unsync_pages(vcpu->kvm, slot, gfn, synchronizing, prefetch)) {
|
||||
wrprot = true;
|
||||
pte_access &= ~ACC_WRITE_MASK;
|
||||
spte &= ~(PT_WRITABLE_MASK | shadow_mmu_writable_mask);
|
||||
|
||||
@@ -499,7 +499,7 @@ bool spte_has_volatile_bits(u64 spte);
|
||||
bool make_spte(struct kvm_vcpu *vcpu, struct kvm_mmu_page *sp,
|
||||
const struct kvm_memory_slot *slot,
|
||||
unsigned int pte_access, gfn_t gfn, kvm_pfn_t pfn,
|
||||
u64 old_spte, bool prefetch, bool can_unsync,
|
||||
u64 old_spte, bool prefetch, bool synchronizing,
|
||||
bool host_writable, u64 *new_spte);
|
||||
u64 make_huge_page_split_spte(struct kvm *kvm, u64 huge_spte,
|
||||
union kvm_mmu_page_role role, int index);
|
||||
|
||||
@@ -1033,8 +1033,8 @@ static int tdp_mmu_map_handle_target_level(struct kvm_vcpu *vcpu,
|
||||
new_spte = make_mmio_spte(vcpu, iter->gfn, ACC_ALL);
|
||||
else
|
||||
wrprot = make_spte(vcpu, sp, fault->slot, ACC_ALL, iter->gfn,
|
||||
fault->pfn, iter->old_spte, fault->prefetch, true,
|
||||
fault->map_writable, &new_spte);
|
||||
fault->pfn, iter->old_spte, fault->prefetch,
|
||||
false, fault->map_writable, &new_spte);
|
||||
|
||||
if (new_spte == iter->old_spte)
|
||||
ret = RET_PF_SPURIOUS;
|
||||
|
||||
Reference in New Issue
Block a user