76daa3
From 34e2297e813de18018e4b50e29f8491c78cafe39 Mon Sep 17 00:00:00 2001
76daa3
From: Laurent Vivier <lvivier@redhat.com>
76daa3
Date: Tue, 4 Jul 2017 16:32:57 +0200
76daa3
Subject: [PATCH 2/4] spapr: Add a "no HPT" encoding to HTAB migration stream
76daa3
76daa3
RH-Author: Laurent Vivier <lvivier@redhat.com>
76daa3
Message-id: <20170704163258.9846-3-lvivier@redhat.com>
76daa3
Patchwork-id: 75705
76daa3
O-Subject: [Pegas-1.0 qemu-kvm PATCH 2/3] spapr: Add a "no HPT" encoding to HTAB migration stream
76daa3
Bugzilla: 1456287
76daa3
RH-Acked-by: David Gibson <dgibson@redhat.com>
76daa3
RH-Acked-by: Thomas Huth <thuth@redhat.com>
76daa3
RH-Acked-by: Miroslav Rezanina <mrezanin@redhat.com>
76daa3
76daa3
From: Bharata B Rao <bharata@linux.vnet.ibm.com>
76daa3
76daa3
Add a "no HPT" encoding (using value -1) to the HTAB migration
76daa3
stream (in the place of HPT size) when the guest doesn't allocate HPT.
76daa3
This will help the target side to match target HPT with the source HPT
76daa3
and thus enable successful migration.
76daa3
76daa3
Suggested-by: David Gibson <david@gibson.dropbear.id.au>
76daa3
Signed-off-by: Bharata B Rao <bharata@linux.vnet.ibm.com>
76daa3
Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
76daa3
(cherry picked from commit 3a38429748aa4f74abaecf16c4c087e8a325e12a)
76daa3
Signed-off-by: Laurent Vivier <lvivier@redhat.com>
76daa3
Signed-off-by: Miroslav Rezanina <mrezanin@redhat.com>
76daa3
---
76daa3
 hw/ppc/spapr.c | 29 +++++++++++++++++++++++++----
76daa3
 1 file changed, 25 insertions(+), 4 deletions(-)
76daa3
76daa3
diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c
76daa3
index 2bee3d9..c322666 100644
76daa3
--- a/hw/ppc/spapr.c
76daa3
+++ b/hw/ppc/spapr.c
76daa3
@@ -1576,13 +1576,19 @@ static int htab_save_setup(QEMUFile *f, void *opaque)
76daa3
     sPAPRMachineState *spapr = opaque;
76daa3
 
76daa3
     /* "Iteration" header */
76daa3
-    qemu_put_be32(f, spapr->htab_shift);
76daa3
+    if (!spapr->htab_shift) {
76daa3
+        qemu_put_be32(f, -1);
76daa3
+    } else {
76daa3
+        qemu_put_be32(f, spapr->htab_shift);
76daa3
+    }
76daa3
 
76daa3
     if (spapr->htab) {
76daa3
         spapr->htab_save_index = 0;
76daa3
         spapr->htab_first_pass = true;
76daa3
     } else {
76daa3
-        assert(kvm_enabled());
76daa3
+        if (spapr->htab_shift) {
76daa3
+            assert(kvm_enabled());
76daa3
+        }
76daa3
     }
76daa3
 
76daa3
 
76daa3
@@ -1728,7 +1734,12 @@ static int htab_save_iterate(QEMUFile *f, void *opaque)
76daa3
     int rc = 0;
76daa3
 
76daa3
     /* Iteration header */
76daa3
-    qemu_put_be32(f, 0);
76daa3
+    if (!spapr->htab_shift) {
76daa3
+        qemu_put_be32(f, -1);
76daa3
+        return 0;
76daa3
+    } else {
76daa3
+        qemu_put_be32(f, 0);
76daa3
+    }
76daa3
 
76daa3
     if (!spapr->htab) {
76daa3
         assert(kvm_enabled());
76daa3
@@ -1762,7 +1773,12 @@ static int htab_save_complete(QEMUFile *f, void *opaque)
76daa3
     int fd;
76daa3
 
76daa3
     /* Iteration header */
76daa3
-    qemu_put_be32(f, 0);
76daa3
+    if (!spapr->htab_shift) {
76daa3
+        qemu_put_be32(f, -1);
76daa3
+        return 0;
76daa3
+    } else {
76daa3
+        qemu_put_be32(f, 0);
76daa3
+    }
76daa3
 
76daa3
     if (!spapr->htab) {
76daa3
         int rc;
76daa3
@@ -1806,6 +1822,11 @@ static int htab_load(QEMUFile *f, void *opaque, int version_id)
76daa3
 
76daa3
     section_hdr = qemu_get_be32(f);
76daa3
 
76daa3
+    if (section_hdr == -1) {
76daa3
+        spapr_free_hpt(spapr);
76daa3
+        return 0;
76daa3
+    }
76daa3
+
76daa3
     if (section_hdr) {
76daa3
         Error *local_err = NULL;
76daa3
 
76daa3
-- 
76daa3
1.8.3.1
76daa3