|
@@ -11427,16 +11427,18 @@ static void vmx_start_preemption_timer(struct kvm_vcpu *vcpu)
|
|
u64 preemption_timeout = get_vmcs12(vcpu)->vmx_preemption_timer_value;
|
|
u64 preemption_timeout = get_vmcs12(vcpu)->vmx_preemption_timer_value;
|
|
struct vcpu_vmx *vmx = to_vmx(vcpu);
|
|
struct vcpu_vmx *vmx = to_vmx(vcpu);
|
|
|
|
|
|
- if (vcpu->arch.virtual_tsc_khz == 0)
|
|
|
|
- return;
|
|
|
|
-
|
|
|
|
- /* Make sure short timeouts reliably trigger an immediate vmexit.
|
|
|
|
- * hrtimer_start does not guarantee this. */
|
|
|
|
- if (preemption_timeout <= 1) {
|
|
|
|
|
|
+ /*
|
|
|
|
+ * A timer value of zero is architecturally guaranteed to cause
|
|
|
|
+ * a VMExit prior to executing any instructions in the guest.
|
|
|
|
+ */
|
|
|
|
+ if (preemption_timeout == 0) {
|
|
vmx_preemption_timer_fn(&vmx->nested.preemption_timer);
|
|
vmx_preemption_timer_fn(&vmx->nested.preemption_timer);
|
|
return;
|
|
return;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ if (vcpu->arch.virtual_tsc_khz == 0)
|
|
|
|
+ return;
|
|
|
|
+
|
|
preemption_timeout <<= VMX_MISC_EMULATED_PREEMPTION_TIMER_RATE;
|
|
preemption_timeout <<= VMX_MISC_EMULATED_PREEMPTION_TIMER_RATE;
|
|
preemption_timeout *= 1000000;
|
|
preemption_timeout *= 1000000;
|
|
do_div(preemption_timeout, vcpu->arch.virtual_tsc_khz);
|
|
do_div(preemption_timeout, vcpu->arch.virtual_tsc_khz);
|