On Thu, 2021-12-23 at 21:24 +0000, Sean Christopherson wrote: > Commit e880c6ea55b9 ("KVM: x86: hyper-v: Prevent using not-yet-updated TSC page > by secondary CPUs") is squarely to blame as it was added after dirty ring, though > in Vitaly's defense, David put it best: "That's a fairly awful bear trap". Even with the WARN to keep us honest, this is still awful. We have kvm_vcpu_write_guest()... but the vcpu we pass it is ignored and only vcpu->kvm is used. But you have to be running on a physical CPU which currently owns *a* vCPU of that KVM, or you might crash. There is also kvm_write_guest() which doesn't take a vCPU as an argument, and looks for all the world like it was designed for you not to need one... but which still needs there to be a vCPU or it might crash. I think I want to kill the latter, make the former use the vCPU it's given, add a spinlock to the dirty ring which will be uncontended anyway in the common case so it shouldn't hurt (?), and then let people use kvm->vcpu[0] when they really need to, with a documented caveat that when there are *no* vCPUs in a KVM, dirty tracking might not work. Which is fine, as migration of a KVM that hasn't been fully set up yet is silly.