Commit 82a4da79 authored by Paolo Bonzini's avatar Paolo Bonzini

migration: move process_incoming_migration to a coroutine

The final part of incoming migration, which now consists of
process_incoming_migration for all protocols, is thus made non-blocking.
Reviewed-by: default avatarOrit Wasserman <>
Signed-off-by: default avatarPaolo Bonzini <>
parent 595ab641
......@@ -83,11 +83,13 @@ void qemu_start_incoming_migration(const char *uri, Error **errp)
void process_incoming_migration(QEMUFile *f)
static void process_incoming_migration_co(void *opaque)
QEMUFile *f = opaque;
int ret;
ret = qemu_loadvm_state(f);
qemu_set_fd_handler(qemu_get_fd(f), NULL, NULL, NULL);
if (ret < 0) {
fprintf(stderr, "load of migration failed\n");
......@@ -107,6 +109,23 @@ void process_incoming_migration(QEMUFile *f)
static void enter_migration_coroutine(void *opaque)
Coroutine *co = opaque;
qemu_coroutine_enter(co, NULL);
void process_incoming_migration(QEMUFile *f)
Coroutine *co = qemu_coroutine_create(process_incoming_migration_co);
int fd = qemu_get_fd(f);
assert(fd != -1);
qemu_set_fd_handler(fd, enter_migration_coroutine, NULL, co);
qemu_coroutine_enter(co, f);
/* amount of nanoseconds we are willing to wait for migration to be down.
* the choice of nanoseconds is because it is the maximum resolution that
* get_clock() can achieve. It is an internal measure. All user-visible
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment