KVM: X86: Don't check unsync if the original spte is writible
authorLai Jiangshan <laijs@linux.alibaba.com>
Sat, 18 Sep 2021 00:56:36 +0000 (08:56 +0800)
committerPaolo Bonzini <pbonzini@redhat.com>
Thu, 30 Sep 2021 08:27:10 +0000 (04:27 -0400)
If the original spte is writable, the target gfn should not be the
gfn of synchronized shadowpage and can continue to be writable.

When !can_unsync, speculative must be false.  So when the check of
"!can_unsync" is removed, we need to move the label of "out" up.

Signed-off-by: Lai Jiangshan <laijs@linux.alibaba.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
Message-Id: <20210918005636.3675-11-jiangshanlai@gmail.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
arch/x86/kvm/mmu/spte.c

index b68a580..a33c581 100644 (file)
@@ -150,7 +150,7 @@ int make_spte(struct kvm_vcpu *vcpu, unsigned int pte_access, int level,
                 * is responsibility of kvm_mmu_get_page / kvm_mmu_sync_roots.
                 * Same reasoning can be applied to dirty page accounting.
                 */
-               if (!can_unsync && is_writable_pte(old_spte))
+               if (is_writable_pte(old_spte))
                        goto out;
 
                /*
@@ -171,10 +171,10 @@ int make_spte(struct kvm_vcpu *vcpu, unsigned int pte_access, int level,
        if (pte_access & ACC_WRITE_MASK)
                spte |= spte_shadow_dirty_mask(spte);
 
+out:
        if (speculative)
                spte = mark_spte_for_access_track(spte);
 
-out:
        WARN_ONCE(is_rsvd_spte(&vcpu->arch.mmu->shadow_zero_check, spte, level),
                  "spte = 0x%llx, level = %d, rsvd bits = 0x%llx", spte, level,
                  get_rsvd_bits(&vcpu->arch.mmu->shadow_zero_check, spte, level));