Commit 4ca88b3f authored by Sean Christopherson's avatar Sean Christopherson Committed by Paolo Bonzini

KVM: lapic: Check for a pending timer intr prior to start_hv_timer()

Checking for a pending non-periodic interrupt in start_hv_timer() leads
to restart_apic_timer() making an unnecessary call to start_sw_timer()
due to start_hv_timer() returning false.

Alternatively, start_hv_timer() could return %true when there is a
pending non-periodic interrupt, but that approach is less intuitive,
i.e. would require a beefy comment to explain an otherwise simple check.

Cc: Liran Alon <liran.alon@oracle.com>
Cc: Wanpeng Li <wanpengli@tencent.com>
Suggested-by: default avatarLiran Alon <liran.alon@oracle.com>
Suggested-by: default avatarPaolo Bonzini <pbonzini@redhat.com>
Signed-off-by: default avatarSean Christopherson <sean.j.christopherson@intel.com>
Signed-off-by: default avatarPaolo Bonzini <pbonzini@redhat.com>
parent f9927982
...@@ -1680,9 +1680,6 @@ static bool start_hv_timer(struct kvm_lapic *apic) ...@@ -1680,9 +1680,6 @@ static bool start_hv_timer(struct kvm_lapic *apic)
if (!kvm_x86_ops->set_hv_timer) if (!kvm_x86_ops->set_hv_timer)
return false; return false;
if (!apic_lvtt_period(apic) && atomic_read(&ktimer->pending))
return false;
if (!ktimer->tscdeadline) if (!ktimer->tscdeadline)
return false; return false;
...@@ -1735,8 +1732,13 @@ static void start_sw_timer(struct kvm_lapic *apic) ...@@ -1735,8 +1732,13 @@ static void start_sw_timer(struct kvm_lapic *apic)
static void restart_apic_timer(struct kvm_lapic *apic) static void restart_apic_timer(struct kvm_lapic *apic)
{ {
preempt_disable(); preempt_disable();
if (!apic_lvtt_period(apic) && atomic_read(&apic->lapic_timer.pending))
goto out;
if (!start_hv_timer(apic)) if (!start_hv_timer(apic))
start_sw_timer(apic); start_sw_timer(apic);
out:
preempt_enable(); preempt_enable();
} }
......
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