Skip to content
  • Sean Christopherson's avatar
    KVM: lapic: Allow user to disable adaptive tuning of timer advancement · c3941d9e
    Sean Christopherson authored
    
    
    The introduction of adaptive tuning of lapic timer advancement did not
    allow for the scenario where userspace would want to disable adaptive
    tuning but still employ timer advancement, e.g. for testing purposes or
    to handle a use case where adaptive tuning is unable to settle on a
    suitable time.  This is epecially pertinent now that KVM places a hard
    threshold on the maximum advancment time.
    
    Rework the timer semantics to accept signed values, with a value of '-1'
    being interpreted as "use adaptive tuning with KVM's internal default",
    and any other value being used as an explicit advancement time, e.g. a
    time of '0' effectively disables advancement.
    
    Note, this does not completely restore the original behavior of
    lapic_timer_advance_ns.  Prior to tracking the advancement per vCPU,
    which is necessary to support autotuning, userspace could adjust
    lapic_timer_advance_ns for *running* vCPU.  With per-vCPU tracking, the
    module params are snapshotted at vCPU creation, i.e. applying a new
    advancement effectively requires restarting a VM.
    
    Dynamically updating a running vCPU is possible, e.g. a helper could be
    added to retrieve the desired delay, choosing between the global module
    param and the per-VCPU value depending on whether or not auto-tuning is
    (globally) enabled, but introduces a great deal of complexity.  The
    wrapper itself is not complex, but understanding and documenting the
    effects of dynamically toggling auto-tuning and/or adjusting the timer
    advancement is nigh impossible since the behavior would be dependent on
    KVM's implementation as well as compiler optimizations.  In other words,
    providing stable behavior would require extremely careful consideration
    now and in the future.
    
    Given that the expected use of a manually-tuned timer advancement is to
    "tune once, run many", use the vastly simpler approach of recognizing
    changes to the module params only when creating a new vCPU.
    
    Cc: Liran Alon <liran.alon@oracle.com>
    Cc: Wanpeng Li <wanpengli@tencent.com>
    Reviewed-by: default avatarLiran Alon <liran.alon@oracle.com>
    Cc: stable@vger.kernel.org
    Fixes: 3b8a5df6
    
     ("KVM: LAPIC: Tune lapic_timer_advance_ns automatically")
    Signed-off-by: default avatarSean Christopherson <sean.j.christopherson@intel.com>
    Signed-off-by: default avatarPaolo Bonzini <pbonzini@redhat.com>
    c3941d9e