Commit 20ecf595 authored by Zide Chen's avatar Zide Chen Committed by Sean Christopherson

KVM: selftests: Allow skipping the KVM_RUN sanity check in rseq_test

The rseq test's migration worker delays 1-10 us, assuming that one KVM_RUN
iteration only takes a few microseconds.  But if the CPU low power wakeup
latency is large enough, for example, hundreds or even thousands of
microseconds for deep C-state exit latencies on x86 server CPUs, it may
happen that the target CPU is unable to wakeup and run the vCPU before the
migration worker starts to migrate the vCPU thread to the _next_ CPU.

If the system workload is light, most CPUs could be at a certain low
power state, which may result in less successful migrations and fail the
migration/KVM_RUN ratio sanity check.  But this is not supposed to be
deemed a test failure.

Add a command line option to skip the sanity check, along with a comment
and a verbose assert message to try to help the user resolve the potential
source of failures without having to resort to disabling the check.
Co-developed-by: default avatarDongsheng Zhang <dongsheng.x.zhang@intel.com>
Signed-off-by: default avatarDongsheng Zhang <dongsheng.x.zhang@intel.com>
Signed-off-by: default avatarZide Chen <zide.chen@intel.com>
Link: https://lore.kernel.org/r/20240502213936.27619-1-zide.chen@intel.com
[sean: massage changelog]
Signed-off-by: default avatarSean Christopherson <seanjc@google.com>
parent 05401936
......@@ -186,12 +186,35 @@ static void calc_min_max_cpu(void)
"Only one usable CPU, task migration not possible");
}
static void help(const char *name)
{
puts("");
printf("usage: %s [-h] [-u]\n", name);
printf(" -u: Don't sanity check the number of successful KVM_RUNs\n");
puts("");
exit(0);
}
int main(int argc, char *argv[])
{
bool skip_sanity_check = false;
int r, i, snapshot;
struct kvm_vm *vm;
struct kvm_vcpu *vcpu;
u32 cpu, rseq_cpu;
int opt;
while ((opt = getopt(argc, argv, "hu")) != -1) {
switch (opt) {
case 'u':
skip_sanity_check = true;
break;
case 'h':
default:
help(argv[0]);
break;
}
}
r = sched_getaffinity(0, sizeof(possible_mask), &possible_mask);
TEST_ASSERT(!r, "sched_getaffinity failed, errno = %d (%s)", errno,
......@@ -254,9 +277,17 @@ int main(int argc, char *argv[])
* getcpu() to stabilize. A 2:1 migration:KVM_RUN ratio is a fairly
* conservative ratio on x86-64, which can do _more_ KVM_RUNs than
* migrations given the 1us+ delay in the migration task.
*
* Another reason why it may have small migration:KVM_RUN ratio is that,
* on systems with large low power mode wakeup latency, it may happen
* quite often that the scheduler is not able to wake up the target CPU
* before the vCPU thread is scheduled to another CPU.
*/
TEST_ASSERT(i > (NR_TASK_MIGRATIONS / 2),
"Only performed %d KVM_RUNs, task stalled too much?", i);
TEST_ASSERT(skip_sanity_check || i > (NR_TASK_MIGRATIONS / 2),
"Only performed %d KVM_RUNs, task stalled too much?\n\n"
" Try disabling deep sleep states to reduce CPU wakeup latency,\n"
" e.g. via cpuidle.off=1 or setting /dev/cpu_dma_latency to '0',\n"
" or run with -u to disable this sanity check.", i);
pthread_join(migration_thread, NULL);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment