• Radim Krčmář's avatar
    KVM: x86: update master clock before computing kvmclock_offset · 0bc48bea
    Radim Krčmář authored
    kvm master clock usually has a different frequency than the kernel boot
    clock.  This is not a problem until the master clock is updated;
    update uses the current kernel boot clock to compute new kvm clock,
    which erases any kvm clock cycles that might have built up due to
    frequency difference over a long period.
    
    KVM_SET_CLOCK is one of places where we can safely update master clock
    as the guest-visible clock is going to be shifted anyway.
    
    The problem with current code is that it updates the kvm master clock
    after updating the offset.  If the master clock was enabled before
    calling KVM_SET_CLOCK, then it might have built up a significant delta
    from kernel boot clock.
    In the worst case, the time set by userspace would be shifted by so much
    that it couldn't have been set at any point during KVM_SET_CLOCK.
    
    To fix this, move kvm_gen_update_masterclock() before computing
    kvmclock_offset, which means that the master clock and kernel boot clock
    will be sufficiently close together.
    Another solution would be to replace get_kvmclock_ns() with
    "ktime_get_boot_ns() + ka->kvmclock_offset", which is marginally more
    accurate, but would break symmetry with KVM_GET_CLOCK.
    Signed-off-by: default avatarRadim Krčmář <rkrcmar@redhat.com>
    0bc48bea
x86.c 223 KB