The VMM has control of both the guest's TSC scale and offset. Extend the described migration algorithm in the KVM_VCPU_TSC_OFFSET documentation to cover TSC scaling. Reported-by: David Woodhouse <dwmw@xxxxxxxxxxxx> Signed-off-by: Oliver Upton <oupton@xxxxxxxxxx> --- Applies to kvm/queue (references KVM_{GET,SET}_TSC_KHZ on a VM fd). Parent commit: 2ca1ba339ed8 ("KVM: x86: Test case for TSC scaling and offset sync") Documentation/virt/kvm/devices/vcpu.rst | 26 ++++++++++++++++--------- 1 file changed, 17 insertions(+), 9 deletions(-) diff --git a/Documentation/virt/kvm/devices/vcpu.rst b/Documentation/virt/kvm/devices/vcpu.rst index 60a29972d3f1..85199e9b7f8d 100644 --- a/Documentation/virt/kvm/devices/vcpu.rst +++ b/Documentation/virt/kvm/devices/vcpu.rst @@ -180,13 +180,18 @@ Returns: ======= ====================================== Specifies the guest's TSC offset relative to the host's TSC. The guest's -TSC is then derived by the following equation: +TSC is then derived by the following equation where tsc_scale is the +ratio between the VM and host TSC frequencies: - guest_tsc = host_tsc + KVM_VCPU_TSC_OFFSET + guest_tsc = (host_tsc * tsc_scale) + KVM_VCPU_TSC_OFFSET -This attribute is useful to adjust the guest's TSC on live migration, -so that the TSC counts the time during which the VM was paused. The -following describes a possible algorithm to use for this purpose. +The VM's TSC frequency is configured with the KVM_{GET,SET}_TSC_KHZ +vCPU or VM ioctls. + +The KVM_VCPU_TSC_OFFSET attribute is useful to adjust the guest's TSC +on live migration, so that the TSC counts the time during which the VM +was paused. The following describes a possible algorithm to use for this +purpose. From the source VMM process: @@ -202,7 +207,10 @@ From the source VMM process: From the destination VMM process: -4. Invoke the KVM_SET_CLOCK ioctl, providing the source nanoseconds from +4. Invoke the KVM_SET_TSC_KHZ ioctl to set the guest TSC frequency to + the value recorded in step 3 (freq). + +5. Invoke the KVM_SET_CLOCK ioctl, providing the source nanoseconds from kvmclock (guest_src) and CLOCK_REALTIME (host_src) in their respective fields. Ensure that the KVM_CLOCK_REALTIME flag is set in the provided structure. @@ -214,10 +222,10 @@ From the destination VMM process: between the source pausing the VMs and the destination executing steps 4-7. -5. Invoke the KVM_GET_CLOCK ioctl to record the host TSC (tsc_dest) and +6. Invoke the KVM_GET_CLOCK ioctl to record the host TSC (tsc_dest) and kvmclock nanoseconds (guest_dest). -6. Adjust the guest TSC offsets for every vCPU to account for (1) time +7. Adjust the guest TSC offsets for every vCPU to account for (1) time elapsed since recording state and (2) difference in TSCs between the source and destination machine: @@ -229,5 +237,5 @@ From the destination VMM process: a time of 0 in kvmclock. The above formula ensures that it is the same on the destination as it was on the source). -7. Write the KVM_VCPU_TSC_OFFSET attribute for every vCPU with the +8. Write the KVM_VCPU_TSC_OFFSET attribute for every vCPU with the respective value derived in the previous step. -- 2.35.1.723.g4982287a31-goog