From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([208.118.235.92]:51570) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1TF6fp-0000De-1u for qemu-devel@nongnu.org; Fri, 21 Sep 2012 13:05:57 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1TF6fn-0000Cy-U3 for qemu-devel@nongnu.org; Fri, 21 Sep 2012 13:05:52 -0400 Received: from mail-pb0-f45.google.com ([209.85.160.45]:43020) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1TF6fn-0008KE-Jo for qemu-devel@nongnu.org; Fri, 21 Sep 2012 13:05:51 -0400 Received: by mail-pb0-f45.google.com with SMTP id rp12so8110795pbb.4 for ; Fri, 21 Sep 2012 10:05:51 -0700 (PDT) Sender: Paolo Bonzini From: Paolo Bonzini Date: Fri, 21 Sep 2012 19:05:06 +0200 Message-Id: <1348247106-27936-10-git-send-email-pbonzini@redhat.com> In-Reply-To: <1348247106-27936-1-git-send-email-pbonzini@redhat.com> References: <1348247106-27936-1-git-send-email-pbonzini@redhat.com> Subject: [Qemu-devel] [PATCH 9/9] migration: move process_incoming_migration to a coroutine List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: quintela@redhat.com The final part of incoming migration, which now consists of process_incoming_migration for all protocols, is thus made non-blocking. Signed-off-by: Paolo Bonzini --- migration.c | 21 ++++++++++++++++++++- 1 file modificato, 20 inserzioni(+). 1 rimozione(-) diff --git a/migration.c b/migration.c index 2bc4bac..66390bb 100644 --- a/migration.c +++ b/migration.c @@ -86,11 +86,13 @@ int qemu_start_incoming_migration(const char *uri, Error **errp) return ret; } -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"); @@ -110,6 +112,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 -- 1.7.12