On Tue, 18 Jun 2019 at 08:44, Wanpeng Li <kernellwp@xxxxxxxxx> wrote: > > On Tue, 18 Jun 2019 at 05:32, Radim Krčmář <rkrcmar@xxxxxxxxxx> wrote: > > > > 2019-06-17 19:24+0800, Wanpeng Li: > > > From: Wanpeng Li <wanpengli@xxxxxxxxxxx> > > > > > > Wait before calling posted-interrupt deliver function directly to add > > > advance timer support to pi_inject_timer. > > > > > > Cc: Paolo Bonzini <pbonzini@xxxxxxxxxx> > > > Cc: Radim Krčmář <rkrcmar@xxxxxxxxxx> > > > Cc: Marcelo Tosatti <mtosatti@xxxxxxxxxx> > > > Signed-off-by: Wanpeng Li <wanpengli@xxxxxxxxxxx> > > > --- > > > > Please merge this patch with [2/5], so bisection doesn't break. > > Agreed. > > > > > > arch/x86/kvm/lapic.c | 6 ++++-- > > > arch/x86/kvm/lapic.h | 2 +- > > > arch/x86/kvm/svm.c | 2 +- > > > arch/x86/kvm/vmx/vmx.c | 2 +- > > > 4 files changed, 7 insertions(+), 5 deletions(-) > > > > > > diff --git a/arch/x86/kvm/lapic.c b/arch/x86/kvm/lapic.c > > > index 1a31389..1a31ba5 100644 > > > --- a/arch/x86/kvm/lapic.c > > > +++ b/arch/x86/kvm/lapic.c > > > @@ -1462,6 +1462,8 @@ static void apic_timer_expired(struct kvm_lapic *apic, bool can_pi_inject) > > > return; > > > > > > if (can_pi_inject && posted_interrupt_inject_timer(apic->vcpu)) { > > > + if (apic->lapic_timer.timer_advance_ns) > > > + kvm_wait_lapic_expire(vcpu, true); > > > > From where does kvm_wait_lapic_expire() take > > apic->lapic_timer.expired_tscdeadline? > > Sorry, I failed to understand this. > https://git.kernel.org/pub/scm/virt/kvm/kvm.git/tree/arch/x86/kvm/lapic.c?h=queue#n1541 > We can get apic->lapic_timer.expired_tscdeadline in > kvm_wait_lapic_expire() directly. Oh, miss the latest expired_tscdeadline, how about something like below? diff --git a/arch/x86/kvm/lapic.c b/arch/x86/kvm/lapic.c index 1a31ba5..7cd95ea 100644 --- a/arch/x86/kvm/lapic.c +++ b/arch/x86/kvm/lapic.c @@ -1461,6 +1461,9 @@ static void apic_timer_expired(struct kvm_lapic *apic, bool can_pi_inject) if (atomic_read(&apic->lapic_timer.pending)) return; + if (apic_lvtt_tscdeadline(apic) || ktimer->hv_timer_in_use) + ktimer->expired_tscdeadline = ktimer->tscdeadline; + if (can_pi_inject && posted_interrupt_inject_timer(apic->vcpu)) { if (apic->lapic_timer.timer_advance_ns) kvm_wait_lapic_expire(vcpu, true); @@ -1477,9 +1480,6 @@ static void apic_timer_expired(struct kvm_lapic *apic, bool can_pi_inject) */ if (swait_active(q)) swake_up_one(q); - - if (apic_lvtt_tscdeadline(apic) || ktimer->hv_timer_in_use) - ktimer->expired_tscdeadline = ktimer->tscdeadline; } /*