qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Qemu-devel] [PATCH 16/18] migration-local: implementation of incoming p


From: Lei Li
Subject: [Qemu-devel] [PATCH 16/18] migration-local: implementation of incoming part
Date: Wed, 21 Aug 2013 15:18:53 +0800

Implementation of incoming part of localhost migration.

Signed-off-by: Lei Li <address@hidden>
---
 include/migration/migration.h |    2 +
 include/migration/qemu-file.h |    8 ++--
 migration-local.c             |   99 +++++++++++++++++++++++++++++++++++++++++
 3 files changed, 105 insertions(+), 4 deletions(-)

diff --git a/include/migration/migration.h b/include/migration/migration.h
index a04f050..232f1d5 100644
--- a/include/migration/migration.h
+++ b/include/migration/migration.h
@@ -94,6 +94,8 @@ void rdma_start_incoming_migration(const char *host_port, 
Error **errp);
 
 void local_start_outgoing_migration(void *opaque, const char *uri, Error 
**errp);
 
+void local_start_incoming_migration(const char *uri, Error **errp);
+
 void migrate_fd_error(MigrationState *s);
 
 void migrate_fd_connect(MigrationState *s);
diff --git a/include/migration/qemu-file.h b/include/migration/qemu-file.h
index 0f757fb..a34d418 100644
--- a/include/migration/qemu-file.h
+++ b/include/migration/qemu-file.h
@@ -77,10 +77,10 @@ typedef int (QEMURamHookFunc)(QEMUFile *f, void *opaque, 
uint64_t flags);
  * is saved (such as RDMA, for example.)
  */
 typedef size_t (QEMURamSaveFunc)(QEMUFile *f, void *opaque,
-                               ram_addr_t block_offset,
-                               ram_addr_t offset,
-                               size_t size,
-                               int *bytes_sent);
+                                 ram_addr_t block_offset,
+                                 ram_addr_t offset,
+                                 size_t size,
+                                 int *bytes_sent);
 
 typedef struct QEMUFileOps {
     QEMUFilePutBufferFunc *put_buffer;
diff --git a/migration-local.c b/migration-local.c
index cf4a091..501371a 100644
--- a/migration-local.c
+++ b/migration-local.c
@@ -294,3 +294,102 @@ fail:
     g_free(local);
     migrate_fd_error(s);
 }
+
+
+/**********************************************************************
+ * Incoming part
+ */
+
+static void unix_accept_local_incoming(void *opaque)
+{
+    struct sockaddr_un addr;
+    socklen_t addrlen = sizeof(addr);
+    int s = (intptr_t)opaque;
+    QEMUFile *f;
+    int c;
+
+    do {
+        c = qemu_accept(s, (struct sockaddr *)&addr, &addrlen);
+    } while (c == -1 && errno == EINTR);
+
+    qemu_set_fd_handler2(s, NULL, NULL, NULL, NULL);
+    close(s);
+
+    DPRINTF("accepted migration\n");
+
+    if (c == -1) {
+        fprintf(stderr, "could not accept migration connection\n");
+        goto out;
+    }
+
+    f = qemu_fopen_local(c, "rb");
+    if (f == NULL) {
+        fprintf(stderr, "could not qemu_fopen socket\n");
+        goto out;
+    }
+
+    start_local_incoming_migration(f);
+
+    return;
+
+out:
+    close(c);
+}
+
+static void unix_local_incoming_connect(const char *path, Error **errp)
+{
+    int ret;
+
+    ret = unix_listen(path, NULL, 0, errp);
+    if (ret < 0) {
+        return;
+    }
+
+    qemu_set_fd_handler2(ret, NULL, unix_accept_local_incoming, NULL,
+                         (void *)(intptr_t)ret);
+}
+void local_start_incoming_migration(const char *uri, Error **errp)
+{
+    QEMUFileLocal *s = g_malloc0(sizeof(*s));
+    Error *local_err = NULL;
+
+    DPRINTF("Starting local incoming migration\n");
+
+    if (uri) {
+        unix_local_incoming_connect(uri, errp);
+    } else {
+        goto err;
+    }
+
+    DPRINTF("unix_listen success\n");
+
+    return;
+
+err:
+    error_propagate(errp, local_err);
+    g_free(s);
+}
+
+static void start_local_incoming_migration(QEMUFile *f)
+{
+    int ret;
+
+    ret = qemu_loadvm_state(f);
+    if (ret < 0) {
+        fprintf(stderr, "load of migration failed\n");
+        exit(EXIT_FAILURE);
+    }
+    qemu_announce_self();
+
+    DPRINTF("successfully loaded vm state\n");
+
+    bdrv_clear_incoming_migration_all();
+    /* Make sure all file formats flush their mutable metadata */
+    bdrv_invalidate_cache_all();
+
+    if (autostart) {
+        vm_start();
+    } else {
+        runstate_set(RUN_STATE_PAUSED);
+    }
+}
-- 
1.7.7.6




reply via email to

[Prev in Thread] Current Thread [Next in Thread]