Commit 35ee9e48 authored by Paolo Bonzini's avatar Paolo Bonzini

KVM: lapic: reorganize start_hv_timer

There are many cases in which the hv timer must be canceled.  Split out
a new function to avoid duplication.
Signed-off-by: default avatarPaolo Bonzini <pbonzini@redhat.com>
parent 3195a35b
...@@ -1501,24 +1501,38 @@ static void cancel_hv_timer(struct kvm_lapic *apic) ...@@ -1501,24 +1501,38 @@ static void cancel_hv_timer(struct kvm_lapic *apic)
preempt_enable(); preempt_enable();
} }
static bool start_hv_timer(struct kvm_lapic *apic) static bool __start_hv_timer(struct kvm_lapic *apic)
{ {
u64 tscdeadline = apic->lapic_timer.tscdeadline; struct kvm_timer *ktimer = &apic->lapic_timer;
int r;
if ((atomic_read(&apic->lapic_timer.pending) && if (!apic_lvtt_period(apic) && atomic_read(&ktimer->pending))
!apic_lvtt_period(apic)) || return false;
kvm_x86_ops->set_hv_timer(apic->vcpu, tscdeadline)) {
if (apic->lapic_timer.hv_timer_in_use) r = kvm_x86_ops->set_hv_timer(apic->vcpu, ktimer->tscdeadline);
cancel_hv_timer(apic); if (r < 0)
} else { return false;
apic->lapic_timer.hv_timer_in_use = true;
hrtimer_cancel(&apic->lapic_timer.timer); ktimer->hv_timer_in_use = true;
hrtimer_cancel(&ktimer->timer);
/* In case the sw timer triggered in the window */ /*
if (atomic_read(&apic->lapic_timer.pending) && * Also recheck ktimer->pending, in case the sw timer triggered in
!apic_lvtt_period(apic)) * the window. For periodic timer, leave the hv timer running for
* simplicity, and the deadline will be recomputed on the next vmexit.
*/
if (!apic_lvtt_period(apic) && atomic_read(&ktimer->pending))
return false;
return true;
}
static bool start_hv_timer(struct kvm_lapic *apic)
{
if (!__start_hv_timer(apic)) {
if (apic->lapic_timer.hv_timer_in_use)
cancel_hv_timer(apic); cancel_hv_timer(apic);
} }
trace_kvm_hv_timer_state(apic->vcpu->vcpu_id, trace_kvm_hv_timer_state(apic->vcpu->vcpu_id,
apic->lapic_timer.hv_timer_in_use); apic->lapic_timer.hv_timer_in_use);
return apic->lapic_timer.hv_timer_in_use; return apic->lapic_timer.hv_timer_in_use;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment