[qemu-xen master] migration: incoming postcopy advise sanity checks

classic Classic list List threaded Threaded
1 message Options
Reply | Threaded
Open this post in threaded view

[qemu-xen master] migration: incoming postcopy advise sanity checks

commit a3fd64f2fe9f90c7b4d002910a54049ee6a09b64
Author:     Greg Kurz <[hidden email]>
AuthorDate: Tue Feb 6 12:23:30 2018 +0100
Commit:     Michael Roth <[hidden email]>
CommitDate: Mon Feb 12 09:28:28 2018 -0600

    migration: incoming postcopy advise sanity checks
    If postcopy-ram was set on the source but not on the destination,
    migration doesn't occur, the destination prints an error and boots
    the guest:
    qemu-system-ppc64: Expected vmdescription section, but got 0
    We end up with two running instances.
    This behaviour was introduced in 2.11 by commit 58110f0acb1a "migration:
    split common postcopy out of ram postcopy" to prepare ground for the
    upcoming dirty bitmap postcopy support. It adds a new case where the
    source may send an empty postcopy advise because dirty bitmap doesn't
    need to check page sizes like RAM postcopy does.
    If the source has enabled postcopy-ram, then it sends an advise with
    the page size values. If the destination hasn't enabled postcopy-ram,
    then loadvm_postcopy_handle_advise() leaves the page size values on
    the stream and returns. This confuses qemu_loadvm_state() later on
    and causes the destination to start execution.
    As discussed several times, postcopy-ram should be enabled both sides
    to be functional. This patch changes the destination to perform some
    extra checks on the advise length to ensure this is the case. Otherwise
    an error is returned and migration is aborted.
    Reported-by: Balamuruhan S <[hidden email]>
    Signed-off-by: Greg Kurz <[hidden email]>
    Reviewed-by: Daniel Henrique Barboza <[hidden email]>
    Reviewed-by: Vladimir Sementsov-Ogievskiy <[hidden email]>
    Reviewed-by: Dr. David Alan Gilbert <[hidden email]>
    Message-Id: <151791621042.19120.3103118434734245776.stgit@bahia>
    Signed-off-by: Dr. David Alan Gilbert <[hidden email]>
    (cherry picked from commit 875fcd013ab68c64802998b22f54f0184479d21b)
    Signed-off-by: Michael Roth <[hidden email]>
 migration/savevm.c | 21 ++++++++++++++++++---
 1 file changed, 18 insertions(+), 3 deletions(-)

diff --git a/migration/savevm.c b/migration/savevm.c
index b024ee3..f202c3d 100644
--- a/migration/savevm.c
+++ b/migration/savevm.c
@@ -1376,7 +1376,8 @@ static int qemu_loadvm_state_main(QEMUFile *f, MigrationIncomingState *mis);
  * *might* happen - it might be skipped if precopy transferred everything
  * quickly.
-static int loadvm_postcopy_handle_advise(MigrationIncomingState *mis)
+static int loadvm_postcopy_handle_advise(MigrationIncomingState *mis,
+                                         uint16_t len)
     PostcopyState ps = postcopy_state_set(POSTCOPY_INCOMING_ADVISE);
     uint64_t remote_pagesize_summary, local_pagesize_summary, remote_tps;
@@ -1387,8 +1388,22 @@ static int loadvm_postcopy_handle_advise(MigrationIncomingState *mis)
         return -1;
-    if (!migrate_postcopy_ram()) {
+    switch (len) {
+    case 0:
+        if (migrate_postcopy_ram()) {
+            error_report("RAM postcopy is enabled but have 0 byte advise");
+            return -EINVAL;
+        }
         return 0;
+    case 8 + 8:
+        if (!migrate_postcopy_ram()) {
+            error_report("RAM postcopy is disabled but have 16 byte advise");
+            return -EINVAL;
+        }
+        break;
+    default:
+        error_report("CMD_POSTCOPY_ADVISE invalid length (%d)", len);
+        return -EINVAL;
     if (!postcopy_ram_supported_by_host(mis)) {
@@ -1807,7 +1822,7 @@ static int loadvm_process_command(QEMUFile *f)
         return loadvm_handle_cmd_packaged(mis);
-        return loadvm_postcopy_handle_advise(mis);
+        return loadvm_postcopy_handle_advise(mis, len);
         return loadvm_postcopy_handle_listen(mis);
generated by git-patchbot for /home/xen/git/qemu-xen.git#master

Xen-changelog mailing list
[hidden email]