[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH 08/17] migration-local: override save_page for page
From: |
Lei Li |
Subject: |
[Qemu-devel] [PATCH 08/17] migration-local: override save_page for page transmit |
Date: |
Fri, 29 Nov 2013 18:06:15 +0800 |
This patch implements save_page callback for the outside
of page flipping. It will write the address of the page
on the Unix socket and flip the page data on pipe by
vmsplice(). Every page address would have a header flag
RAM_SAVE_FLAG_HOOK, which will trigger the load hook to
receive it in incoming side as well.
Signed-off-by: Lei Li <address@hidden>
---
migration-local.c | 63 +++++++++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 63 insertions(+), 0 deletions(-)
diff --git a/migration-local.c b/migration-local.c
index f479530..0a41c69 100644
--- a/migration-local.c
+++ b/migration-local.c
@@ -116,6 +116,68 @@ static int qemu_local_close(void *opaque)
return 0;
}
+static int send_pipefd(int sockfd, int pipefd);
+
+static size_t qemu_local_save_ram(QEMUFile *f, void *opaque,
+ MemoryRegion *mr, ram_addr_t offset,
+ size_t size, int *bytes_sent)
+{
+ QEMUFileLocal *s = opaque;
+ ram_addr_t current_addr = mr->ram_addr + offset;
+ void *ram_addr;
+ ssize_t ret;
+
+ if (s->unix_page_flipping) {
+ qemu_put_be64(s->file, current_addr | RAM_SAVE_FLAG_HOOK);
+ qemu_fflush(s->file);
+
+ if (!s->pipefd_passed) {
+ ret = send_pipefd(s->sockfd, s->pipefd[0]);
+ if (ret < 0) {
+ fprintf(stderr, "failed to pass PIPE\n");
+ return ret;
+ }
+ s->pipefd_passed = true;
+ }
+
+ ram_addr = memory_region_get_ram_ptr(mr) + offset;
+
+ /* vmsplice page data to pipe */
+ struct iovec iov = {
+ .iov_base = ram_addr,
+ .iov_len = size,
+ };
+
+ /*
+ * The flag SPLICE_F_MOVE is introduced in kernel for the page
+ * flipping feature in QEMU, which will movie pages rather than
+ * copying, previously unused.
+ *
+ * If a move is not possible the kernel will transparently falls
+ * back to copying data.
+ *
+ * For older kernels the SPLICE_F_MOVE would be ignored and a copy
+ * would occur.
+ */
+
+ ret = vmsplice(s->pipefd[1], &iov, 1, SPLICE_F_GIFT | SPLICE_F_MOVE);
+ if (ret == -1) {
+ if (errno != EAGAIN && errno != EINTR) {
+ fprintf(stderr, "vmsplice save error: %s\n", strerror(errno));
+ return ret;
+ }
+ } else {
+ if (bytes_sent) {
+ *bytes_sent = 1;
+ }
+ DPRINTF("block_offset: %lu, offset: %lu\n", mr->ram_addr, offset);
+ return 0;
+ }
+ }
+
+ return RAM_SAVE_CONTROL_NOT_SUPP;
+}
+
static const QEMUFileOps pipe_read_ops = {
.get_fd = qemu_local_get_sockfd,
.get_buffer = qemu_local_get_buffer,
@@ -126,6 +188,7 @@ static const QEMUFileOps pipe_write_ops = {
.get_fd = qemu_local_get_sockfd,
.writev_buffer = qemu_local_writev_buffer,
.close = qemu_local_close,
+ .save_page = qemu_local_save_ram
};
QEMUFile *qemu_fopen_socket_local(int sockfd, const char *mode)
--
1.7.7.6
- [Qemu-devel] [PATCH 0/17 v4] Localhost migration with side channel for ram, Lei Li, 2013/11/29
- [Qemu-devel] [PATCH 01/17] QAPI: introduce migration capability unix_page_flipping, Lei Li, 2013/11/29
- [Qemu-devel] [PATCH 03/17] qmp-command.hx: add missing docs for migration capabilites, Lei Li, 2013/11/29
- [Qemu-devel] [PATCH 02/17] migration: add migrate_unix_page_flipping(), Lei Li, 2013/11/29
- [Qemu-devel] [PATCH 04/17] migration-local: add QEMUFileLocal with socket based QEMUFile, Lei Li, 2013/11/29
- [Qemu-devel] [PATCH 05/17] migration-local: introduce qemu_fopen_socket_local(), Lei Li, 2013/11/29
- [Qemu-devel] [PATCH 06/17] migration-local: add send_pipefd(), Lei Li, 2013/11/29
- [Qemu-devel] [PATCH 07/17] save_page: replace block_offset with a MemoryRegion, Lei Li, 2013/11/29
- [Qemu-devel] [PATCH 08/17] migration-local: override save_page for page transmit,
Lei Li <=
- [Qemu-devel] [PATCH 09/17] savevm: adjust ram_control_save_page for page flipping, Lei Li, 2013/11/29
- [Qemu-devel] [PATCH 10/17] add unix_msgfd_lookup() to callback get_buffer, Lei Li, 2013/11/29
- [Qemu-devel] [PATCH 11/17] add argument ram_addr_t to hook_ram_load, Lei Li, 2013/11/29
- [Qemu-devel] [PATCH 12/17] migration-local: override hook_ram_load, Lei Li, 2013/11/29
- [Qemu-devel] [PATCH 13/17] migration-unix: replace qemu_fopen_socket with qemu_fopen_socket_local, Lei Li, 2013/11/29
- [Qemu-devel] [PATCH 14/17] add new RanState RAN_STATE_MEMORY_STALE, Lei Li, 2013/11/29
- [Qemu-devel] [PATCH 15/17] migration-unix: page flipping support on unix outgoing, Lei Li, 2013/11/29
- [Qemu-devel] [PATCH 16/17] migration: adjust migration_thread() process for page flipping, Lei Li, 2013/11/29
- [Qemu-devel] [PATCH 17/17] hmp: better format for info migrate_capabilities, Lei Li, 2013/11/29
- Re: [Qemu-devel] [PATCH 0/17 v4] Localhost migration with side channel for ram, Paolo Bonzini, 2013/11/29