diff mbox

[1/8] migration-local: add pipe protocol for QEMUFileOps

Message ID 1380119568-5530-2-git-send-email-lilei@linux.vnet.ibm.com
State New
Headers show

Commit Message

Lei Li Sept. 25, 2013, 2:32 p.m. UTC
This patch adds QEMUFileOps with pipe protocol, will be used to
transmit RAM for localhost migration. The source process would put
buffer, correspondingly the destination process would get buffer.
The read side of the pipe file descriptor would be passed to destination
process via SCM_RIGHTS.

Signed-off-by: Lei Li <lilei@linux.vnet.ibm.com>
---
 Makefile.target   |    1 +
 migration-local.c |  114 +++++++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 115 insertions(+), 0 deletions(-)
 create mode 100644 migration-local.c
diff mbox

Patch

diff --git a/Makefile.target b/Makefile.target
index 9a49852..ae66fef 100644
--- a/Makefile.target
+++ b/Makefile.target
@@ -121,6 +121,7 @@  obj-$(CONFIG_KVM) += kvm-all.o
 obj-y += memory.o savevm.o cputlb.o
 obj-y += memory_mapping.o
 obj-y += dump.o
+obj-y += migration-local.o
 LIBS+=$(libs_softmmu)
 
 # xen support
diff --git a/migration-local.c b/migration-local.c
new file mode 100644
index 0000000..1fb62b6
--- /dev/null
+++ b/migration-local.c
@@ -0,0 +1,114 @@ 
+/*
+ * QEMU localhost live migration
+ *
+ * Copyright IBM, Corp. 2013
+ *
+ * Authors:
+ *   Lei Li   <lilei@linux.vnet.ibm.com>
+ *
+ * This work is licensed under the terms of the GNU GPL, version 2.  See
+ * the COPYING file in the top-level directory.
+ *
+ */
+
+#include "config-host.h"
+#include "qemu-common.h"
+#include "migration/migration.h"
+#include "exec/cpu-common.h"
+#include "config.h"
+#include "exec/cpu-all.h"
+#include "monitor/monitor.h"
+#include "migration/qemu-file.h"
+#include "qemu/iov.h"
+#include "sysemu/arch_init.h"
+#include "sysemu/sysemu.h"
+#include "block/block.h"
+#include "qemu/sockets.h"
+#include "migration/block.h"
+#include "qemu/thread.h"
+#include "qmp-commands.h"
+#include "trace.h"
+#include "qemu/osdep.h"
+
+//#define DEBUG_MIGRATION_LOCAL
+
+#ifdef DEBUG_MIGRATION_LOCAL
+#define DPRINTF(fmt, ...) \
+    do { printf("migration-local: " fmt, ## __VA_ARGS__); } while (0)
+#else
+#define DPRINTF(fmt, ...) \
+    do { } while (0)
+#endif
+
+typedef struct QEMUFilePipe {
+    QEMUFile *file;
+    int pipefd;
+} QEMUFilePipe;
+
+
+static int qemu_local_get_fd(void *opaque)
+{
+    QEMUFilePipe *s = opaque;
+
+    return s->pipefd;
+}
+
+static int qemu_local_get_buffer(void *opaque, uint8_t *buf,
+                                 int64_t pos, int size)
+{
+    QEMUFilePipe *s = opaque;
+    ssize_t len;
+
+    for (;;) {
+        errno = 0;
+
+        len = read(s->pipefd, buf, size);
+        if (len != -1) {
+            break;
+        }
+
+        if (errno == EAGAIN) {
+            yield_until_fd_readable(s->pipefd);
+        } else if (errno != EINTR) {
+            break;
+        }
+    }
+
+    return len;
+}
+
+static int qemu_local_put_buffer(void *opaque, const uint8_t *buf,
+                                 int64_t pos, int size)
+{
+    QEMUFilePipe *s = opaque;
+    ssize_t len;
+
+    len = write(s->pipefd, buf, size);
+    if (len < size) {
+        len = -1;
+    }
+
+    return len;
+}
+
+static int qemu_local_close(void *opaque)
+{
+    QEMUFilePipe *s = opaque;
+
+    close(s->pipefd);
+    g_free(s);
+
+    return 0;
+}
+
+static const QEMUFileOps pipe_read_ops = {
+    .get_fd     = qemu_local_get_fd,
+    .get_buffer = qemu_local_get_buffer,
+    .close      = qemu_local_close
+};
+
+static const QEMUFileOps pipe_write_ops = {
+    .put_buffer = qemu_local_put_buffer,
+    //.save_page  = qemu_local_save_ram,
+    .close      = qemu_local_close
+};