migration/colo.c: Use cpu_synchronize_all_states()

cpu_synchronize_all_pre_loadvm() marks all vcpus as dirty, so the
registers are loaded from CPUState before we continue running
the vm. However if we failover during checkpoint, CPUState is not
initialized and the registers are loaded with garbage. This causes
guest hangs and crashes.

Fix this by using cpu_synchronize_all_states(), which initializes
CPUState from the current cpu registers additionally to marking
the vcpus as dirty.

Signed-off-by: Lukas Straub <lukasstraub2@web.de>
Message-Id: <9675031ce557b73ebd10e7bd20ebbf57f30b177c.1589193382.git.lukasstraub2@web.de>
Reviewed-by: Dr. David Alan Gilbert <dgilbert@redhat.com>

Signed-off-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
This commit is contained in:
Lukas Straub 2020-05-11 13:10:48 +02:00 committed by Dr. David Alan Gilbert
parent bb70b66ed7
commit 786d8b8e38

View File

@ -705,7 +705,7 @@ static void colo_incoming_process_checkpoint(MigrationIncomingState *mis,
} }
qemu_mutex_lock_iothread(); qemu_mutex_lock_iothread();
cpu_synchronize_all_pre_loadvm(); cpu_synchronize_all_states();
ret = qemu_loadvm_state_main(mis->from_src_file, mis); ret = qemu_loadvm_state_main(mis->from_src_file, mis);
qemu_mutex_unlock_iothread(); qemu_mutex_unlock_iothread();