This patch adds side channel support on the outgoing of unix
migration. It will create a pipe and pass the read pipe fd to
destination process by send_pipefd(). If the pipe fd was passed
successfully, the qemu_fopen_pipe will be called with write mode
to send RAM to the write pipe fd.
 
Signed-off-by: Lei Li <li...@linux.vnet.ibm.com>
---
 migration-unix.c |   34 +++++++++++++++++++++++++++++++---
 1 files changed, 31 insertions(+), 3 deletions(-)

diff --git a/migration-unix.c b/migration-unix.c
index 651fc5b..0bfc1c7 100644
--- a/migration-unix.c
+++ b/migration-unix.c
@@ -33,16 +33,44 @@
 static void unix_wait_for_connect(int fd, void *opaque)
 {
     MigrationState *s = opaque;
+    int pipefd[2];
 
     if (fd < 0) {
         DPRINTF("migrate connect error\n");
-        s->file = NULL;
-        migrate_fd_error(s);
+        goto fail;
     } else {
         DPRINTF("migrate connect success\n");
-        s->file = qemu_fopen_socket(fd, "wb");
+
+        if (s->enabled_capabilities[MIGRATION_CAPABILITY_UNIX_PAGE_FLIPPING]) {
+            if (pipe(pipefd) < 0) {
+                DPRINTF("qemu_fopen_pipe: %s", strerror(errno));
+                goto fail;
+            }
+
+            /* Send pipefd[0] to destination QEMU process */
+            if (send_pipefd(fd, pipefd[0]) < 0) {
+                DPRINTF("failed to pass pipe\n");
+                goto fail;
+            }
+
+            s->file = qemu_fopen_pipe(pipefd[1], "w");
+        } else {
+            s->file = qemu_fopen_socket(fd, "wb");
+        }
+
+        if (s->file == NULL) {
+            DPRINTF("failed to open migration target");
+            migrate_fd_error(s);
+            return;
+        }
+
         migrate_fd_connect(s);
+        return;
     }
+
+fail:
+    s->file = NULL;
+    migrate_fd_error(s);
 }
 
 void unix_start_outgoing_migration(MigrationState *s, const char *path, Error 
**errp)
-- 
1.7.7.6


Reply via email to