All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH v2] KVM: selftests: Skip tests that require EPT when it is not available
@ 2022-09-27 16:52 David Matlack
  2022-09-28 22:57 ` Sean Christopherson
  0 siblings, 1 reply; 2+ messages in thread
From: David Matlack @ 2022-09-27 16:52 UTC (permalink / raw)
  To: Paolo Bonzini
  Cc: David Matlack, Peter Xu, Sean Christopherson, Colton Lewis, kvm

Skip selftests that require EPT support in the VM when it is not
available. For example, if running on a machine where kvm_intel.ept=N
since KVM does not offer EPT support to guests if EPT is not supported
on the host.

Specifically, this commit causes vmx_dirty_log_test and
dirty_log_perf_test -n to be skipped instead of failing on hosts where
kvm_intel.ept=N.

Signed-off-by: David Matlack <dmatlack@google.com>
---
v2:
 - Use kvm_get_feature_msr() instead of vcpu_get_msr() [Sean]
 - Force each test to call TEST_REQUIRE() [Sean]

v1: https://lore.kernel.org/kvm/20220926171457.532542-1-dmatlack@google.com/


 tools/testing/selftests/kvm/include/x86_64/vmx.h   |  1 +
 .../selftests/kvm/lib/x86_64/perf_test_util.c      |  1 +
 tools/testing/selftests/kvm/lib/x86_64/vmx.c       | 14 ++++++++++++++
 .../selftests/kvm/x86_64/vmx_dirty_log_test.c      |  1 +
 4 files changed, 17 insertions(+)

diff --git a/tools/testing/selftests/kvm/include/x86_64/vmx.h b/tools/testing/selftests/kvm/include/x86_64/vmx.h
index 99fa1410964c..0e49fb27698f 100644
--- a/tools/testing/selftests/kvm/include/x86_64/vmx.h
+++ b/tools/testing/selftests/kvm/include/x86_64/vmx.h
@@ -617,6 +617,7 @@ void nested_map_memslot(struct vmx_pages *vmx, struct kvm_vm *vm,
 			uint32_t memslot);
 void nested_identity_map_1g(struct vmx_pages *vmx, struct kvm_vm *vm,
 			    uint64_t addr, uint64_t size);
+bool kvm_cpu_has_ept(void);
 void prepare_eptp(struct vmx_pages *vmx, struct kvm_vm *vm,
 		  uint32_t eptp_memslot);
 void prepare_virtualize_apic_accesses(struct vmx_pages *vmx, struct kvm_vm *vm);
diff --git a/tools/testing/selftests/kvm/lib/x86_64/perf_test_util.c b/tools/testing/selftests/kvm/lib/x86_64/perf_test_util.c
index 0f344a7c89c4..e80c182c43ce 100644
--- a/tools/testing/selftests/kvm/lib/x86_64/perf_test_util.c
+++ b/tools/testing/selftests/kvm/lib/x86_64/perf_test_util.c
@@ -85,6 +85,7 @@ void perf_test_setup_nested(struct kvm_vm *vm, int nr_vcpus, struct kvm_vcpu *vc
 	int vcpu_id;
 
 	TEST_REQUIRE(kvm_cpu_has(X86_FEATURE_VMX));
+	TEST_REQUIRE(kvm_cpu_has_ept());
 
 	for (vcpu_id = 0; vcpu_id < nr_vcpus; vcpu_id++) {
 		vmx = vcpu_alloc_vmx(vm, &vmx_gva);
diff --git a/tools/testing/selftests/kvm/lib/x86_64/vmx.c b/tools/testing/selftests/kvm/lib/x86_64/vmx.c
index 80a568c439b8..13cd548e5c4c 100644
--- a/tools/testing/selftests/kvm/lib/x86_64/vmx.c
+++ b/tools/testing/selftests/kvm/lib/x86_64/vmx.c
@@ -5,6 +5,8 @@
  * Copyright (C) 2018, Google LLC.
  */
 
+#include <asm/msr-index.h>
+
 #include "test_util.h"
 #include "kvm_util.h"
 #include "processor.h"
@@ -542,6 +544,18 @@ void nested_identity_map_1g(struct vmx_pages *vmx, struct kvm_vm *vm,
 	__nested_map(vmx, vm, addr, addr, size, PG_LEVEL_1G);
 }
 
+bool kvm_cpu_has_ept(void)
+{
+	uint64_t ctrl;
+
+	ctrl = kvm_get_feature_msr(MSR_IA32_VMX_TRUE_PROCBASED_CTLS) >> 32;
+	if (!(ctrl & CPU_BASED_ACTIVATE_SECONDARY_CONTROLS))
+		return false;
+
+	ctrl = kvm_get_feature_msr(MSR_IA32_VMX_PROCBASED_CTLS2) >> 32;
+	return ctrl & SECONDARY_EXEC_ENABLE_EPT;
+}
+
 void prepare_eptp(struct vmx_pages *vmx, struct kvm_vm *vm,
 		  uint32_t eptp_memslot)
 {
diff --git a/tools/testing/selftests/kvm/x86_64/vmx_dirty_log_test.c b/tools/testing/selftests/kvm/x86_64/vmx_dirty_log_test.c
index 2d8c23d639f7..f0456fb031b1 100644
--- a/tools/testing/selftests/kvm/x86_64/vmx_dirty_log_test.c
+++ b/tools/testing/selftests/kvm/x86_64/vmx_dirty_log_test.c
@@ -78,6 +78,7 @@ int main(int argc, char *argv[])
 	bool done = false;
 
 	TEST_REQUIRE(kvm_cpu_has(X86_FEATURE_VMX));
+	TEST_REQUIRE(kvm_cpu_has_ept());
 
 	/* Create VM */
 	vm = vm_create_with_one_vcpu(&vcpu, l1_guest_code);

base-commit: 372d07084593dc7a399bf9bee815711b1fb1bcf2
prerequisite-patch-id: 2e3661ba8856c29b769499bac525b6943d9284b8
prerequisite-patch-id: 93031262de7b1f7fab1ad31ea5d6ef812c139179
-- 
2.37.3.998.g577e59143f-goog


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

* Re: [PATCH v2] KVM: selftests: Skip tests that require EPT when it is not available
  2022-09-27 16:52 [PATCH v2] KVM: selftests: Skip tests that require EPT when it is not available David Matlack
@ 2022-09-28 22:57 ` Sean Christopherson
  0 siblings, 0 replies; 2+ messages in thread
From: Sean Christopherson @ 2022-09-28 22:57 UTC (permalink / raw)
  To: David Matlack; +Cc: Paolo Bonzini, Peter Xu, Colton Lewis, kvm

On Tue, Sep 27, 2022, David Matlack wrote:
> Skip selftests that require EPT support in the VM when it is not
> available. For example, if running on a machine where kvm_intel.ept=N
> since KVM does not offer EPT support to guests if EPT is not supported
> on the host.
> 
> Specifically, this commit causes vmx_dirty_log_test and
> dirty_log_perf_test -n to be skipped instead of failing on hosts where
> kvm_intel.ept=N.
> 
> Signed-off-by: David Matlack <dmatlack@google.com>
> ---

Need to sync with Paolo on who is grabbing what.  In case it's Paolo...

Reviewed-by: Sean Christopherson <seanjc@google.com>

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

end of thread, other threads:[~2022-09-28 22:58 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-09-27 16:52 [PATCH v2] KVM: selftests: Skip tests that require EPT when it is not available David Matlack
2022-09-28 22:57 ` Sean Christopherson

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.