On 05/07/19 15:11, Wanpeng Li wrote: > On 7/5/19 8:40 PM, Paolo Bonzini wrote: > >> On 21/06/19 11:40, Wanpeng Li wrote: >>> From: Wanpeng Li <wanpengli@xxxxxxxxxxx> >>> >>> already-expired timer interrupt can be injected to guest when vCPU who >>> arms the lapic timer re-vmentry, don't posted inject in this case. >>> >>> Cc: Paolo Bonzini <pbonzini@xxxxxxxxxx> >>> Cc: Radim Krčmář <rkrcmar@xxxxxxxxxx> >>> Cc: Marcelo Tosatti <mtosatti@xxxxxxxxxx> >>> Signed-off-by: Wanpeng Li <wanpengli@xxxxxxxxxxx> >>> --- >>> arch/x86/kvm/lapic.c | 14 +++++++------- >>> 1 file changed, 7 insertions(+), 7 deletions(-) >>> >>> diff --git a/arch/x86/kvm/lapic.c b/arch/x86/kvm/lapic.c >>> index ae575c0..7cd95ea 100644 >>> --- a/arch/x86/kvm/lapic.c >>> +++ b/arch/x86/kvm/lapic.c >>> @@ -1452,7 +1452,7 @@ static void kvm_apic_inject_pending_timer_irqs(struct kvm_lapic *apic) >>> } >>> } >>> >>> -static void apic_timer_expired(struct kvm_lapic *apic) >>> +static void apic_timer_expired(struct kvm_lapic *apic, bool can_pi_inject) >>> { >>> struct kvm_vcpu *vcpu = apic->vcpu; >>> struct swait_queue_head *q = &vcpu->wq; >>> @@ -1464,7 +1464,7 @@ static void apic_timer_expired(struct kvm_lapic *apic) >>> if (apic_lvtt_tscdeadline(apic) || ktimer->hv_timer_in_use) >>> ktimer->expired_tscdeadline = ktimer->tscdeadline; >>> >>> - if (posted_interrupt_inject_timer(apic->vcpu)) { >>> + if (can_pi_inject && posted_interrupt_inject_timer(apic->vcpu)) { >> Perhaps it should use a posted interrupt if kvm_arch_should_kick(vcpu), >> i.e. just add kvm_arch_vcpu_should_kick(apic->vcpu) to >> posted_interrupt_inject_timer? > > So do you mean not nohz_full setup? An external interrupt is incurred > here and preemption timer is better. No, I mean instead of adding can_pi_inject, just test kvm_arch_should_kick in posted_interrupt_inject_timer, skipping the PI if the vCPU is not running. Instead just go down the normal path and the guest will get the interrupt by checking the timer-pending flag. Paolo