On Thu, 2020-09-24 at 15:43 +0200, Paolo Bonzini wrote: > On 17/08/20 21:40, Oliver Upton wrote: > > > If you don't have time to work on it I can try to find some for 5.10, > > > but I'm not sure exactly when. > > > > Shouldn't be an issue, I'll futz around with some changes to the > > series and send them out in the coming weeks. > > Ok, after looking more at the code with Maxim I can confidently say that > it's a total mess. And a lot of the synchronization code is dead > because 1) as far as we could see no guest synchronizes the TSC using > MSR_IA32_TSC; and 2) writing to MSR_IA32_TSC_ADJUST does not trigger the > synchronization code in kvm_write_tsc. > > Your patch works not by some sort of miracle, but rather because it > bypasses the mess and that's the smart thing to do. > > The plan is now as follows: > > 1) guest-initiated MSR_IA32_TSC write never goes through the sync > heuristics. I'll shortly send a patch for this, and it will fix the > testcase issue > > 2) to have a new KVM_X86_DISABLE_QUIRKS value, that will toggle between > "magic" and "vanilla" semantics for host-initiated TSC and TSC_ADJUST writes > > 3) if the quirk is present we still want existing userspace to work so: > > - host-initiated MSR_IA32_TSC write always returns the L1 TSC as in > Maxim's recent patch. They will also always go through the sync heuristics. > > - host-initiated MSR_IA32_TSC_ADJUST write don't make the TSC jump, they > only write to vcpu->arch.ia32_tsc_adjust_msr (as in the current kernel) > > 4) if the quirk is disabled however: > > - the sync heuristics are never used except in kvm_arch_vcpu_postcreate > > - host-initiated MSR_IA32_TSC and MSR_IA32_TSC_ADJUST accesses work like > in the guest: reads of MSR_IA32_TSC return the "right" TSC, writes of > MSR_IA32_TSC_ADJUST writes make the TSC jump. > > - for live migration, userspace is expected to use the new > KVM_GET/SET_TSC_PRECISE (or whatever the name will be) to get/set a > (nanosecond, TSC, TSC_ADJUST) tuple. The sync heuristics will be > bypassed and it will just set the right value for the MSRs. Setting > MSR_IA32_TSC_ADJUST is optional and controlled by a flag in the struct, > and the flag will be set by KVM_GET_TSC_PRECISE based on the guest CPUID. > > Paolo > I'll soon implement this. Best regards, Maxim Levitsky