qemu-devel
[Top][All Lists]
Advanced

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

[Qemu-devel] [PATCH 1/8] migration-local: add pipe protocol for QEMUFile


From: Lei Li
Subject: [Qemu-devel] [PATCH 1/8] migration-local: add pipe protocol for QEMUFileOps
Date: Wed, 25 Sep 2013 22:32:41 +0800

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 <address@hidden>
---
 Makefile.target   |    1 +
 migration-local.c |  114 +++++++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 115 insertions(+), 0 deletions(-)
 create mode 100644 migration-local.c

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   <address@hidden>
+ *
+ * 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
+};
-- 
1.7.7.6




reply via email to

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