On 05/06/19 12:09, Wanpeng Li wrote: > +static void apic_timer_expired_pi(struct kvm_lapic *apic) > +{ > + struct kvm_timer *ktimer = &apic->lapic_timer; > + > + kvm_apic_local_deliver(apic, APIC_LVTT); > + if (apic_lvtt_tscdeadline(apic)) > + ktimer->tscdeadline = 0; > + if (apic_lvtt_oneshot(apic)) { > + ktimer->tscdeadline = 0; > + ktimer->target_expiration = 0; > + } > +} Please rename this function to kvm_apic_inject_pending_timer_irqs and call it from kvm_inject_apic_timer_irqs. Then apic_timer_expired can just do if (atomic_read(&apic->lapic_timer.pending)) return; + if (unlikely(posted_interrupt_inject_timer(apic->vcpu))) { + kvm_apic_inject_pending_timer_irqs(apic); + return; + } etc. Paolo