Re: [PATCH v2] kvm: nVMX: fix nested tsc scaling

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

 




On 17/08/2016 18:36, Peter Feiner wrote:
> When the host supported TSC scaling, L2 would use a TSC multiplier of
> 0, which causes a VM entry failure. Now L2's TSC uses the same
> multiplier as L1.
> 
> Signed-off-by: Peter Feiner <pfeiner@xxxxxxxxxx>
> ---
> 
> v1->v2: Updated commit message per VMX spec and fixed spelling.
> ---
>  arch/x86/kvm/vmx.c | 16 ++++++++++++----
>  1 file changed, 12 insertions(+), 4 deletions(-)
> 
> diff --git a/arch/x86/kvm/vmx.c b/arch/x86/kvm/vmx.c
> index a45d858..9d1d0dc 100644
> --- a/arch/x86/kvm/vmx.c
> +++ b/arch/x86/kvm/vmx.c
> @@ -2198,6 +2198,12 @@ static void vmx_vcpu_pi_load(struct kvm_vcpu *vcpu, int cpu)
>  			new.control) != old.control);
>  }
>  
> +static void decache_tsc_multiplier(struct vcpu_vmx *vmx)
> +{
> +	vmx->current_tsc_ratio = vmx->vcpu.arch.tsc_scaling_ratio;
> +	vmcs_write64(TSC_MULTIPLIER, vmx->current_tsc_ratio);
> +}
> +
>  /*
>   * Switches to specified vcpu, until a matching vcpu_put(), but assumes
>   * vcpu mutex is already taken.
> @@ -2256,10 +2262,8 @@ static void vmx_vcpu_load(struct kvm_vcpu *vcpu, int cpu)
>  
>  	/* Setup TSC multiplier */
>  	if (kvm_has_tsc_control &&
> -	    vmx->current_tsc_ratio != vcpu->arch.tsc_scaling_ratio) {
> -		vmx->current_tsc_ratio = vcpu->arch.tsc_scaling_ratio;
> -		vmcs_write64(TSC_MULTIPLIER, vmx->current_tsc_ratio);
> -	}
> +	    vmx->current_tsc_ratio != vcpu->arch.tsc_scaling_ratio)
> +		decache_tsc_multiplier(vmx);
>  
>  	vmx_vcpu_pi_load(vcpu, cpu);
>  	vmx->host_pkru = read_pkru();
> @@ -10011,6 +10015,8 @@ static void prepare_vmcs02(struct kvm_vcpu *vcpu, struct vmcs12 *vmcs12)
>  			vmx->nested.vmcs01_tsc_offset + vmcs12->tsc_offset);
>  	else
>  		vmcs_write64(TSC_OFFSET, vmx->nested.vmcs01_tsc_offset);
> +	if (kvm_has_tsc_control)
> +		decache_tsc_multiplier(vmx);
>  
>  	if (enable_vpid) {
>  		/*
> @@ -10767,6 +10773,8 @@ static void nested_vmx_vmexit(struct kvm_vcpu *vcpu, u32 exit_reason,
>  	else
>  		vmcs_set_bits(PIN_BASED_VM_EXEC_CONTROL,
>  			      PIN_BASED_VMX_PREEMPTION_TIMER);
> +	if (kvm_has_tsc_control)
> +		decache_tsc_multiplier(vmx);
>  
>  	/* This is needed for same reason as it was needed in prepare_vmcs02 */
>  	vmx->host_rsp = 0;
> 

Queued for 4.8-rc, thanks.

Paolo
--
To unsubscribe from this list: send the line "unsubscribe kvm" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html



[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