Message ID | 1560770687-23227-6-git-send-email-wanpengli@tencent.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | KVM: LAPIC: Implement Exitless Timer | expand |
2019-06-17 19:24+0800, Wanpeng Li: > From: Wanpeng Li <wanpengli@tencent.com> > > Wait before calling posted-interrupt deliver function directly to add > advance timer support to pi_inject_timer. > > Cc: Paolo Bonzini <pbonzini@redhat.com> > Cc: Radim Krčmář <rkrcmar@redhat.com> > Cc: Marcelo Tosatti <mtosatti@redhat.com> > Signed-off-by: Wanpeng Li <wanpengli@tencent.com> > --- Please merge this patch with [2/5], so bisection doesn't break. > 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? (I think it would be best to take the functional core of kvm_wait_lapic_expire() and make it into a function that takes the expired_tscdeadline as an argument.) Thanks.
On Tue, 18 Jun 2019 at 05:32, Radim Krčmář <rkrcmar@redhat.com> wrote: > > 2019-06-17 19:24+0800, Wanpeng Li: > > From: Wanpeng Li <wanpengli@tencent.com> > > > > Wait before calling posted-interrupt deliver function directly to add > > advance timer support to pi_inject_timer. > > > > Cc: Paolo Bonzini <pbonzini@redhat.com> > > Cc: Radim Krčmář <rkrcmar@redhat.com> > > Cc: Marcelo Tosatti <mtosatti@redhat.com> > > Signed-off-by: Wanpeng Li <wanpengli@tencent.com> > > --- > > 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. Regards, Wanpeng Li
On Tue, 18 Jun 2019 at 08:44, Wanpeng Li <kernellwp@gmail.com> wrote: > > On Tue, 18 Jun 2019 at 05:32, Radim Krčmář <rkrcmar@redhat.com> wrote: > > > > 2019-06-17 19:24+0800, Wanpeng Li: > > > From: Wanpeng Li <wanpengli@tencent.com> > > > > > > Wait before calling posted-interrupt deliver function directly to add > > > advance timer support to pi_inject_timer. > > > > > > Cc: Paolo Bonzini <pbonzini@redhat.com> > > > Cc: Radim Krčmář <rkrcmar@redhat.com> > > > Cc: Marcelo Tosatti <mtosatti@redhat.com> > > > Signed-off-by: Wanpeng Li <wanpengli@tencent.com> > > > --- > > > > 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; } /*
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); kvm_apic_inject_pending_timer_irqs(apic); return; } @@ -1553,7 +1555,7 @@ static inline void adjust_lapic_timer_advance(struct kvm_vcpu *vcpu, apic->lapic_timer.timer_advance_ns = timer_advance_ns; } -void kvm_wait_lapic_expire(struct kvm_vcpu *vcpu) +void kvm_wait_lapic_expire(struct kvm_vcpu *vcpu, bool pi_inject) { struct kvm_lapic *apic = vcpu->arch.apic; u64 guest_tsc, tsc_deadline; @@ -1561,7 +1563,7 @@ void kvm_wait_lapic_expire(struct kvm_vcpu *vcpu) if (apic->lapic_timer.expired_tscdeadline == 0) return; - if (!lapic_timer_int_injected(vcpu)) + if (!lapic_timer_int_injected(vcpu) && !pi_inject) return; tsc_deadline = apic->lapic_timer.expired_tscdeadline; diff --git a/arch/x86/kvm/lapic.h b/arch/x86/kvm/lapic.h index e41936b..3d8a043 100644 --- a/arch/x86/kvm/lapic.h +++ b/arch/x86/kvm/lapic.h @@ -225,7 +225,7 @@ static inline int kvm_lapic_latched_init(struct kvm_vcpu *vcpu) bool kvm_apic_pending_eoi(struct kvm_vcpu *vcpu, int vector); -void kvm_wait_lapic_expire(struct kvm_vcpu *vcpu); +void kvm_wait_lapic_expire(struct kvm_vcpu *vcpu, bool pi_inject); bool kvm_intr_is_single_vcpu_fast(struct kvm *kvm, struct kvm_lapic_irq *irq, struct kvm_vcpu **dest_vcpu); diff --git a/arch/x86/kvm/svm.c b/arch/x86/kvm/svm.c index bbc31f7..7e65de4 100644 --- a/arch/x86/kvm/svm.c +++ b/arch/x86/kvm/svm.c @@ -5648,7 +5648,7 @@ static void svm_vcpu_run(struct kvm_vcpu *vcpu) if (lapic_in_kernel(vcpu) && vcpu->arch.apic->lapic_timer.timer_advance_ns) - kvm_wait_lapic_expire(vcpu); + kvm_wait_lapic_expire(vcpu, false); /* * If this vCPU has touched SPEC_CTRL, restore the guest's value if diff --git a/arch/x86/kvm/vmx/vmx.c b/arch/x86/kvm/vmx/vmx.c index f45c51e..718a3ad 100644 --- a/arch/x86/kvm/vmx/vmx.c +++ b/arch/x86/kvm/vmx/vmx.c @@ -6462,7 +6462,7 @@ static void vmx_vcpu_run(struct kvm_vcpu *vcpu) if (lapic_in_kernel(vcpu) && vcpu->arch.apic->lapic_timer.timer_advance_ns) - kvm_wait_lapic_expire(vcpu); + kvm_wait_lapic_expire(vcpu, false); /* * If this vCPU has touched SPEC_CTRL, restore the guest's value if