All,
Attached is a fairly simple patch to the migration code to make it handle
errors better. In particular, if the remote side wasn't set up properly (i.e.
the memory size didn't match), the migration would fail, but the source host
didn't actually react properly, so the migration would still be "in-progress".
This patch fixes up the error checking to properly quit when the remote side
isn't prepared for whatever reason.
Signed-off-by: Chris Lalancette <[EMAIL PROTECTED]>
diff --git a/qemu/migration.c b/qemu/migration.c
index 17ad77c..ae95128 100644
--- a/qemu/migration.c
+++ b/qemu/migration.c
@@ -86,6 +86,7 @@ enum { /* migration status values */
MIG_STAT_SAVEVM_FAILED = 15,
MIG_STAT_NO_MEM = 16,
+ MIG_STAT_DIRTY_TRACK_FAIL = 17,
MIG_STAT_MIGRATION_CANCEL = 20,
@@ -425,18 +426,26 @@ static int start_migration(MigrationState *s)
#endif
r = MIG_STAT_WRITE_FAILED;
- if (write_whole_buffer(s->fd, &running, sizeof(running)))
+ if (write_whole_buffer(s->fd, &running, sizeof(running))) {
+ perror("vm_running write failed");
goto out;
- if (write_whole_buffer(s->fd, &value, sizeof(value)))
+ }
+ if (write_whole_buffer(s->fd, &value, sizeof(value))) {
+ perror("phys_ram_size write failed");
goto out;
+ }
#ifdef USE_KVM
if (kvm_allowed) {
value = cpu_to_be32(n);
- if (write_whole_buffer(s->fd, &value, sizeof(value)))
+ if (write_whole_buffer(s->fd, &value, sizeof(value))) {
+ perror("phys_ram_size_bitmap size write failed");
goto out;
- if (write_whole_buffer(s->fd, phys_ram_page_exist_bitmap, n))
+ }
+ if (write_whole_buffer(s->fd, phys_ram_page_exist_bitmap, n)) {
+ perror("phys_ram_page_exist_bitmap write failed");
goto out;
+ }
}
#endif
fcntl(s->fd, F_SETFL, O_NONBLOCK);
@@ -456,7 +465,8 @@ static int start_migration(MigrationState *s)
if (cpu_physical_memory_set_dirty_tracking(1)) {
*s->has_error = MIG_STAT_KVM_SET_DIRTY_TRACKING_FAILED;
- return -1;
+ r = MIG_STAT_DIRTY_TRACK_FAIL;
+ goto out;
}
s->addr = 0;
@@ -470,6 +480,8 @@ 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);
+ r = 0;
+
out:
#ifdef USE_KVM
if (phys_ram_page_exist_bitmap)
@@ -498,8 +510,9 @@ static MigrationState *migration_init_fd(int detach, int fd)
current_migration = s;
- if (start_migration(s) == -1) {
+ if (start_migration(s)) {
term_printf("Could not start migration\n");
+ migrate_close(s);
return NULL;
}
-------------------------------------------------------------------------
This SF.net email is sponsored by: Microsoft
Defy all challenges. Microsoft(R) Visual Studio 2008.
http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/
_______________________________________________
kvm-devel mailing list
kvm-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/kvm-devel