aboutsummaryrefslogtreecommitdiff
path: root/migration
diff options
context:
space:
mode:
authorPeter Xu <peterx@redhat.com>2018-07-10 17:18:54 +0800
committerDr. David Alan Gilbert <dgilbert@redhat.com>2018-07-10 12:56:07 +0100
commitfd037a656aca23dc3c47aa8c9de261bec6b8aad0 (patch)
tree89bb2c422334e3e1262e68f9cbf562ecfcd80429 /migration
parent1aa8367861645c3c0917f585fe14b1b6b23b0f66 (diff)
downloadqemu-fd037a656aca23dc3c47aa8c9de261bec6b8aad0.zip
qemu-fd037a656aca23dc3c47aa8c9de261bec6b8aad0.tar.gz
qemu-fd037a656aca23dc3c47aa8c9de261bec6b8aad0.tar.bz2
migration: loosen recovery check when load vm
We were checking against -EIO, assuming that it will cover all IO failures. But actually it is not. One example is that in qemu_loadvm_section_start_full() we can have tons of places that will return -EINVAL even if the error is caused by IO failures on the network. Let's loosen the recovery check logic here to cover all the error cases happened by removing the explicit check against -EIO. After all we won't lose anything here if any other failure happened. Reviewed-by: Dr. David Alan Gilbert <dgilbert@redhat.com> Reviewed-by: Juan Quintela <quintela@redhat.com> Signed-off-by: Peter Xu <peterx@redhat.com> Message-Id: <20180710091902.28780-3-peterx@redhat.com> Signed-off-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
Diffstat (limited to 'migration')
-rw-r--r--migration/savevm.c16
1 files changed, 6 insertions, 10 deletions
diff --git a/migration/savevm.c b/migration/savevm.c
index 851d74e..efcc795 100644
--- a/migration/savevm.c
+++ b/migration/savevm.c
@@ -2276,18 +2276,14 @@ out:
qemu_file_set_error(f, ret);
/*
- * Detect whether it is:
- *
- * 1. postcopy running (after receiving all device data, which
- * must be in POSTCOPY_INCOMING_RUNNING state. Note that
- * POSTCOPY_INCOMING_LISTENING is still not enough, it's
- * still receiving device states).
- * 2. network failure (-EIO)
- *
- * If so, we try to wait for a recovery.
+ * If we are during an active postcopy, then we pause instead
+ * of bail out to at least keep the VM's dirty data. Note
+ * that POSTCOPY_INCOMING_LISTENING stage is still not enough,
+ * during which we're still receiving device states and we
+ * still haven't yet started the VM on destination.
*/
if (postcopy_state_get() == POSTCOPY_INCOMING_RUNNING &&
- ret == -EIO && postcopy_pause_incoming(mis)) {
+ postcopy_pause_incoming(mis)) {
/* Reset f to point to the newly created channel */
f = mis->from_src_file;
goto retry;