2017-07-25 15:25 GMT+08:00 Paolo Bonzini <pbonzini@xxxxxxxxxx>: > On 25/07/2017 00:43, Wanpeng Li wrote: >> - WARN_ON(!apic->lapic_timer.hv_timer_in_use); >> + preempt_disable(); >> + /* The preempt notifier has called apic_timer_expired already */ >> + if (!apic->lapic_timer.hv_timer_in_use) >> + goto out; >> WARN_ON(swait_active(&vcpu->wq)); >> cancel_hv_timer(apic); >> apic_timer_expired(apic); >> +out: >> + preempt_enable(); > > If apic_timer_expired was called, and the timer is in periodic mode, it > has already set the hv timer. Should the out label be really at the end > of the function, after the timer is restarted? Otherwise you can call > advance_periodic_timer_expiration twice. I just send out v4 to fix it. Thanks for the review. Regards, Wanpeng Li > > Thanks, > > Paolo > >> >> if (apic_lvtt_period(apic) && apic->lapic_timer.period) { >> advance_periodic_target_expiration(apic); >> @@ -1582,9 +1588,11 @@ void kvm_lapic_switch_to_sw_timer(struct kvm_vcpu *vcpu) >> { >> struct kvm_lapic *apic = vcpu->arch.apic; >> >> + preempt_disable(); >> /* Possibly the TSC deadline timer is not enabled yet */ >> if (apic->lapic_timer.hv_timer_in_use) >> start_sw_timer(apic); >> + preempt_enable(); >> } >> EXPORT_SYMBOL_GPL(kvm_lapic_switch_to_sw_timer); >