aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorUri Lublin <uril@qumranet.com>2007-02-22 18:53:38 +0000
committerUri Lublin <uril@qumranet.com>2007-02-22 18:53:38 +0000
commit8514a1b456601a477da1efa20fd3b1ef0cd29131 (patch)
tree45ac805320df39450d264aab64334a2579dc2b5c
parentc505ba0b1a1b6da4ee611bb28bde1e97f9db4ab6 (diff)
kvm migration: add support for kvm live migration.
cpu_physical_memory_set_dirty_tracking() now enables/disables kvm's dirty-pages-logging Using kvm_update_dirty_pages_log() all dirty pages are logged in qemu's dirty pages bytemap, and all those pages are retransmitted. Also added 'return 0' to start_migration if everything is OK.
-rw-r--r--migration.c14
1 files changed, 13 insertions, 1 deletions
diff --git a/migration.c b/migration.c
index be7bedacb..1d916d5b6 100644
--- a/migration.c
+++ b/migration.c
@@ -24,6 +24,9 @@
#include "vl.h"
#include "qemu_socket.h"
+#ifdef USE_KVM
+#include "qemu-kvm.h"
+#endif
#include <sys/wait.h>
@@ -181,6 +184,11 @@ static void migrate_write(void *opaque)
if (migrate_write_buffer(s))
return;
+#ifdef USE_KVM
+ if (kvm_allowed && !*s->has_error)
+ *s->has_error = kvm_update_dirty_pages_log();
+#endif
+
if (migrate_check_convergence(s) || *s->has_error) {
qemu_del_timer(s->timer);
qemu_free_timer(s->timer);
@@ -262,7 +270,10 @@ static int start_migration(MigrationState *s)
cpu_physical_memory_set_dirty(addr);
}
- cpu_physical_memory_set_dirty_tracking(1);
+ if (cpu_physical_memory_set_dirty_tracking(1)) {
+ *s->has_error = 16;
+ return -1;
+ }
s->addr = 0;
s->iteration = 0;
@@ -273,6 +284,7 @@ static int start_migration(MigrationState *s)
qemu_mod_timer(s->timer, qemu_get_clock(rt_clock));
qemu_set_fd_handler2(s->fd, NULL, NULL, migrate_write, s);
+ return 0;
}
static MigrationState *migration_init_fd(int detach, int fd)