public inbox for kvm@vger.kernel.org
 help / color / mirror / Atom feed
* [PATCH 1/2] KVM: selftests: Avoid infinite loop in hyperv_features when invtsc is missing
@ 2024-01-24 16:48 Vitaly Kuznetsov
  2024-01-24 16:48 ` [PATCH 2/2] KVM: selftests: Fail tests when open() fails with !ENOENT Vitaly Kuznetsov
  0 siblings, 1 reply; 3+ messages in thread
From: Vitaly Kuznetsov @ 2024-01-24 16:48 UTC (permalink / raw)
  To: kvm, Paolo Bonzini, Sean Christopherson

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>
---
 tools/testing/selftests/kvm/x86_64/hyperv_features.c | 9 +++++----
 1 file changed, 5 insertions(+), 4 deletions(-)

diff --git a/tools/testing/selftests/kvm/x86_64/hyperv_features.c b/tools/testing/selftests/kvm/x86_64/hyperv_features.c
index 4f4193fc74ff..b923a285e96f 100644
--- a/tools/testing/selftests/kvm/x86_64/hyperv_features.c
+++ b/tools/testing/selftests/kvm/x86_64/hyperv_features.c
@@ -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);
 	}
-- 
2.43.0


^ permalink raw reply related	[flat|nested] 3+ messages in thread

* [PATCH 2/2] KVM: selftests: Fail tests when open() fails with !ENOENT
  2024-01-24 16:48 [PATCH 1/2] KVM: selftests: Avoid infinite loop in hyperv_features when invtsc is missing Vitaly Kuznetsov
@ 2024-01-24 16:48 ` Vitaly Kuznetsov
  2024-01-24 17:28   ` Sean Christopherson
  0 siblings, 1 reply; 3+ messages in thread
From: Vitaly Kuznetsov @ 2024-01-24 16:48 UTC (permalink / raw)
  To: kvm, Paolo Bonzini, Sean Christopherson

open_path_or_exit() is used for '/dev/kvm', '/dev/sev', and
'/sys/module/%s/parameters/%s' and skipping test when the entry is missing
is completely reasonable. Other errors, however, may indicate a real issue
which is easy to miss. E.g. when 'hyperv_features' test was entering an
infinite loop the output was:

./hyperv_features
Testing access to Hyper-V specific MSRs
1..0 # SKIP - /dev/kvm not available (errno: 24)

and this can easily get overlooked.

Keep ENOENT case 'special' for skipping tests and fail when open() results
in any other errno.

Signed-off-by: Vitaly Kuznetsov <vkuznets@redhat.com>
---
 tools/testing/selftests/kvm/lib/kvm_util.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/tools/testing/selftests/kvm/lib/kvm_util.c b/tools/testing/selftests/kvm/lib/kvm_util.c
index e066d584c656..f3dfd0d38b7f 100644
--- a/tools/testing/selftests/kvm/lib/kvm_util.c
+++ b/tools/testing/selftests/kvm/lib/kvm_util.c
@@ -27,7 +27,8 @@ int open_path_or_exit(const char *path, int flags)
 	int fd;
 
 	fd = open(path, flags);
-	__TEST_REQUIRE(fd >= 0, "%s not available (errno: %d)", path, errno);
+	__TEST_REQUIRE(fd >= 0 || errno != ENOENT, "%s not present", path);
+	TEST_ASSERT(fd >= 0, "%s not available (errno: %d)", path, errno);
 
 	return fd;
 }
-- 
2.43.0


^ permalink raw reply related	[flat|nested] 3+ messages in thread

* Re: [PATCH 2/2] KVM: selftests: Fail tests when open() fails with !ENOENT
  2024-01-24 16:48 ` [PATCH 2/2] KVM: selftests: Fail tests when open() fails with !ENOENT Vitaly Kuznetsov
@ 2024-01-24 17:28   ` Sean Christopherson
  0 siblings, 0 replies; 3+ messages in thread
From: Sean Christopherson @ 2024-01-24 17:28 UTC (permalink / raw)
  To: Vitaly Kuznetsov; +Cc: kvm, Paolo Bonzini

On Wed, Jan 24, 2024, Vitaly Kuznetsov wrote:
> open_path_or_exit() is used for '/dev/kvm', '/dev/sev', and
> '/sys/module/%s/parameters/%s' and skipping test when the entry is missing
> is completely reasonable. Other errors, however, may indicate a real issue
> which is easy to miss. E.g. when 'hyperv_features' test was entering an
> infinite loop the output was:
> 
> ./hyperv_features
> Testing access to Hyper-V specific MSRs
> 1..0 # SKIP - /dev/kvm not available (errno: 24)
> 
> and this can easily get overlooked.
> 
> Keep ENOENT case 'special' for skipping tests and fail when open() results
> in any other errno.
> 
> Signed-off-by: Vitaly Kuznetsov <vkuznets@redhat.com>
> ---
>  tools/testing/selftests/kvm/lib/kvm_util.c | 3 ++-
>  1 file changed, 2 insertions(+), 1 deletion(-)
> 
> diff --git a/tools/testing/selftests/kvm/lib/kvm_util.c b/tools/testing/selftests/kvm/lib/kvm_util.c
> index e066d584c656..f3dfd0d38b7f 100644
> --- a/tools/testing/selftests/kvm/lib/kvm_util.c
> +++ b/tools/testing/selftests/kvm/lib/kvm_util.c
> @@ -27,7 +27,8 @@ int open_path_or_exit(const char *path, int flags)
>  	int fd;
>  
>  	fd = open(path, flags);
> -	__TEST_REQUIRE(fd >= 0, "%s not available (errno: %d)", path, errno);
> +	__TEST_REQUIRE(fd >= 0 || errno != ENOENT, "%s not present", path);

Rather than make up our own error messages, can we use strerror()?

> +	TEST_ASSERT(fd >= 0, "%s not available (errno: %d)", path, errno);

And then here just say "Failed to open '%s'" and let test_assert() fill in the
strerror() information.

^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2024-01-24 17:28 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2024-01-24 16:48 [PATCH 1/2] KVM: selftests: Avoid infinite loop in hyperv_features when invtsc is missing Vitaly Kuznetsov
2024-01-24 16:48 ` [PATCH 2/2] KVM: selftests: Fail tests when open() fails with !ENOENT Vitaly Kuznetsov
2024-01-24 17:28   ` Sean Christopherson

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox