orion / rpms / qemu

Forked from rpms/qemu 4 years ago
Clone
76dcac3
From: Cole Robinson <crobinso@redhat.com>
76dcac3
Date: Fri, 16 Aug 2013 12:14:51 -0400
76dcac3
Subject: [PATCH] Fix migration from qemu-kvm
76dcac3
76dcac3
Details are in the code comments for each change. Just lumped this together
76dcac3
to ease patch maintenance.
76dcac3
76dcac3
Everything except the video memory bits can likely be dropped by Fedora 21
76dcac3
time frame. Need to figure out if there's anything to upstream for the
76dcac3
video memory bits.
76dcac3
---
76dcac3
 hw/acpi/piix4.c         |  8 ++++++-
76dcac3
 hw/display/qxl.c        |  9 ++++----
76dcac3
 hw/i386/pc_piix.c       | 61 +++++++++++++++++++++++++++++++++++++++++++++----
76dcac3
 hw/timer/i8254_common.c |  7 +++++-
76dcac3
 4 files changed, 74 insertions(+), 11 deletions(-)
76dcac3
76dcac3
diff --git a/hw/acpi/piix4.c b/hw/acpi/piix4.c
2983660
index 3aaf18c..6fbe57c 100644
76dcac3
--- a/hw/acpi/piix4.c
76dcac3
+++ b/hw/acpi/piix4.c
76dcac3
@@ -289,7 +289,13 @@ static int acpi_load_old(QEMUFile *f, void *opaque, int version_id)
76dcac3
 static const VMStateDescription vmstate_acpi = {
76dcac3
     .name = "piix4_pm",
76dcac3
     .version_id = 3,
76dcac3
-    .minimum_version_id = 3,
76dcac3
+    /*
76dcac3
+     * qemu-kvm 1.2 uses qemu.git version 3 format, but advertised as 2.
76dcac3
+     * This allows incoming migration from qemu-kvm, but breaks incoming
76dcac3
+     * migration from qemu < 1.3.
76dcac3
+     */
76dcac3
+    //minimum_version_id = 3,
76dcac3
+    .minimum_version_id = 2,
76dcac3
     .minimum_version_id_old = 1,
76dcac3
     .load_state_old = acpi_load_old,
76dcac3
     .post_load = vmstate_acpi_post_load,
76dcac3
diff --git a/hw/display/qxl.c b/hw/display/qxl.c
76dcac3
index c537057..7ef3eff 100644
76dcac3
--- a/hw/display/qxl.c
76dcac3
+++ b/hw/display/qxl.c
76dcac3
@@ -307,16 +307,14 @@ static inline uint32_t msb_mask(uint32_t val)
76dcac3
     return mask;
76dcac3
 }
76dcac3
 
76dcac3
-static ram_addr_t qxl_rom_size(void)
76dcac3
+static void check_qxl_rom_size(PCIQXLDevice *d)
76dcac3
 {
76dcac3
     uint32_t required_rom_size = sizeof(QXLRom) + sizeof(QXLModes) +
76dcac3
                                  sizeof(qxl_modes);
76dcac3
-    uint32_t rom_size = 8192; /* two pages */
76dcac3
 
76dcac3
     required_rom_size = MAX(required_rom_size, TARGET_PAGE_SIZE);
76dcac3
     required_rom_size = msb_mask(required_rom_size * 2 - 1);
76dcac3
-    assert(required_rom_size <= rom_size);
76dcac3
-    return rom_size;
76dcac3
+    assert(required_rom_size <= d->rom_size);
76dcac3
 }
76dcac3
 
76dcac3
 static void init_qxl_rom(PCIQXLDevice *d)
76dcac3
@@ -1981,7 +1979,7 @@ static int qxl_init_common(PCIQXLDevice *qxl)
76dcac3
     pci_set_byte(&config[PCI_REVISION_ID], pci_device_rev);
76dcac3
     pci_set_byte(&config[PCI_INTERRUPT_PIN], 1);
76dcac3
 
76dcac3
-    qxl->rom_size = qxl_rom_size();
76dcac3
+    check_qxl_rom_size(qxl);
76dcac3
     memory_region_init_ram(&qxl->rom_bar, OBJECT(qxl), "qxl.vrom",
76dcac3
                            qxl->rom_size);
