Commit f9927982 authored by Sean Christopherson's avatar Sean Christopherson Committed by Paolo Bonzini

KVM: lapic: Refactor ->set_hv_timer to use an explicit expired param

Refactor kvm_x86_ops->set_hv_timer to use an explicit parameter for
stating that the timer has expired.  Overloading the return value is
unnecessarily clever, e.g. can lead to confusion over the proper return
value from start_hv_timer() when r==1.

Cc: Wanpeng Li <wanpengli@tencent.com>
Cc: Liran Alon <liran.alon@oracle.com>
Signed-off-by: default avatarSean Christopherson <sean.j.christopherson@intel.com>
Signed-off-by: default avatarPaolo Bonzini <pbonzini@redhat.com>
parent f1ba5cfb
...@@ -1168,7 +1168,8 @@ struct kvm_x86_ops { ...@@ -1168,7 +1168,8 @@ struct kvm_x86_ops {
uint32_t guest_irq, bool set); uint32_t guest_irq, bool set);
void (*apicv_post_state_restore)(struct kvm_vcpu *vcpu); void (*apicv_post_state_restore)(struct kvm_vcpu *vcpu);
int (*set_hv_timer)(struct kvm_vcpu *vcpu, u64 guest_deadline_tsc); int (*set_hv_timer)(struct kvm_vcpu *vcpu, u64 guest_deadline_tsc,
bool *expired);
void (*cancel_hv_timer)(struct kvm_vcpu *vcpu); void (*cancel_hv_timer)(struct kvm_vcpu *vcpu);
void (*setup_mce)(struct kvm_vcpu *vcpu); void (*setup_mce)(struct kvm_vcpu *vcpu);
......
...@@ -1673,7 +1673,8 @@ static void cancel_hv_timer(struct kvm_lapic *apic) ...@@ -1673,7 +1673,8 @@ static void cancel_hv_timer(struct kvm_lapic *apic)
static bool start_hv_timer(struct kvm_lapic *apic) static bool start_hv_timer(struct kvm_lapic *apic)
{ {
struct kvm_timer *ktimer = &apic->lapic_timer; struct kvm_timer *ktimer = &apic->lapic_timer;
int r; struct kvm_vcpu *vcpu = apic->vcpu;
bool expired;
WARN_ON(preemptible()); WARN_ON(preemptible());
if (!kvm_x86_ops->set_hv_timer) if (!kvm_x86_ops->set_hv_timer)
...@@ -1685,8 +1686,7 @@ static bool start_hv_timer(struct kvm_lapic *apic) ...@@ -1685,8 +1686,7 @@ static bool start_hv_timer(struct kvm_lapic *apic)
if (!ktimer->tscdeadline) if (!ktimer->tscdeadline)
return false; return false;
r = kvm_x86_ops->set_hv_timer(apic->vcpu, ktimer->tscdeadline); if (kvm_x86_ops->set_hv_timer(vcpu, ktimer->tscdeadline, &expired))
if (r < 0)
return false; return false;
ktimer->hv_timer_in_use = true; ktimer->hv_timer_in_use = true;
...@@ -1704,13 +1704,13 @@ static bool start_hv_timer(struct kvm_lapic *apic) ...@@ -1704,13 +1704,13 @@ static bool start_hv_timer(struct kvm_lapic *apic)
*/ */
if (atomic_read(&ktimer->pending)) { if (atomic_read(&ktimer->pending)) {
cancel_hv_timer(apic); cancel_hv_timer(apic);
} else if (r) { } else if (expired) {
apic_timer_expired(apic); apic_timer_expired(apic);
cancel_hv_timer(apic); cancel_hv_timer(apic);
} }
} }
trace_kvm_hv_timer_state(apic->vcpu->vcpu_id, ktimer->hv_timer_in_use); trace_kvm_hv_timer_state(vcpu->vcpu_id, ktimer->hv_timer_in_use);
return true; return true;
} }
......
...@@ -7041,7 +7041,8 @@ static inline int u64_shl_div_u64(u64 a, unsigned int shift, ...@@ -7041,7 +7041,8 @@ static inline int u64_shl_div_u64(u64 a, unsigned int shift,
return 0; return 0;
} }
static int vmx_set_hv_timer(struct kvm_vcpu *vcpu, u64 guest_deadline_tsc) static int vmx_set_hv_timer(struct kvm_vcpu *vcpu, u64 guest_deadline_tsc,
bool *expired)
{ {
struct vcpu_vmx *vmx; struct vcpu_vmx *vmx;
u64 tscl, guest_tscl, delta_tsc, lapic_timer_advance_cycles; u64 tscl, guest_tscl, delta_tsc, lapic_timer_advance_cycles;
...@@ -7078,7 +7079,8 @@ static int vmx_set_hv_timer(struct kvm_vcpu *vcpu, u64 guest_deadline_tsc) ...@@ -7078,7 +7079,8 @@ static int vmx_set_hv_timer(struct kvm_vcpu *vcpu, u64 guest_deadline_tsc)
return -ERANGE; return -ERANGE;
vmx->hv_deadline_tsc = tscl + delta_tsc; vmx->hv_deadline_tsc = tscl + delta_tsc;
return delta_tsc == 0; *expired = !delta_tsc;
return 0;
} }
static void vmx_cancel_hv_timer(struct kvm_vcpu *vcpu) static void vmx_cancel_hv_timer(struct kvm_vcpu *vcpu)
......
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