]> git.itanic.dy.fi Git - linux-stable/commitdiff
KVM: selftests: Avoid infinite loop in hyperv_features when invtsc is missing
authorVitaly Kuznetsov <vkuznets@redhat.com>
Mon, 29 Jan 2024 08:58:46 +0000 (09:58 +0100)
committerSean Christopherson <seanjc@google.com>
Tue, 30 Jan 2024 20:32:03 +0000 (12:32 -0800)
When X86_FEATURE_INVTSC is missing, guest_test_msrs_access() was supposed
to skip testing dependent Hyper-V invariant TSC feature. Unfortunately,
'continue' does not lead to that as stage is not incremented. Moreover,
'vm' allocated with vm_create_with_one_vcpu() is not freed and the test
runs out of available file descriptors very quickly.

Fixes: bd827bd77537 ("KVM: selftests: Test Hyper-V invariant TSC control")
Signed-off-by: Vitaly Kuznetsov <vkuznets@redhat.com>
Link: https://lore.kernel.org/r/20240129085847.2674082-1-vkuznets@redhat.com
Signed-off-by: Sean Christopherson <seanjc@google.com>
tools/testing/selftests/kvm/x86_64/hyperv_features.c

index 4f4193fc74ffa29454c193ed741603c5fef1004b..b923a285e96f9492108ac17c21a070a4dd4ffa61 100644 (file)
@@ -454,7 +454,7 @@ static void guest_test_msrs_access(void)
                case 44:
                        /* MSR is not available when CPUID feature bit is unset */
                        if (!has_invtsc)
-                               continue;
+                               goto next_stage;
                        msr->idx = HV_X64_MSR_TSC_INVARIANT_CONTROL;
                        msr->write = false;
                        msr->fault_expected = true;
@@ -462,7 +462,7 @@ static void guest_test_msrs_access(void)
                case 45:
                        /* MSR is vailable when CPUID feature bit is set */
                        if (!has_invtsc)
-                               continue;
+                               goto next_stage;
                        vcpu_set_cpuid_feature(vcpu, HV_ACCESS_TSC_INVARIANT);
                        msr->idx = HV_X64_MSR_TSC_INVARIANT_CONTROL;
                        msr->write = false;
@@ -471,7 +471,7 @@ static void guest_test_msrs_access(void)
                case 46:
                        /* Writing bits other than 0 is forbidden */
                        if (!has_invtsc)
-                               continue;
+                               goto next_stage;
                        msr->idx = HV_X64_MSR_TSC_INVARIANT_CONTROL;
                        msr->write = true;
                        msr->write_val = 0xdeadbeef;
@@ -480,7 +480,7 @@ static void guest_test_msrs_access(void)
                case 47:
                        /* Setting bit 0 enables the feature */
                        if (!has_invtsc)
-                               continue;
+                               goto next_stage;
                        msr->idx = HV_X64_MSR_TSC_INVARIANT_CONTROL;
                        msr->write = true;
                        msr->write_val = 1;
@@ -513,6 +513,7 @@ static void guest_test_msrs_access(void)
                        return;
                }
 
+next_stage:
                stage++;
                kvm_vm_free(vm);
        }