On 21/04/20 13:20, Wanpeng Li wrote: > + > + if (!vmx->req_immediate_exit && > + !unlikely(vmx->loaded_vmcs->hv_timer_soft_disabled)) { > + if (!vmx_interrupt_allowed(vcpu) || > + !apic_lvtt_tscdeadline(apic) || > + vmx->rmode.vm86_active || > + is_smm(vcpu) || > + !kvm_apic_hw_enabled(apic)) > + return EXIT_FASTPATH_NONE; > + > + if (!apic->lapic_timer.hv_timer_in_use) > + return EXIT_FASTPATH_CONT_RUN; > + > + WARN_ON(swait_active(&vcpu->wq)); > + vmx_cancel_hv_timer(vcpu); > + apic->lapic_timer.hv_timer_in_use = false; > + > + if (atomic_read(&apic->lapic_timer.pending)) > + return EXIT_FASTPATH_CONT_RUN; > + > + ktimer->expired_tscdeadline = ktimer->tscdeadline; > + vmx_fast_deliver_interrupt(vcpu); > + ktimer->tscdeadline = 0; > + return EXIT_FASTPATH_CONT_RUN; > + } > + Can you explain all the checks you have here, and why you need something more complex than apic_timer_expired (possibly by adding some optimizations to kvm_apic_local_deliver)? This code is impossible to maintain. Paolo