diff mbox series

[kvm-unit-tests,1/2] x86: nVMX: Do not use test_skip() when multiple tests are run

Message ID 20190830204031.3100-2-namit@vmware.com (mailing list archive)
State New, archived
Headers show
Series x86: nVMX: Bug fixes | expand

Commit Message

Nadav Amit Aug. 30, 2019, 8:40 p.m. UTC
Using test_skip() when multiple tests are run causes all the following
tests to be skipped. Instead, just print a message and return.

Fixes: 47cc3d85c2fe ("nVMX x86: Check PML and EPT on vmentry of L2 guests")
Fixes: 7fd449f2ed2e ("nVMX x86: Check VPID value on vmentry of L2 guests")
Fixes: 181219bfd76b ("x86: Add test for checking NMI controls on vmentry of L2 guests")
Fixes: 1d70eb823e12 ("nVMX x86: Check EPTP on vmentry of L2 guests")
Cc: Krish Sadhukhan <krish.sadhukhan@oracle.com>
Signed-off-by: Nadav Amit <namit@vmware.com>
---
 x86/vmx_tests.c | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

Comments

Sean Christopherson Sept. 3, 2019, 5:28 p.m. UTC | #1
On Fri, Aug 30, 2019 at 01:40:30PM -0700, Nadav Amit wrote:
> Using test_skip() when multiple tests are run causes all the following
> tests to be skipped. Instead, just print a message and return.
> 
> Fixes: 47cc3d85c2fe ("nVMX x86: Check PML and EPT on vmentry of L2 guests")
> Fixes: 7fd449f2ed2e ("nVMX x86: Check VPID value on vmentry of L2 guests")
> Fixes: 181219bfd76b ("x86: Add test for checking NMI controls on vmentry of L2 guests")
> Fixes: 1d70eb823e12 ("nVMX x86: Check EPTP on vmentry of L2 guests")
> Cc: Krish Sadhukhan <krish.sadhukhan@oracle.com>
> Signed-off-by: Nadav Amit <namit@vmware.com>

invvpid_test_v2() also has a bunch of bad calls to test_skip().

What about removing test_skip() entirely?  The code for in_guest looks
suspect, e.g. at a glance it should use HYPERCALL_VMSKIP instead of
HYPERCALL_VMABORT.  The only somewhat legit usage is the ept tests, and
only then because the ept tests are all at the end of the array.
Returning success/failure from ept_access_test_setup() seems like a
better solution than test_skip.

> ---
>  x86/vmx_tests.c | 8 ++++----
>  1 file changed, 4 insertions(+), 4 deletions(-)
> 
> diff --git a/x86/vmx_tests.c b/x86/vmx_tests.c
> index f035f24..4ff1570 100644
> --- a/x86/vmx_tests.c
> +++ b/x86/vmx_tests.c
> @@ -4040,7 +4040,7 @@ static void test_vpid(void)
>  
>  	if (!((ctrl_cpu_rev[0].clr & CPU_SECONDARY) &&
>  	    (ctrl_cpu_rev[1].clr & CPU_VPID))) {
> -		test_skip("Secondary controls and/or VPID not supported");
> +		printf("Secondary controls and/or VPID not supported\n");
>  		return;
>  	}
>  
> @@ -4544,7 +4544,7 @@ static void test_nmi_ctrls(void)
>  
>  	if ((ctrl_pin_rev.clr & (PIN_NMI | PIN_VIRT_NMI)) !=
>  	    (PIN_NMI | PIN_VIRT_NMI)) {
> -		test_skip("NMI exiting and Virtual NMIs are not supported !");
> +		printf("NMI exiting and Virtual NMIs are not supported !\n");
>  		return;
>  	}
>  
> @@ -4657,7 +4657,7 @@ static void test_ept_eptp(void)
>  
>  	if (!((ctrl_cpu_rev[0].clr & CPU_SECONDARY) &&
>  	    (ctrl_cpu_rev[1].clr & CPU_EPT))) {
> -		test_skip("\"CPU secondary\" and/or \"enable EPT\" execution controls are not supported !");
> +		printf("\"CPU secondary\" and/or \"enable EPT\" execution controls are not supported !\n");
>  		return;
>  	}
>  
> @@ -4844,7 +4844,7 @@ static void test_pml(void)
>  
>  	if (!((ctrl_cpu_rev[0].clr & CPU_SECONDARY) &&
>  	    (ctrl_cpu_rev[1].clr & CPU_EPT) && (ctrl_cpu_rev[1].clr & CPU_PML))) {
> -		test_skip("\"Secondary execution\" control or \"enable EPT\" control or \"enable PML\" control is not supported !");
> +		printf("\"Secondary execution\" control or \"enable EPT\" control or \"enable PML\" control is not supported !\n");
>  		return;
>  	}
>  
> -- 
> 2.17.1
>
Nadav Amit Sept. 3, 2019, 5:44 p.m. UTC | #2
> On Sep 3, 2019, at 10:28 AM, Sean Christopherson <sean.j.christopherson@intel.com> wrote:
> 
> On Fri, Aug 30, 2019 at 01:40:30PM -0700, Nadav Amit wrote:
>> Using test_skip() when multiple tests are run causes all the following
>> tests to be skipped. Instead, just print a message and return.
>> 
>> Fixes: 47cc3d85c2fe ("nVMX x86: Check PML and EPT on vmentry of L2 guests")
>> Fixes: 7fd449f2ed2e ("nVMX x86: Check VPID value on vmentry of L2 guests")
>> Fixes: 181219bfd76b ("x86: Add test for checking NMI controls on vmentry of L2 guests")
>> Fixes: 1d70eb823e12 ("nVMX x86: Check EPTP on vmentry of L2 guests")
>> Cc: Krish Sadhukhan <krish.sadhukhan@oracle.com>
>> Signed-off-by: Nadav Amit <namit@vmware.com>
> 
> invvpid_test_v2() also has a bunch of bad calls to test_skip().

