@@ -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)
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 <lilei@linux.vnet.ibm.com> --- migration-unix.c | 34 +++++++++++++++++++++++++++++++--- 1 files changed, 31 insertions(+), 3 deletions(-)