mirror of
https://github.com/AuxXxilium/linux_dsm_epyc7002.git
synced 2025-01-20 15:27:52 +07:00
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: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
parent
3195a35b41
commit
35ee9e48b9
@ -1501,24 +1501,38 @@ static void cancel_hv_timer(struct kvm_lapic *apic)
|
||||
preempt_enable();
|
||||
}
|
||||
|
||||
static bool __start_hv_timer(struct kvm_lapic *apic)
|
||||
{
|
||||
struct kvm_timer *ktimer = &apic->lapic_timer;
|
||||
int r;
|
||||
|
||||
if (!apic_lvtt_period(apic) && atomic_read(&ktimer->pending))
|
||||
return false;
|
||||
|
||||
r = kvm_x86_ops->set_hv_timer(apic->vcpu, ktimer->tscdeadline);
|
||||
if (r < 0)
|
||||
return false;
|
||||
|
||||
ktimer->hv_timer_in_use = true;
|
||||
hrtimer_cancel(&ktimer->timer);
|
||||
|
||||
/*
|
||||
* Also recheck ktimer->pending, in case the sw timer triggered in
|
||||
* 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)
|
||||
{
|
||||
u64 tscdeadline = apic->lapic_timer.tscdeadline;
|
||||
|
||||
if ((atomic_read(&apic->lapic_timer.pending) &&
|
||||
!apic_lvtt_period(apic)) ||
|
||||
kvm_x86_ops->set_hv_timer(apic->vcpu, tscdeadline)) {
|
||||
if (!__start_hv_timer(apic)) {
|
||||
if (apic->lapic_timer.hv_timer_in_use)
|
||||
cancel_hv_timer(apic);
|
||||
} else {
|
||||
apic->lapic_timer.hv_timer_in_use = true;
|
||||
hrtimer_cancel(&apic->lapic_timer.timer);
|
||||
|
||||
/* In case the sw timer triggered in the window */
|
||||
if (atomic_read(&apic->lapic_timer.pending) &&
|
||||
!apic_lvtt_period(apic))
|
||||
cancel_hv_timer(apic);
|
||||
}
|
||||
|
||||
trace_kvm_hv_timer_state(apic->vcpu->vcpu_id,
|
||||
apic->lapic_timer.hv_timer_in_use);
|
||||
return apic->lapic_timer.hv_timer_in_use;
|
||||
|
Loading…
Reference in New Issue
Block a user