W dniu 2014-07-18 11:37, Paolo Bonzini pisze:
Il 18/07/2014 11:32, Marcin Gibuła ha scritto:
3) the next CPU entry will call kvm_arch_put_registers:
if (cpu->kvm_vcpu_dirty) {
kvm_arch_put_registers(cpu, KVM_PUT_RUNTIME_STATE);
cpu->kvm_vcpu_dirty = false;
}
But, I don't set cpu->kvm_vcpu_dirty anywhere (?).
Yeah, the next CPU entry will *not* call kvm_arch_put_registers with
your change. It will call it with vanilla cpu_synchronize_all_states().
That's because in kvmclock, it's used only to read cpu registers, not
edit them.
Now, because making this call "invisible" makes it work, I'm speculating
that following happens:
[migration starts]
kvmclock: calls cpu_synchronize_all_states()
somewhere in qemu: completes IO
somewhere in qemu: calls cpu_synchronize_all_states() <- old state
Is it (or something similar) possible? I didn't dig deep enough into
internals yet, but perhaps you could point if thats the right direction?
--
mg