76dcac3
     vmstate_register_ram(&qxl->rom_bar, &qxl->pci.qdev);
76dcac3
@@ -2309,6 +2307,7 @@ static Property qxl_properties[] = {
76dcac3
         DEFINE_PROP_UINT32("vram64_size_mb", PCIQXLDevice, vram_size_mb, -1),
76dcac3
         DEFINE_PROP_UINT32("vgamem_mb", PCIQXLDevice, vgamem_size_mb, 16),
76dcac3
         DEFINE_PROP_INT32("surfaces", PCIQXLDevice, ssd.num_surfaces, 1024),
76dcac3
+        DEFINE_PROP_UINT32("rom_size", PCIQXLDevice, rom_size, 8192),
76dcac3
         DEFINE_PROP_END_OF_LIST(),
76dcac3
 };
76dcac3
 
76dcac3
diff --git a/hw/i386/pc_piix.c b/hw/i386/pc_piix.c
2983660
index 3df2ff9..28216ee 100644
76dcac3
--- a/hw/i386/pc_piix.c
76dcac3
+++ b/hw/i386/pc_piix.c
76dcac3
@@ -377,6 +377,24 @@ static QEMUMachine pc_i440fx_machine_v1_4 = {
76dcac3
     DEFAULT_MACHINE_OPTIONS,
76dcac3
 };
76dcac3
 
76dcac3
+/*
76dcac3
+ * Commit 038c1879a00153b14bce113315b693e8c2944fa9 changed the qxl rom
76dcac3
+ * size to 8192, which fixes incoming migration from qemu 1.0. However
76dcac3
+ * from qemu 1.2 and 1.3 had rom size 16384, so incoming migration
76dcac3
+ * from those versions is now broken.
76dcac3
+ *
76dcac3
+ * Add a rom_size compat property. 1.2 and 1.3 get 16384, everything
76dcac3
+ * else is 8192.
76dcac3
+ *
76dcac3
+ * This isn't actually fool proof, since rom_size can be dependent on
76dcac3
+ * the version of spice qemu is built against:
76dcac3
+ *
76dcac3
+ * https://lists.gnu.org/archive/html/qemu-devel/2013-02/msg03154.html
76dcac3
+ *
76dcac3
+ * However these sizes match what native Fedora packages get, so it's
76dcac3
+ * good enough for now.
76dcac3
+ */
76dcac3
+
76dcac3
 #define PC_COMPAT_1_3 \
76dcac3
 	PC_COMPAT_1_4, \
