kvm: x86: Update tsc multiplier on change.
vmx.c writes the TSC_MULTIPLIER field in vmx_vcpu_load, but only when a
vcpu has migrated physical cpus. Record the last value written and
update in vmx_vcpu_load on any change, otherwise a cpu migration must
occur for TSC frequency scaling to take effect.
Cc: stable@vger.kernel.org
Fixes: ff2c3a1803
Signed-off-by: Owen Hofmann <osh@google.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
parent
0178fd7dcc
commit
2680d6da45
|
@ -596,6 +596,8 @@ struct vcpu_vmx {
|
||||||
/* Support for PML */
|
/* Support for PML */
|
||||||
#define PML_ENTITY_NUM 512
|
#define PML_ENTITY_NUM 512
|
||||||
struct page *pml_pg;
|
struct page *pml_pg;
|
||||||
|
|
||||||
|
u64 current_tsc_ratio;
|
||||||
};
|
};
|
||||||
|
|
||||||
enum segment_cache_field {
|
enum segment_cache_field {
|
||||||
|
@ -2127,14 +2129,16 @@ static void vmx_vcpu_load(struct kvm_vcpu *vcpu, int cpu)
|
||||||
rdmsrl(MSR_IA32_SYSENTER_ESP, sysenter_esp);
|
rdmsrl(MSR_IA32_SYSENTER_ESP, sysenter_esp);
|
||||||
vmcs_writel(HOST_IA32_SYSENTER_ESP, sysenter_esp); /* 22.2.3 */
|
vmcs_writel(HOST_IA32_SYSENTER_ESP, sysenter_esp); /* 22.2.3 */
|
||||||
|
|
||||||
/* Setup TSC multiplier */
|
|
||||||
if (cpu_has_vmx_tsc_scaling())
|
|
||||||
vmcs_write64(TSC_MULTIPLIER,
|
|
||||||
vcpu->arch.tsc_scaling_ratio);
|
|
||||||
|
|
||||||
vmx->loaded_vmcs->cpu = cpu;
|
vmx->loaded_vmcs->cpu = 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_vcpu_pi_load(vcpu, cpu);
|
vmx_vcpu_pi_load(vcpu, cpu);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue