Skip to content

Commit f3629c0

Browse files
committed
KVM: selftests: Honor "stop" request in dirty ring test
Now that the vCPU doesn't dirty every page on the first iteration for architectures that support the dirty ring, honor vcpu_stop in the dirty ring's vCPU worker, i.e. stop when the main thread says "stop". This will allow plumbing vcpu_stop into the guest so that the vCPU doesn't need to periodically exit to userspace just to see if it should stop. Add a comment explaining that marking all pages as dirty is problematic for the dirty ring, as it results in the guest getting stuck on "ring full". This could be addressed by adding a GUEST_SYNC() in that initial loop, but it's not clear how that would interact with s390's behavior. Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Sean Christopherson <[email protected]>
1 parent deb8b84 commit f3629c0

File tree

1 file changed

+10
-2
lines changed

1 file changed

+10
-2
lines changed

tools/testing/selftests/kvm/dirty_log_test.c

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -387,8 +387,7 @@ static void dirty_ring_after_vcpu_run(struct kvm_vcpu *vcpu)
387387

388388
/* A ucall-sync or ring-full event is allowed */
389389
if (get_ucall(vcpu, NULL) == UCALL_SYNC) {
390-
/* We should allow this to continue */
391-
;
390+
vcpu_handle_sync_stop();
392391
} else if (run->exit_reason == KVM_EXIT_DIRTY_RING_FULL) {
393392
/* Update the flag first before pause */
394393
WRITE_ONCE(dirty_ring_vcpu_ring_full, true);
@@ -697,6 +696,15 @@ static void run_test(enum vm_guest_mode mode, void *arg)
697696
#ifdef __s390x__
698697
/* Align to 1M (segment size) */
699698
guest_test_phys_mem = align_down(guest_test_phys_mem, 1 << 20);
699+
700+
/*
701+
* The workaround in guest_code() to write all pages prior to the first
702+
* iteration isn't compatible with the dirty ring, as the dirty ring
703+
* support relies on the vCPU to actually stop when vcpu_stop is set so
704+
* that the vCPU doesn't hang waiting for the dirty ring to be emptied.
705+
*/
706+
TEST_ASSERT(host_log_mode != LOG_MODE_DIRTY_RING,
707+
"Test needs to be updated to support s390 dirty ring");
700708
#endif
701709

702710
pr_info("guest physical test memory offset: 0x%lx\n", guest_test_phys_mem);

0 commit comments

Comments
 (0)