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