Commit 2020d3b7 authored by Sean Christopherson's avatar Sean Christopherson
Browse files

KVM: selftests: Tighten checks around prev iter's last dirty page in ring



Now that each iteration collects all dirty entries and ensures the guest
*completes* at least one write, tighten the exemptions for the last dirty
page of the previous iteration.  Specifically, the only legal value (other
than the current iteration) is N-1.

Unlike the last page for the current iteration, the in-progress write from
the previous iteration is guaranteed to have completed, otherwise the test
would have hung.

Reviewed-by: default avatarMaxim Levitsky <mlevitsk@redhat.com>
Link: https://lore.kernel.org/r/20250111003004.1235645-18-seanjc@google.com


Signed-off-by: default avatarSean Christopherson <seanjc@google.com>
parent 73eaa2aa
Loading
Loading
Loading
Loading
+15 −7
Original line number Diff line number Diff line
@@ -517,14 +517,22 @@ static void vm_dirty_log_verify(enum vm_guest_mode mode, unsigned long **bmap)

			if (host_log_mode == LOG_MODE_DIRTY_RING) {
				/*
				 * The last page in the ring from this iteration
				 * or the previous can be written with the value
				 * from the previous iteration (relative to the
				 * last page's iteration), as the value to be
				 * written may be cached in a CPU register.
				 */
				if ((page == dirty_ring_last_page ||
				     page == dirty_ring_prev_iteration_last_page) &&
				 * The last page in the ring from previous
				 * iteration can be written with the value
				 * from the previous iteration, as the value to
				 * be written may be cached in a CPU register.
				 */
				if (page == dirty_ring_prev_iteration_last_page &&
				    val == iteration - 1)
					continue;

				/*
				 * Any value from a previous iteration is legal
				 * for the last entry, as the write may not yet
				 * have retired, i.e. the page may hold whatever
				 * it had before this iteration started.
				 */
				if (page == dirty_ring_last_page &&
				    val < iteration)
					continue;
			} else if (!val && iteration == 1 && bmap0_dirty) {