On 3/16/22 05:53, Oliver Upton wrote:
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).
A few more things that have to be changed:
1. Invoke the KVM_GET_CLOCK ioctl to record the host TSC (tsc_src),
kvmclock nanoseconds (guest_src), and host CLOCK_REALTIME nanoseconds
(host_src).
One of two changes:
a) Add "Multiply tsc_src by guest_freq / src_freq to obtain
scaled_tsc_src", add a new device attribute for the host TSC frequency.
b) Add "Multiply tsc_src by src_ratio to obtain scaled_tsc_src", add a
new device attribute for the guest_frequency/host_frequency ratio.
A third would be scaling the host TSC frequency in KVM_GETCLOCK, but
that's confusing IMO.
3. Invoke the KVM_GET_TSC_KHZ ioctl to record the frequency of the
guest's TSC (freq).
Replace freq with guest_freq.
6. 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:
ofs_dst[i] = ofs_src[i] -
(guest_src - guest_dest) * freq +
(tsc_src - tsc_dest)
Replace freq with guest_freq.
Replace tsc_src with scaled_tsc_src; replace tsc_dest with tsc_dest *
guest_freq / dest_freq.
("ofs[i] + tsc - guest * freq" is the guest TSC value corresponding to
Replace with "ofs[i] + tsc * guest_freq / host_freq - guest *
guest_freq", or "ofs[i] + tsc * ratio - guest * guest_freq".
Paolo