All of lore.kernel.org
 help / color / mirror / Atom feed
From: Sean Christopherson <sean.j.christopherson@intel.com>
To: Paolo Bonzini <pbonzini@redhat.com>
Cc: "Radim Krčmář" <rkrcmar@redhat.com>,
	kvm@vger.kernel.org, "Liran Alon" <liran.alon@oracle.com>,
	"Wanpeng Li" <wanpengli@tencent.com>
Subject: Re: [PATCH v3 1/9] KVM: lapic: Hard cap the auto-calculated timer advancement
Date: Wed, 17 Apr 2019 07:34:26 -0700	[thread overview]
Message-ID: <20190417143426.GB8567@linux.intel.com> (raw)
In-Reply-To: <62b9be92-303f-d740-180f-7c7bbc95c98d@redhat.com>

On Wed, Apr 17, 2019 at 02:57:55PM +0200, Paolo Bonzini wrote:
> On 16/04/19 22:32, Sean Christopherson wrote:
> > To minimize the latency of timer interrupts as observed by the guest,
> > KVM adjusts the values it programs into the host timers to account for
> > the host's overhead of programming and handling the timer event.  Now
> > that the timer advancement is automatically tuned during runtime, it's
> > effectively unbounded by default, e.g. if KVM is running as L1 the
> > advancement can measure in hundreds of milliseconds.
> > 
> > Place a somewhat arbitrary hard cap of 5000ns on the auto-calculated
> > advancement, as large advancements can break reasonable assumptions of
> > the guest, e.g. that a timer configured to fire after 1ms won't arrive
> > on the next instruction.  Although KVM busy waits to mitigate the timer
> > event arriving too early, complications can arise when shifting the
> > interrupt too far, e.g. vmx.flat/interrupt in kvm-unit-tests will fail
> > when its "host" exits on interrupts (because the INTR is injected before
> > the gets executes STI+HLT).  Arguably the unit test is "broken" in the
> > sense that delaying the timer interrupt by 1ms doesn't technically
> > guarantee the interrupt will arrive after STI+HLT, but it's a reasonable
> > assumption that KVM should support.
> > 
> > Furthermore, an unbounded advancement also effectively unbounds the time
> > spent busy waiting, e.g. if the guest programs a timer with a very large
> > delay.
> > 
> > Arguably the advancement logic could simply be disabled when running as
> > L1, but KVM needs to bound the advancement time regardless, e.g. if the
> > TSC is unstable and the calculations get wildly out of whack.  And
> > allowing the advancement when running as L1 is a good stress test of
> > sorts for the logic.
> > 
> > Cc: Liran Alon <liran.alon@oracle.com>
> > Cc: Wanpeng Li <wanpengli@tencent.com>
> > Fixes: 3b8a5df6c4dc6 ("KVM: LAPIC: Tune lapic_timer_advance_ns automatically")
> > Signed-off-by: Sean Christopherson <sean.j.christopherson@intel.com>
> > ---
> >  arch/x86/kvm/lapic.c | 5 +++++
> >  1 file changed, 5 insertions(+)
> > 
> > diff --git a/arch/x86/kvm/lapic.c b/arch/x86/kvm/lapic.c
> > index 9bf70cf84564..92446cba9b24 100644
> > --- a/arch/x86/kvm/lapic.c
> > +++ b/arch/x86/kvm/lapic.c
> > @@ -74,6 +74,7 @@ static bool lapic_timer_advance_adjust_done = false;
> >  #define LAPIC_TIMER_ADVANCE_ADJUST_DONE 100
> >  /* step-by-step approximation to mitigate fluctuation */
> >  #define LAPIC_TIMER_ADVANCE_ADJUST_STEP 8
> > +#define LAPIC_TIMER_ADVANCE_MAX_NS	5000
> >  
> >  static inline int apic_test_vector(int vec, void *bitmap)
> >  {
> > @@ -1522,6 +1523,10 @@ void wait_lapic_expire(struct kvm_vcpu *vcpu)
> >  		}
> >  		if (abs(guest_tsc - tsc_deadline) < LAPIC_TIMER_ADVANCE_ADJUST_DONE)
> >  			lapic_timer_advance_adjust_done = true;
> > +		if (unlikely(lapic_timer_advance_ns > LAPIC_TIMER_ADVANCE_MAX_NS)) {
> > +			lapic_timer_advance_ns = LAPIC_TIMER_ADVANCE_MAX_NS;
> > +			lapic_timer_advance_adjust_done = true;
> > +		}
> 
> I would treat this case as "advancing the timer has failed miserably"
> and reset lapic_timer_advance_ns to 0.

As in, disable the feature, correct?  That works for me.

  reply	other threads:[~2019-04-17 14:34 UTC|newest]

Thread overview: 20+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-04-16 20:32 [PATCH v3 0/9] KVM: lapic: Fix a variety of timer adv issues Sean Christopherson
2019-04-16 20:32 ` [PATCH v3 1/9] KVM: lapic: Hard cap the auto-calculated timer advancement Sean Christopherson
2019-04-17 12:57   ` Paolo Bonzini
2019-04-17 14:34     ` Sean Christopherson [this message]
2019-04-17 15:00       ` Paolo Bonzini
2019-04-16 20:32 ` [PATCH v3 2/9] KVM: lapic: Convert guest TSC to host time domain when delaying Sean Christopherson
2019-04-17 12:56   ` Paolo Bonzini
2019-04-17 14:33     ` Sean Christopherson
2019-04-17 15:05       ` Paolo Bonzini
2019-04-16 20:32 ` [PATCH v3 3/9] KVM: lapic: Track lapic timer advance per vCPU Sean Christopherson
2019-04-16 20:32 ` [PATCH v3 4/9] KVM: lapic: Allow user to disable auto-tuning of timer advancement Sean Christopherson
2019-04-17 12:59   ` Paolo Bonzini
2019-04-17 15:22     ` Sean Christopherson
2019-04-16 20:32 ` [PATCH v3 5/9] KVM: lapic: Busy wait for timer to expire when using hv_timer Sean Christopherson
2019-04-16 20:32 ` [PATCH v3 6/9] KVM: lapic: Explicitly cancel the hv timer if it's pre-expired Sean Christopherson
2019-04-16 20:32 ` [PATCH v3 7/9] KVM: lapic: Refactor ->set_hv_timer to use an explicit expired param Sean Christopherson
2019-04-17 13:02   ` Paolo Bonzini
2019-04-16 20:32 ` [PATCH v3 8/9] KVM: lapic: Check for a pending timer intr prior to start_hv_timer() Sean Christopherson
2019-04-16 20:32 ` [PATCH v3 9/9] KVM: VMX: Skip delta_tsc shift-and-divide if the dividend is zero Sean Christopherson
2019-04-17 13:06 ` [PATCH v3 0/9] KVM: lapic: Fix a variety of timer adv issues Paolo Bonzini

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20190417143426.GB8567@linux.intel.com \
    --to=sean.j.christopherson@intel.com \
    --cc=kvm@vger.kernel.org \
    --cc=liran.alon@oracle.com \
    --cc=pbonzini@redhat.com \
    --cc=rkrcmar@redhat.com \
    --cc=wanpengli@tencent.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.