diff options
author | Paolo Bonzini <pbonzini@redhat.com> | 2012-08-07 10:57:43 +0200 |
---|---|---|
committer | Paolo Bonzini <pbonzini@redhat.com> | 2012-11-02 18:35:08 +0100 |
commit | 82a4da79fd6c108400637143f8439c2364bdb21e (patch) | |
tree | e8528462bef4f46d827e3f7a05bff546c447e85c /migration.c | |
parent | 595ab64169be9063d64c3b1aa1c249fbe2662221 (diff) |
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: Orit Wasserman <owasserm@redhat.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
Diffstat (limited to 'migration.c')
-rw-r--r-- | migration.c | 21 |
1 files changed, 20 insertions, 1 deletions
diff --git a/migration.c b/migration.c index 2741d979fc..73ce170ddf 100644 --- a/migration.c +++ b/migration.c @@ -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); qemu_fclose(f); 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); + socket_set_nonblock(fd); + 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 |