76dcac3
         {\
76dcac3
@@ -395,8 +413,17 @@ static QEMUMachine pc_i440fx_machine_v1_4 = {
76dcac3
             .driver   = "e1000",\
76dcac3
             .property = "autonegotiation",\
76dcac3
             .value    = "off",\
76dcac3
+        },{ \
76dcac3
+            .driver   = "qxl", \
76dcac3
+            .property = "rom_size", \
76dcac3
+            .value    = stringify(16384), \
76dcac3
+        },{\
76dcac3
+            .driver   = "qxl-vga", \
76dcac3
+            .property = "rom_size", \
76dcac3
+            .value    = stringify(16384), \
76dcac3
         }
76dcac3
 
76dcac3
+
76dcac3
 static QEMUMachine pc_machine_v1_3 = {
76dcac3
     .name = "pc-1.3",
76dcac3
     .desc = "Standard PC",
76dcac3
@@ -409,6 +436,19 @@ static QEMUMachine pc_machine_v1_3 = {
76dcac3
     DEFAULT_MACHINE_OPTIONS,
76dcac3
 };
76dcac3
 
76dcac3
+
76dcac3
+/*
76dcac3
+ * https://lists.gnu.org/archive/html/qemu-devel/2013-01/msg02540.html
76dcac3
+ *
76dcac3
+ * qemu-kvm defaulted to vgamem=16MB since at least 0.15, while qemu used
76dcac3
+ * 8MB. For qemu 1.2, the default was changed to 16MB for all devices
76dcac3
+ * except cirrus.
76dcac3
+ *
76dcac3
+ * Make sure cirrus uses 16MB for <= pc-1.2 (the qemu-kvm merge),
76dcac3
+ * and 16MB always for all others. This will break incoming qemu
76dcac3
+ * migration for qemu < 1.3.
76dcac3
+ */
76dcac3
+
76dcac3
 #define PC_COMPAT_1_2 \
76dcac3
         PC_COMPAT_1_3,\
76dcac3
         {\
76dcac3
@@ -432,6 +472,10 @@ static QEMUMachine pc_machine_v1_3 = {
76dcac3
             .property = "revision",\
76dcac3
             .value    = stringify(3),\
76dcac3
         },{\
76dcac3
+            .driver   = "cirrus-vga",\
76dcac3
+            .property = "vgamem_mb",\
76dcac3
+            .value    = stringify(16),\
76dcac3
+        },{\
76dcac3
             .driver   = "VGA",\
76dcac3
             .property = "mmio",\
76dcac3
             .value    = "off",\
76dcac3
@@ -462,25 +506,34 @@ static QEMUMachine pc_machine_v1_2 = {
76dcac3
         },{\
76dcac3
             .driver   = "VGA",\
76dcac3
             .property = "vgamem_mb",\
76dcac3
-            .value    = stringify(8),\
76dcac3
+            .value    = stringify(16),\
76dcac3
         },{\
76dcac3
             .driver   = "vmware-svga",\
76dcac3
             .property = "vgamem_mb",\
76dcac3
-            .value    = stringify(8),\
76dcac3
+            .value    = stringify(16),\
76dcac3
         },{\
76dcac3
             .driver   = "qxl-vga",\
76dcac3
             .property = "vgamem_mb",\
76dcac3
-            .value    = stringify(8),\
76dcac3
+            .value    = stringify(16),\
76dcac3
         },{\
76dcac3
             .driver   = "qxl",\
76dcac3
             .property = "vgamem_mb",\
76dcac3
-            .value    = stringify(8),\
76dcac3
+            .value    = stringify(16),\
76dcac3
         },{\
76dcac3
             .driver   = "virtio-blk-pci",\
76dcac3
             .property = "config-wce",\
76dcac3
             .value    = "off",\
76dcac3
+        },{ \
76dcac3
+            .driver   = "qxl", \
76dcac3
+            .property = "rom_size", \
76dcac3
+            .value    = stringify(8192), \
76dcac3
+        },{\
76dcac3
+            .driver   = "qxl-vga", \
76dcac3
+            .property = "rom_size", \
76dcac3
+            .value    = stringify(8192), \
76dcac3
         }
76dcac3
 
76dcac3
+
76dcac3
 static QEMUMachine pc_machine_v1_1 = {
76dcac3
     .name = "pc-1.1",
76dcac3
     .desc = "Standard PC",
76dcac3
diff --git a/hw/timer/i8254_common.c b/hw/timer/i8254_common.c
76dcac3
index 4e5bf0b..cbc00a0 100644
76dcac3
--- a/hw/timer/i8254_common.c
76dcac3
+++ b/hw/timer/i8254_common.c
76dcac3
@@ -267,7 +267,12 @@ static const VMStateDescription vmstate_pit_common = {
76dcac3
     .pre_save = pit_dispatch_pre_save,
76dcac3
     .post_load = pit_dispatch_post_load,
76dcac3
     .fields = (VMStateField[]) {
76dcac3
-        VMSTATE_UINT32_V(channels[0].irq_disabled, PITCommonState, 3),
76dcac3
+        /* qemu-kvm version_id=2 had 'flags' here which is equivalent
76dcac3
+         * This fixes incoming migration from qemu-kvm 1.0, but breaks
76dcac3
+         * incoming migration from qemu < 1.1
76dcac3
+         */
76dcac3
+        //VMSTATE_UINT32_V(channels[0].irq_disabled, PITCommonState, 3),
76dcac3
+        VMSTATE_UINT32(channels[0].irq_disabled, PITCommonState),
76dcac3
         VMSTATE_STRUCT_ARRAY(channels, PITCommonState, 3, 2,
76dcac3
                              vmstate_pit_channel, PITChannelState),
76dcac3
         VMSTATE_INT64(channels[0].next_transition_time,