On Mon, 2022-03-21 at 13:36 +0100, Paolo Bonzini wrote: > On 3/21/22 01:51, Oliver Upton wrote: > > > > > > Right now we have guestTSCOffset as a vCPU attribute, we have guestTOD > > > returned by KVM_GET_CLOCK, and we plan to have hostTSCFreq in sysfs. It's a > > > bit mix-and-match, but it's already a 5-tuple that the destination can use. > > > What's missing is a ioctl on the destination side that relieves userspace > > > from having to do the math. > > That ioctl will work fine, but userspace needs to accept all the > > nastiness that ensues. If it yanks the guest too hard into the future > > it'll need to pick up the pieces when the guest kernel panics. > > It can do that before issuing the ioctl, by comparing the source and > destination TOD, can't it? That's how we do it. We currently take the *really* naïve approach of just letting each vCPU thread serialize its own vCPU's TSC with the other MSRs, which means they're slightly out of sync. Then we calculate the TOD delta when resuming on the destination, and add the corresponding number of nanoseconds to the KVM clock, and ticks to each vCPU's MSR. When each vCPU thread then *restores* its vCPU's MSRs, the 'within a second of the last sync" bit kicks in and they are all synchronized properly. There's definitely a bit of slop there; I don't think we even use the KVM_CLOCK_REALTIME flag when setting the guest's KVM clock. But those are fixable by having a single ioctl which handles the 3-tuple of { TOD, KVM clock, TSC } at a single instance in time, I think?
Attachment:
smime.p7s
Description: S/MIME cryptographic signature