In the case of invvpid_test_v2() the use seems correct, as the call is not
encapsulated within a group of tests. You want to skip all the tests if
invvpid is not supported for some reason.

> What about removing test_skip() entirely?  The code for in_guest looks
> suspect, e.g. at a glance it should use HYPERCALL_VMSKIP instead of
> HYPERCALL_VMABORT.  The only somewhat legit usage is the ept tests, and
> only then because the ept tests are all at the end of the array.
> Returning success/failure from ept_access_test_setup() seems like a
> better solution than test_skip.

I don’t know. test_skip() does seem “nice” in theory (as long as it is not
used improperly). Having said that, the fact that it uses HYPERCALL_VMABORT
does seem wrong. I think it should be a separate change though.
Sean Christopherson Sept. 3, 2019, 5:50 p.m. UTC | #3
On Tue, Sep 03, 2019 at 05:44:00PM +0000, Nadav Amit wrote:
> > On Sep 3, 2019, at 10:28 AM, Sean Christopherson <sean.j.christopherson@intel.com> wrote:
> > 
> > On Fri, Aug 30, 2019 at 01:40:30PM -0700, Nadav Amit wrote:
> >> Using test_skip() when multiple tests are run causes all the following
> >> tests to be skipped. Instead, just print a message and return.
> >> 
> >> Fixes: 47cc3d85c2fe ("nVMX x86: Check PML and EPT on vmentry of L2 guests")
> >> Fixes: 7fd449f2ed2e ("nVMX x86: Check VPID value on vmentry of L2 guests")
> >> Fixes: 181219bfd76b ("x86: Add test for checking NMI controls on vmentry of L2 guests")
> >> Fixes: 1d70eb823e12 ("nVMX x86: Check EPTP on vmentry of L2 guests")
> >> Cc: Krish Sadhukhan <krish.sadhukhan@oracle.com>
> >> Signed-off-by: Nadav Amit <namit@vmware.com>
> > 
> > invvpid_test_v2() also has a bunch of bad calls to test_skip().
> 
> In the case of invvpid_test_v2() the use seems correct, as the call is not
> encapsulated within a group of tests. You want to skip all the tests if
> invvpid is not supported for some reason.

Ah, I misread the code, I was thinking the longjmp was headed out of the
loop on vmx_tests.

> > What about removing test_skip() entirely?  The code for in_guest looks
> > suspect, e.g. at a glance it should use HYPERCALL_VMSKIP instead of
> > HYPERCALL_VMABORT.  The only somewhat legit usage is the ept tests, and
> > only then because the ept tests are all at the end of the array.
> > Returning success/failure from ept_access_test_setup() seems like a
> > better solution than test_skip.
> 
> I don’t know. test_skip() does seem “nice” in theory (as long as it is not
> used improperly). 

Agreed after rereading the code.

> Having said that, the fact that it uses HYPERCALL_VMABORT
> does seem wrong. I think it should be a separate change though.

Definitely.  I'll look at it when I get the chance.
diff mbox series

Patch

diff --git a/x86/vmx_tests.c b/x86/vmx_tests.c
index f035f24..4ff1570 100644
--- a/x86/vmx_tests.c
+++ b/x86/vmx_tests.c
@@ -4040,7 +4040,7 @@  static void test_vpid(void)
 
 	if (!((ctrl_cpu_rev[0].clr & CPU_SECONDARY) &&
 	    (ctrl_cpu_rev[1].clr & CPU_VPID))) {
-		test_skip("Secondary controls and/or VPID not supported");
+		printf("Secondary controls and/or VPID not supported\n");
 		return;
 	}
 
@@ -4544,7 +4544,7 @@  static void test_nmi_ctrls(void)
 
 	if ((ctrl_pin_rev.clr & (PIN_NMI | PIN_VIRT_NMI)) !=
 	    (PIN_NMI | PIN_VIRT_NMI)) {
-		test_skip("NMI exiting and Virtual NMIs are not supported !");
+		printf("NMI exiting and Virtual NMIs are not supported !\n");
 		return;
 	}
 
@@ -4657,7 +4657,7 @@  static void test_ept_eptp(void)
 
 	if (!((ctrl_cpu_rev[0].clr & CPU_SECONDARY) &&
 	    (ctrl_cpu_rev[1].clr & CPU_EPT))) {
-		test_skip("\"CPU secondary\" and/or \"enable EPT\" execution controls are not supported !");
+		printf("\"CPU secondary\" and/or \"enable EPT\" execution controls are not supported !\n");
 		return;
 	}
 
@@ -4844,7 +4844,7 @@  static void test_pml(void)
 
 	if (!((ctrl_cpu_rev[0].clr & CPU_SECONDARY) &&
 	    (ctrl_cpu_rev[1].clr & CPU_EPT) && (ctrl_cpu_rev[1].clr & CPU_PML))) {
-		test_skip("\"Secondary execution\" control or \"enable EPT\" control or \"enable PML\" control is not supported !");
+		printf("\"Secondary execution\" control or \"enable EPT\" control or \"enable PML\" control is not supported !\n");
 		return;
 	}