Re: [PATCH] KVM: nVMX: Always reflect #NM VM-exits to L1

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 




> On 13 Sep 2018, at 21:54, Jim Mattson <jmattson@xxxxxxxxxx> wrote:
> 
> When bit 3 (corresponding to CR0.TS) of the VMCS12 cr0_guest_host_mask
> field is clear, the VMCS12 guest_cr0 field does not necessarily hold
> the current value of the L2 CR0.TS bit, so the code that checked for
> L2's CR0.TS bit being set was incorrect. Moreover, I'm not sure that

Surprised this wasn’t noticed when
commit ccf9844e5d99 ("kvm, vmx: Really fix lazy FPU on nested guest”)
was reviewed. Funny it didn’t even “Really” fixed lazy FPU on nested guest :P.
Should always be careful with commit titles...

> the CR0.TS check was adequate. (What if L2's CR0.EM was set, for
> instance?)
> 
> Fortunately, lazy FPU has gone away, so L0 has lost all interest in
> intercepting #NM exceptions. See commit bd7e5b0899a4 ("KVM: x86:
> remove code for lazy FPU handling"). Therefore, there is no longer any
> question of which hypervisor gets first dibs. The #NM VM-exit should
> always be reflected to L1. (Note that the corresponding bit must be
> set in the VMCS12 exception_bitmap field for there to be an #NM
> VM-exit at all.)
> 
> Fixes: ccf9844e5d99c ("kvm, vmx: Really fix lazy FPU on nested guest”)
> Reported-by: Abhiroop Dabral <adabral@xxxxxxxxxxxxxxxxxxxx>
> Signed-off-by: Jim Mattson <jmattson@xxxxxxxxxx>
> Reviewed-by: Peter Shier <pshier@xxxxxxxxxx>
> Tested-by: Abhiroop Dabral <adabral@xxxxxxxxxxxxxxxxxxxx>
> ---
> arch/x86/kvm/vmx.c | 8 --------
> 1 file changed, 8 deletions(-)
> 
> diff --git a/arch/x86/kvm/vmx.c b/arch/x86/kvm/vmx.c
> index 533a327372c8..49364b791eb9 100644
> --- a/arch/x86/kvm/vmx.c
> +++ b/arch/x86/kvm/vmx.c
> @@ -1610,11 +1610,6 @@ static inline bool is_page_fault(u32 intr_info)
> 	return is_exception_n(intr_info, PF_VECTOR);
> }
> 
> -static inline bool is_no_device(u32 intr_info)
> -{
> -	return is_exception_n(intr_info, NM_VECTOR);
> -}
> -
> static inline bool is_invalid_opcode(u32 intr_info)
> {
> 	return is_exception_n(intr_info, UD_VECTOR);
> @@ -9639,9 +9634,6 @@ static bool nested_vmx_exit_reflected(struct kvm_vcpu *vcpu, u32 exit_reason)
> 			return false;
> 		else if (is_page_fault(intr_info))
> 			return !vmx->vcpu.arch.apf.host_apf_reason && enable_ept;
> -		else if (is_no_device(intr_info) &&
> -			 !(vmcs12->guest_cr0 & X86_CR0_TS))
> -			return false;
> 		else if (is_debug(intr_info) &&
> 			 vcpu->guest_debug &
> 			 (KVM_GUESTDBG_SINGLESTEP | KVM_GUESTDBG_USE_HW_BP))
> -- 
> 2.19.0.rc2.392.g5ba43deb5a-goog
> 

Reviewed-by: Liran Alon <liran.alon@xxxxxxxxxx>

I think it will also be a good idea to add a regression kvm-unit-tests to vmx_tests.c
as this should be fairly simple.

-Liran






[Index of Archives]     [KVM ARM]     [KVM ia64]     [KVM ppc]     [Virtualization Tools]     [Spice Development]     [Libvirt]     [Libvirt Users]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite Questions]     [Linux Kernel]     [Linux SCSI]     [XFree86]

  Powered by Linux