• Z
    KVM: Leave TSC synchronization window open with each new sync · 4dd7980b
    Zachary Amsden 提交于
    Currently, when the TSC is written by the guest, the variable
    ns is updated to force the current write to appear to have taken
    place at the time of the first write in this sync phase.  This
    leaves a cliff at the end of the match window where updates will
    fall of the end.  There are two scenarios where this can be a
    problem in practe - first, on a system with a large number of
    VCPUs, the sync period may last for an extended period of time.
    
    The second way this can happen is if the VM reboots very rapidly
    and we catch a VCPU TSC synchronization just around the edge.
    We may be unaware of the reboot, and thus the first VCPU might
    synchronize with an old set of the timer (at, say 0.97 seconds
    ago, when first powered on).  The second VCPU can come in 0.04
    seconds later to try to synchronize, but it misses the window
    because it is just over the threshold.
    
    Instead, stop doing this artificial setback of the ns variable
    and just update it with every write of the TSC.
    
    It may be observed that doing so causes values computed by
    compute_guest_tsc to diverge slightly across CPUs - note that
    the last_tsc_ns and last_tsc_write variable are used here, and
    now they last_tsc_ns will be different for each VCPU, reflecting
    the actual time of the update.
    
    However, compute_guest_tsc is used only for guests which already
    have TSC stability issues, and further, note that the previous
    patch has caused last_tsc_write to be incremented by the difference
    in nanoseconds, converted back into guest cycles.  As such, only
    boundary rounding errors should be visible, which given the
    resolution in nanoseconds, is going to only be a few cycles and
    only visible in cross-CPU consistency tests.  The problem can be
    fixed by adding a new set of variables to track the start offset
    and start write value for the current sync cycle.
    Signed-off-by: NZachary Amsden <zamsden@gmail.com>
    Signed-off-by: NMarcelo Tosatti <mtosatti@redhat.com>
    Signed-off-by: NAvi Kivity <avi@redhat.com>
    4dd7980b
x86.c 158.2 KB