mirror of https://github.com/proxmox/mirror_qemu
migration/postcopy: ensure preempt channel is ready before loading states
Before loading the guest states, ensure that the preempt channel has been ready to use, as some of the states (e.g. via virtio_load) might trigger page faults that will be handled through the preempt channel. So yield to the main thread in the case that the channel create event hasn't been dispatched. Cc: qemu-stable <qemu-stable@nongnu.org> Fixes:9358982744
("migration: Send requested page directly in rp-return thread") Originally-by: Lei Wang <lei4.wang@intel.com> Link: https://lore.kernel.org/all/9aa5d1be-7801-40dd-83fd-f7e041ced249@intel.com/T/ Signed-off-by: Lei Wang <lei4.wang@intel.com> Signed-off-by: Wei Wang <wei.w.wang@intel.com> Link: https://lore.kernel.org/r/20240405034056.23933-1-wei.w.wang@intel.com [peterx: add a todo section, add Fixes and copy stable for 8.0+] Signed-off-by: Peter Xu <peterx@redhat.com> (cherry picked from commit7afbdada7e
) Signed-off-by: Michael Tokarev <mjt@tls.msk.ru>
parent
46f03be3ed
commit
6983d1657d
|
@ -2343,6 +2343,27 @@ static int loadvm_handle_cmd_packaged(MigrationIncomingState *mis)
|
|||
|
||||
QEMUFile *packf = qemu_file_new_input(QIO_CHANNEL(bioc));
|
||||
|
||||
/*
|
||||
* Before loading the guest states, ensure that the preempt channel has
|
||||
* been ready to use, as some of the states (e.g. via virtio_load) might
|
||||
* trigger page faults that will be handled through the preempt channel.
|
||||
* So yield to the main thread in the case that the channel create event
|
||||
* hasn't been dispatched.
|
||||
*
|
||||
* TODO: if we can move migration loadvm out of main thread, then we
|
||||
* won't block main thread from polling the accept() fds. We can drop
|
||||
* this as a whole when that is done.
|
||||
*/
|
||||
do {
|
||||
if (!migrate_postcopy_preempt() || !qemu_in_coroutine() ||
|
||||
mis->postcopy_qemufile_dst) {
|
||||
break;
|
||||
}
|
||||
|
||||
aio_co_schedule(qemu_get_current_aio_context(), qemu_coroutine_self());
|
||||
qemu_coroutine_yield();
|
||||
} while (1);
|
||||
|
||||
ret = qemu_loadvm_state_main(packf, mis);
|
||||
trace_loadvm_handle_cmd_packaged_main(ret);
|
||||
qemu_fclose(packf);
|
||||
|
|
Loading…
Reference in New Issue