]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
KVM: selftests: Relax assertion on HLT exits if CPU supports Idle HLT
authorSean Christopherson <seanjc@google.com>
Wed, 26 Feb 2025 23:18:09 +0000 (15:18 -0800)
committerSean Christopherson <seanjc@google.com>
Fri, 28 Feb 2025 23:42:28 +0000 (15:42 -0800)
If the CPU supports Idle HLT, which elides HLT VM-Exits if the vCPU has an
unmasked pending IRQ or NMI, relax the xAPIC IPI test's assertion on the
number of HLT exits to only require that the number of exits is less than
or equal to the number of HLT instructions that were executed.  I.e. don't
fail the test if Idle HLT does what it's supposed to do.

Note, unfortunately there's no way to determine if *KVM* supports Idle HLT,
as this_cpu_has() checks raw CPU support, and kvm_cpu_has() checks what can
be exposed to L1, i.e. the latter would check if KVM supports nested Idle
HLT.  But, since the assert is purely bonus coverage, checking for CPU
support is good enough.

Cc: Manali Shukla <Manali.Shukla@amd.com>
Tested-by: Manali Shukla <Manali.Shukla@amd.com>
Link: https://lore.kernel.org/r/20250226231809.3183093-1-seanjc@google.com
Signed-off-by: Sean Christopherson <seanjc@google.com>
tools/testing/selftests/kvm/include/x86/processor.h
tools/testing/selftests/kvm/x86/xapic_ipi_test.c

index 9d365144ac3ec628be1c932063921610a5412f53..a968a56dcb6e7bd11cfe94e9fd65f9fe3174a04f 100644 (file)
@@ -197,6 +197,7 @@ struct kvm_x86_cpu_feature {
 #define X86_FEATURE_PAUSEFILTER         KVM_X86_CPU_FEATURE(0x8000000A, 0, EDX, 10)
 #define X86_FEATURE_PFTHRESHOLD         KVM_X86_CPU_FEATURE(0x8000000A, 0, EDX, 12)
 #define        X86_FEATURE_VGIF                KVM_X86_CPU_FEATURE(0x8000000A, 0, EDX, 16)
+#define X86_FEATURE_IDLE_HLT           KVM_X86_CPU_FEATURE(0x8000000A, 0, EDX, 30)
 #define X86_FEATURE_SEV                        KVM_X86_CPU_FEATURE(0x8000001F, 0, EAX, 1)
 #define X86_FEATURE_SEV_ES             KVM_X86_CPU_FEATURE(0x8000001F, 0, EAX, 3)
 
index 574a944763b79bafd1e7f2499ab626f29975c68a..58d5c132ed8e9b23037080762b1b911a7956a8c2 100644 (file)
@@ -465,7 +465,18 @@ int main(int argc, char *argv[])
        cancel_join_vcpu_thread(threads[0], params[0].vcpu);
        cancel_join_vcpu_thread(threads[1], params[1].vcpu);
 
-       TEST_ASSERT_EQ(data->hlt_count, vcpu_get_stat(params[0].vcpu, halt_exits));
+       /*
+        * If the host support Idle HLT, i.e. KVM *might* be using Idle HLT,
+        * then the number of HLT exits may be less than the number of HLTs
+        * that were executed, as Idle HLT elides the exit if the vCPU has an
+        * unmasked, pending IRQ (or NMI).
+        */
+       if (this_cpu_has(X86_FEATURE_IDLE_HLT))
+               TEST_ASSERT(data->hlt_count >= vcpu_get_stat(params[0].vcpu, halt_exits),
+                           "HLT insns = %lu, HLT exits = %lu",
+                           data->hlt_count, vcpu_get_stat(params[0].vcpu, halt_exits));
+       else
+               TEST_ASSERT_EQ(data->hlt_count, vcpu_get_stat(params[0].vcpu, halt_exits));
 
        fprintf(stderr,
                "Test successful after running for %d seconds.\n"