• Roman Kagan's avatar
    x86: kvm: hyperv: don't retry message delivery for periodic timers · 7deec5e0
    Roman Kagan authored
    The SynIC message delivery protocol allows the message originator to
    request, should the message slot be busy, to be notified when it's free.
    
    However, this is unnecessary and even undesirable for messages generated
    by SynIC timers in periodic mode: if the period is short enough compared
    to the time the guest spends in the timer interrupt handler, so the
    timer ticks start piling up, the excessive interactions due to this
    notification and retried message delivery only makes the things worse.
    
    [This was observed, in particular, with Windows L2 guests setting
    (temporarily) the periodic timer to 2 kHz, and spending hundreds of
    microseconds in the timer interrupt handler due to several L2->L1 exits;
    under some load in L0 this could exceed 500 us so the timer ticks
    started to pile up and the guest livelocked.]
    
    Relieve the situation somewhat by not retrying message delivery for
    periodic SynIC timers.  This appears to remain within the "lazy" lost
    ticks policy for SynIC timers as implemented in KVM.
    
    Note that it doesn't solve the fundamental problem of livelocking the
    guest with a periodic timer whose period is smaller than the time needed
    to process a tick, but it makes it a bit less likely to be triggered.
    Signed-off-by: default avatarRoman Kagan <rkagan@virtuozzo.com>
    Signed-off-by: default avatarPaolo Bonzini <pbonzini@redhat.com>
    7deec5e0
hyperv.c 45.7 KB