Commit 23d639e9 authored by Sean Christopherson's avatar Sean Christopherson Committed by Yu Zhang
Browse files

KVM: x86: Further clarify the logic and comments for toggling log dirty

mainline inclusion
from mainline-v5.12-rc1
commit 52f46079
category: feature
bugzilla: https://gitee.com/openeuler/intel-kernel/issues/I7S3VQ
CVE: NA

Reference: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=52f4607940b18337f01d160aaae346eaac388bf7



----------------------------------------------------------------------

Add a sanity check in kvm_mmu_slot_apply_flags to assert that the
LOG_DIRTY_PAGES flag is indeed being toggled, and explicitly rely on
that holding true when zapping collapsible SPTEs.  Manipulating the
CPU dirty log (PML) and write-protection also relies on this assertion,
but that's not obvious in the current code.

Signed-off-by: default avatarSean Christopherson <seanjc@google.com>
Message-Id: <20210213005015.1651772-11-seanjc@google.com>
Signed-off-by: default avatarPaolo Bonzini <pbonzini@redhat.com>
Signed-off-by: default avatarYu Zhang <yu.c.zhang@linux.intel.com>
parent b1ad18d1
Loading
Loading
Loading
Loading
+11 −4
Original line number Diff line number Diff line
@@ -11106,12 +11106,20 @@ static void kvm_mmu_slot_apply_flags(struct kvm *kvm,
				     enum kvm_mr_change change)
{
	/*
	 * Nothing to do for RO slots or CREATE/MOVE/DELETE of a slot.
	 * See comments below.
	 * Nothing to do for RO slots (which can't be dirtied and can't be made
	 * writable) or CREATE/MOVE/DELETE of a slot.  See comments below.
	 */
	if ((change != KVM_MR_FLAGS_ONLY) || (new->flags & KVM_MEM_READONLY))
		return;

	/*
	 * READONLY and non-flags changes were filtered out above, and the only
	 * other flag is LOG_DIRTY_PAGES, i.e. something is wrong if dirty
	 * logging isn't being toggled on or off.
	 */
	if (WARN_ON_ONCE(!((old->flags ^ new->flags) & KVM_MEM_LOG_DIRTY_PAGES)))
		return;

	/*
	 * Dirty logging tracks sptes in 4k granularity, meaning that large
	 * sptes have to be split.  If live migration is successful, the guest
@@ -11129,8 +11137,7 @@ static void kvm_mmu_slot_apply_flags(struct kvm *kvm,
	 * MOVE/DELETE: The old mappings will already have been cleaned up by
	 *		kvm_arch_flush_shadow_memslot()
	 */
	if ((old->flags & KVM_MEM_LOG_DIRTY_PAGES) &&
	    !(new->flags & KVM_MEM_LOG_DIRTY_PAGES))
	if (!(new->flags & KVM_MEM_LOG_DIRTY_PAGES))
		kvm_mmu_zap_collapsible_sptes(kvm, new);

	/*