Skip to content

Commit

Permalink
migration/postcopy: ensure preempt channel is ready before loading st…
Browse files Browse the repository at this point in the history
…ates

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: 9358982 ("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>
  • Loading branch information
wei-w-wang authored and xzpeter committed Apr 7, 2024
1 parent ce64e62 commit 7afbdad
Showing 1 changed file with 21 additions and 0 deletions.
21 changes: 21 additions & 0 deletions migration/savevm.c
Original file line number Diff line number Diff line change
Expand Up @@ -2342,6 +2342,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);
Expand Down

0 comments on commit 7afbdad

Please sign in to comment.