|
@@ -107,6 +107,8 @@ static u64 __read_mostly host_xss;
|
|
static bool __read_mostly enable_pml = 1;
|
|
static bool __read_mostly enable_pml = 1;
|
|
module_param_named(pml, enable_pml, bool, S_IRUGO);
|
|
module_param_named(pml, enable_pml, bool, S_IRUGO);
|
|
|
|
|
|
|
|
+#define KVM_VMX_TSC_MULTIPLIER_MAX 0xffffffffffffffffULL
|
|
|
|
+
|
|
#define KVM_GUEST_CR0_MASK (X86_CR0_NW | X86_CR0_CD)
|
|
#define KVM_GUEST_CR0_MASK (X86_CR0_NW | X86_CR0_CD)
|
|
#define KVM_VM_CR0_ALWAYS_ON_UNRESTRICTED_GUEST (X86_CR0_WP | X86_CR0_NE)
|
|
#define KVM_VM_CR0_ALWAYS_ON_UNRESTRICTED_GUEST (X86_CR0_WP | X86_CR0_NE)
|
|
#define KVM_VM_CR0_ALWAYS_ON \
|
|
#define KVM_VM_CR0_ALWAYS_ON \
|
|
@@ -1172,6 +1174,12 @@ static inline bool cpu_has_vmx_pml(void)
|
|
return vmcs_config.cpu_based_2nd_exec_ctrl & SECONDARY_EXEC_ENABLE_PML;
|
|
return vmcs_config.cpu_based_2nd_exec_ctrl & SECONDARY_EXEC_ENABLE_PML;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+static inline bool cpu_has_vmx_tsc_scaling(void)
|
|
|
|
+{
|
|
|
|
+ return vmcs_config.cpu_based_2nd_exec_ctrl &
|
|
|
|
+ SECONDARY_EXEC_TSC_SCALING;
|
|
|
|
+}
|
|
|
|
+
|
|
static inline bool report_flexpriority(void)
|
|
static inline bool report_flexpriority(void)
|
|
{
|
|
{
|
|
return flexpriority_enabled;
|
|
return flexpriority_enabled;
|
|
@@ -3133,7 +3141,8 @@ static __init int setup_vmcs_config(struct vmcs_config *vmcs_conf)
|
|
SECONDARY_EXEC_SHADOW_VMCS |
|
|
SECONDARY_EXEC_SHADOW_VMCS |
|
|
SECONDARY_EXEC_XSAVES |
|
|
SECONDARY_EXEC_XSAVES |
|
|
SECONDARY_EXEC_ENABLE_PML |
|
|
SECONDARY_EXEC_ENABLE_PML |
|
|
- SECONDARY_EXEC_PCOMMIT;
|
|
|
|
|
|
+ SECONDARY_EXEC_PCOMMIT |
|
|
|
|
+ SECONDARY_EXEC_TSC_SCALING;
|
|
if (adjust_vmx_controls(min2, opt2,
|
|
if (adjust_vmx_controls(min2, opt2,
|
|
MSR_IA32_VMX_PROCBASED_CTLS2,
|
|
MSR_IA32_VMX_PROCBASED_CTLS2,
|
|
&_cpu_based_2nd_exec_control) < 0)
|
|
&_cpu_based_2nd_exec_control) < 0)
|
|
@@ -6178,6 +6187,12 @@ static __init int hardware_setup(void)
|
|
if (!cpu_has_vmx_apicv())
|
|
if (!cpu_has_vmx_apicv())
|
|
enable_apicv = 0;
|
|
enable_apicv = 0;
|
|
|
|
|
|
|
|
+ if (cpu_has_vmx_tsc_scaling()) {
|
|
|
|
+ kvm_has_tsc_control = true;
|
|
|
|
+ kvm_max_tsc_scaling_ratio = KVM_VMX_TSC_MULTIPLIER_MAX;
|
|
|
|
+ kvm_tsc_scaling_ratio_frac_bits = 48;
|
|
|
|
+ }
|
|
|
|
+
|
|
if (enable_apicv)
|
|
if (enable_apicv)
|
|
kvm_x86_ops->update_cr8_intercept = NULL;
|
|
kvm_x86_ops->update_cr8_intercept = NULL;
|
|
else {
|
|
else {
|