]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
KVM: selftests: Tighten checks around prev iter's last dirty page in ring
authorSean Christopherson <seanjc@google.com>
Sat, 11 Jan 2025 00:30:01 +0000 (16:30 -0800)
committerSean Christopherson <seanjc@google.com>
Wed, 12 Feb 2025 17:00:56 +0000 (09:00 -0800)
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: Maxim Levitsky <mlevitsk@redhat.com>
Link: https://lore.kernel.org/r/20250111003004.1235645-18-seanjc@google.com
Signed-off-by: Sean Christopherson <seanjc@google.com>
tools/testing/selftests/kvm/dirty_log_test.c

index c6b843ec8e0c702b872c258b76fb28bac6214005..e9854b5a28f15423b7af60173c0fd1d51ad26832 100644 (file)
@@ -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.
+                                * 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_last_page ||
-                                    page == dirty_ring_prev_iteration_last_page) &&
+                               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) {