Re: [PATCH v4 10/12] KVM: selftests: Trigger save+restore randomly in the #PF stress test

From: Sean Christopherson

Date: Tue Jul 28 2026 - 11:42:16 EST


On Mon, Jul 27, 2026, Yosry Ahmed wrote:
> int main(int argc, char *argv[])
> {
> struct kvm_x86_state *state;
> int r, i, level;
> + pthread_t sigusr_thread;
> gpa_t gpa, pgtable_gpa;
> struct kvm_vcpu *vcpu;
> struct kvm_vm *vm;
> @@ -128,18 +156,30 @@ int main(int argc, char *argv[])
> pgtable_gpa = PTE_GET_PA(pte);
> }
>
> + /* Initialize the thread sending SIGUSR and install the handler */
> + vcpu_sigusr_ignore();
> + r = pthread_create(&sigusr_thread, NULL, sigusr_thread_fn,
> + (void *)pthread_self());
> + TEST_ASSERT(!r, "pthread_create() failed: %d", r);
> +
> for (i = 1; i <= NR_ITERATIONS; i++) {
> + /*
> + * Only handle SIGUSR while the vCPU is running, otherwise
> + * ignore it to avoid interrupting other ioctls/syscalls.
> + */
> + vcpu_sigusr_listen();
> r = __vcpu_run(vcpu);
> - TEST_ASSERT(!r, "vcpu_run failed");
> - TEST_ASSERT_KVM_EXIT_REASON(vcpu, KVM_EXIT_IO);
> -
> - get_ucall(vcpu, &uc);
> - if (uc.cmd == UCALL_ABORT) {
> + if (r == -1)
> + TEST_ASSERT_EQ(errno, EINTR);

TEST_ASSERT(!r || errno == EINTR, "Expected success or SIGUSR1");

> + vcpu_sigusr_ignore();
> +
> + /* The guest only exits due to a signal or failed assertion */
> + if (!r) {
> + TEST_ASSERT_KVM_EXIT_REASON(vcpu, KVM_EXIT_IO);
> + TEST_ASSERT_EQ(get_ucall(vcpu, &uc), UCALL_ABORT);
> REPORT_GUEST_ASSERT(uc);
> break;
> }
> - TEST_ASSERT_EQ(uc.cmd, UCALL_SYNC);
> - TEST_ASSERT_EQ(uc.args[1], i);
>
> state = vcpu_save_state(vcpu);
>
> @@ -153,8 +193,11 @@ int main(int argc, char *argv[])
> pr_info("\n");
>
> sync_global_from_guest(vm, guest_faults);
> + TEST_ASSERT(guest_faults > 0, "No guest page faults triggered");

Since guest_faults is an unsigned value, the kernel's preferred style is:

TEST_ASSERT(guest_faults, "No guest page faults triggered");

> pr_info("Guest page faults: %lu\n", guest_faults);
>
> + pthread_cancel(sigusr_thread);
> + pthread_join(sigusr_thread, NULL);
> kvm_vm_free(vm);
> return 0;
> }
> --
> 2.55.0.229.g6434b31f56-goog
>