During some testing yesterday I realized that this patch actually breaks the self test, causing an error which the later self test changes cover up. Running "./demand_paging_test -b 512M -u MINOR -s shmem -v 1" from kvm/next (b3c98052d469) with just this patch applies gives the following output > # ./demand_paging_test -b 512M -u MINOR -s shmem -v 1 > Testing guest mode: PA-bits:ANY, VA-bits:48, 4K pages > guest physical test memory: [0x7fcdfffe000, 0x7fcffffe000) > Finished creating vCPUs and starting uffd threads > Started all vCPUs > ==== Test Assertion Failure ==== > demand_paging_test.c:50: false > pid=13293 tid=13297 errno=4 - Interrupted system call > // Some stack trace stuff > Invalid guest sync status: exit_reason=UNKNOWN, ucall=0 The problem is the get_ucall() part of the following block in the self test's vcpu_worker() > ret = _vcpu_run(vcpu); > TEST_ASSERT(ret == 0, "vcpu_run failed: %d\n", ret); > if (get_ucall(vcpu, NULL) != UCALL_SYNC) { > TEST_ASSERT(false, > "Invalid guest sync status: exit_reason=%s\n", > exit_reason_str(run->exit_reason)); > } I took a look and, while get_ucall() does depend on the value of exit_reason, the error's root cause isn't clear to me yet. Moving the "exit_reason = kvm_exit_unknown" line to later in the function, right above the vcpu_run() call "fixes" the problem. I've done that for now and will bisect later to investigate: if anyone has any clues please let me know.