All of lore.kernel.org
 help / color / mirror / Atom feed
* [Qemu-devel] [PATCH v3] Fix pc migration from qemu <= 1.5
@ 2013-11-05 23:46 Cole Robinson
  2013-11-06 12:14 ` Michael S. Tsirkin
  2013-11-08  3:20 ` David Gibson
  0 siblings, 2 replies; 3+ messages in thread
From: Cole Robinson @ 2013-11-05 23:46 UTC (permalink / raw)
  To: qemu-devel
  Cc: mst, alex.williamson, qemu-stable, bsd, aliguori, Cole Robinson,
	pbonzini, david

The following commit introduced a migration incompatibility:

commit 568f0690fd9aa4d39d84b04c1a5dbb53a915c3fe
Author: David Gibson <david@gibson.dropbear.id.au>
Date:   Thu Jun 6 18:48:49 2013 +1000

    pci: Replace pci_find_domain() with more general pci_root_bus_path()

The issue is that i440fx savevm idstr went from 0000:00:00.0/I440FX to
0000:00.0/I440FX. Unfortunately we are stuck with the breakage for
1.6 machine types.

Add a compat property to maintain the busted idstr for the 1.6 machine
types, but revert to the old style format for 1.7+, and <= 1.5.

Tested with migration from qemu 1.5, qemu 1.6, and qemu.git.

Cc: qemu-stable@nongnu.org
Signed-off-by: Cole Robinson <crobinso@redhat.com>
---

v3:
    Don't regress -M pc-q35*

 hw/pci-host/piix.c        |  9 ++++++++-
 hw/pci-host/q35.c         | 10 ++++++++--
 include/hw/i386/pc.h      | 16 ++++++++++++++++
 include/hw/pci-host/q35.h |  1 +
 4 files changed, 33 insertions(+), 3 deletions(-)

diff --git a/hw/pci-host/piix.c b/hw/pci-host/piix.c
index bad3953..edc974e 100644
--- a/hw/pci-host/piix.c
+++ b/hw/pci-host/piix.c
@@ -48,6 +48,7 @@ typedef struct I440FXState {
     PCIHostState parent_obj;
     PcPciInfo pci_info;
     uint64_t pci_hole64_size;
+    uint32_t short_root_bus;
 } I440FXState;
 
 #define PIIX_NUM_PIC_IRQS       16      /* i8259 * 2 */
@@ -720,13 +721,19 @@ static const TypeInfo i440fx_info = {
 static const char *i440fx_pcihost_root_bus_path(PCIHostState *host_bridge,
                                                 PCIBus *rootbus)
 {
+    I440FXState *s = I440FX_PCI_HOST_BRIDGE(host_bridge);
+
     /* For backwards compat with old device paths */
-    return "0000";
+    if (s->short_root_bus) {
+        return "0000";
+    }
+    return "0000:00";
 }
 
 static Property i440fx_props[] = {
     DEFINE_PROP_SIZE(PCI_HOST_PROP_PCI_HOLE64_SIZE, I440FXState,
                      pci_hole64_size, DEFAULT_PCI_HOLE64_SIZE),
+    DEFINE_PROP_UINT32("short_root_bus", I440FXState, short_root_bus, 0),
     DEFINE_PROP_END_OF_LIST(),
 };
 
diff --git a/hw/pci-host/q35.c b/hw/pci-host/q35.c
index b8feed1..c043998 100644
--- a/hw/pci-host/q35.c
+++ b/hw/pci-host/q35.c
@@ -61,8 +61,13 @@ static void q35_host_realize(DeviceState *dev, Error **errp)
 static const char *q35_host_root_bus_path(PCIHostState *host_bridge,
                                           PCIBus *rootbus)
 {
-    /* For backwards compat with old device paths */
-    return "0000";
+    Q35PCIHost *s = Q35_HOST_DEVICE(host_bridge);
+
+     /* For backwards compat with old device paths */
+    if (s->mch.short_root_bus) {
+        return "0000";
+    }
+    return "0000:00";
 }
 
 static void q35_host_get_pci_hole_start(Object *obj, Visitor *v,
@@ -124,6 +129,7 @@ static Property mch_props[] = {
                         MCH_HOST_BRIDGE_PCIEXBAR_DEFAULT),
     DEFINE_PROP_SIZE(PCI_HOST_PROP_PCI_HOLE64_SIZE, Q35PCIHost,
                      mch.pci_hole64_size, DEFAULT_PCI_HOLE64_SIZE),
+    DEFINE_PROP_UINT32("short_root_bus", Q35PCIHost, mch.short_root_bus, 0),
     DEFINE_PROP_END_OF_LIST(),
 };
 
diff --git a/include/hw/i386/pc.h b/include/hw/i386/pc.h
index 03cc0ba..57e8d16 100644
--- a/include/hw/i386/pc.h
+++ b/include/hw/i386/pc.h
@@ -260,6 +260,14 @@ int e820_add_entry(uint64_t, uint64_t, uint32_t);
             .driver   = "qemu32-" TYPE_X86_CPU,\
             .property = "model",\
             .value    = stringify(3),\
+        },{\
+            .driver   = "i440FX-pcihost",\
+            .property = "short_root_bus",\
+            .value    = stringify(1),\
+        },{\
+            .driver   = "q35-pcihost",\
+            .property = "short_root_bus",\
+            .value    = stringify(1),\
         }
 
 #define PC_COMPAT_1_5 \
@@ -296,6 +304,14 @@ int e820_add_entry(uint64_t, uint64_t, uint32_t);
             .driver = TYPE_X86_CPU,\
             .property = "pmu",\
             .value = "on",\
+        },{\
+            .driver   = "i440FX-pcihost",\
+            .property = "short_root_bus",\
+            .value    = stringify(0),\
+        },{\
+            .driver   = "q35-pcihost",\
+            .property = "short_root_bus",\
+            .value    = stringify(0),\
         }
 
 #define PC_COMPAT_1_4 \
diff --git a/include/hw/pci-host/q35.h b/include/hw/pci-host/q35.h
index aee91aa..309065f 100644
--- a/include/hw/pci-host/q35.h
+++ b/include/hw/pci-host/q35.h
@@ -61,6 +61,7 @@ typedef struct MCHPCIState {
     ram_addr_t above_4g_mem_size;
     uint64_t pci_hole64_size;
     PcGuestInfo *guest_info;
+    uint32_t short_root_bus;
 } MCHPCIState;
 
 typedef struct Q35PCIHost {
-- 
1.8.4.2

^ permalink raw reply related	[flat|nested] 3+ messages in thread

* Re: [Qemu-devel] [PATCH v3] Fix pc migration from qemu <= 1.5
  2013-11-05 23:46 [Qemu-devel] [PATCH v3] Fix pc migration from qemu <= 1.5 Cole Robinson
@ 2013-11-06 12:14 ` Michael S. Tsirkin
  2013-11-08  3:20 ` David Gibson
  1 sibling, 0 replies; 3+ messages in thread
From: Michael S. Tsirkin @ 2013-11-06 12:14 UTC (permalink / raw)
  To: Cole Robinson
  Cc: qemu-stable, alex.williamson, qemu-devel, bsd, aliguori, pbonzini, david

On Tue, Nov 05, 2013 at 06:46:27PM -0500, Cole Robinson wrote:
> The following commit introduced a migration incompatibility:
> 
> commit 568f0690fd9aa4d39d84b04c1a5dbb53a915c3fe
> Author: David Gibson <david@gibson.dropbear.id.au>
> Date:   Thu Jun 6 18:48:49 2013 +1000
> 
>     pci: Replace pci_find_domain() with more general pci_root_bus_path()
> 
> The issue is that i440fx savevm idstr went from 0000:00:00.0/I440FX to
> 0000:00.0/I440FX. Unfortunately we are stuck with the breakage for
> 1.6 machine types.
> 
> Add a compat property to maintain the busted idstr for the 1.6 machine
> types, but revert to the old style format for 1.7+, and <= 1.5.
> 
> Tested with migration from qemu 1.5, qemu 1.6, and qemu.git.
> 
> Cc: qemu-stable@nongnu.org
> Signed-off-by: Cole Robinson <crobinso@redhat.com>

Reviewed-by: Michael S. Tsirkin <mst@redhat.com>


BTW we really need unit tests for migration.


> ---
> 
> v3:
>     Don't regress -M pc-q35*
> 
>  hw/pci-host/piix.c        |  9 ++++++++-
>  hw/pci-host/q35.c         | 10 ++++++++--
>  include/hw/i386/pc.h      | 16 ++++++++++++++++
>  include/hw/pci-host/q35.h |  1 +
>  4 files changed, 33 insertions(+), 3 deletions(-)
> 
> diff --git a/hw/pci-host/piix.c b/hw/pci-host/piix.c
> index bad3953..edc974e 100644
> --- a/hw/pci-host/piix.c
> +++ b/hw/pci-host/piix.c
> @@ -48,6 +48,7 @@ typedef struct I440FXState {
>      PCIHostState parent_obj;
>      PcPciInfo pci_info;
>      uint64_t pci_hole64_size;
> +    uint32_t short_root_bus;
>  } I440FXState;
>  
>  #define PIIX_NUM_PIC_IRQS       16      /* i8259 * 2 */
> @@ -720,13 +721,19 @@ static const TypeInfo i440fx_info = {
>  static const char *i440fx_pcihost_root_bus_path(PCIHostState *host_bridge,
>                                                  PCIBus *rootbus)
>  {
> +    I440FXState *s = I440FX_PCI_HOST_BRIDGE(host_bridge);
> +
>      /* For backwards compat with old device paths */
> -    return "0000";
> +    if (s->short_root_bus) {
> +        return "0000";
> +    }
> +    return "0000:00";
>  }
>  
>  static Property i440fx_props[] = {
>      DEFINE_PROP_SIZE(PCI_HOST_PROP_PCI_HOLE64_SIZE, I440FXState,
>                       pci_hole64_size, DEFAULT_PCI_HOLE64_SIZE),
> +    DEFINE_PROP_UINT32("short_root_bus", I440FXState, short_root_bus, 0),
>      DEFINE_PROP_END_OF_LIST(),
>  };
>  
> diff --git a/hw/pci-host/q35.c b/hw/pci-host/q35.c
> index b8feed1..c043998 100644
> --- a/hw/pci-host/q35.c
> +++ b/hw/pci-host/q35.c
> @@ -61,8 +61,13 @@ static void q35_host_realize(DeviceState *dev, Error **errp)
>  static const char *q35_host_root_bus_path(PCIHostState *host_bridge,
>                                            PCIBus *rootbus)
>  {
> -    /* For backwards compat with old device paths */
> -    return "0000";
> +    Q35PCIHost *s = Q35_HOST_DEVICE(host_bridge);
> +
> +     /* For backwards compat with old device paths */
> +    if (s->mch.short_root_bus) {
> +        return "0000";
> +    }
> +    return "0000:00";
>  }
>  
>  static void q35_host_get_pci_hole_start(Object *obj, Visitor *v,
> @@ -124,6 +129,7 @@ static Property mch_props[] = {
>                          MCH_HOST_BRIDGE_PCIEXBAR_DEFAULT),
>      DEFINE_PROP_SIZE(PCI_HOST_PROP_PCI_HOLE64_SIZE, Q35PCIHost,
>                       mch.pci_hole64_size, DEFAULT_PCI_HOLE64_SIZE),
> +    DEFINE_PROP_UINT32("short_root_bus", Q35PCIHost, mch.short_root_bus, 0),
>      DEFINE_PROP_END_OF_LIST(),
>  };
>  
> diff --git a/include/hw/i386/pc.h b/include/hw/i386/pc.h
> index 03cc0ba..57e8d16 100644
> --- a/include/hw/i386/pc.h
> +++ b/include/hw/i386/pc.h
> @@ -260,6 +260,14 @@ int e820_add_entry(uint64_t, uint64_t, uint32_t);
>              .driver   = "qemu32-" TYPE_X86_CPU,\
>              .property = "model",\
>              .value    = stringify(3),\
> +        },{\
> +            .driver   = "i440FX-pcihost",\
> +            .property = "short_root_bus",\
> +            .value    = stringify(1),\
> +        },{\
> +            .driver   = "q35-pcihost",\
> +            .property = "short_root_bus",\
> +            .value    = stringify(1),\
>          }
>  
>  #define PC_COMPAT_1_5 \
> @@ -296,6 +304,14 @@ int e820_add_entry(uint64_t, uint64_t, uint32_t);
>              .driver = TYPE_X86_CPU,\
>              .property = "pmu",\
>              .value = "on",\
> +        },{\
> +            .driver   = "i440FX-pcihost",\
> +            .property = "short_root_bus",\
> +            .value    = stringify(0),\
> +        },{\
> +            .driver   = "q35-pcihost",\
> +            .property = "short_root_bus",\
> +            .value    = stringify(0),\
>          }
>  
>  #define PC_COMPAT_1_4 \
> diff --git a/include/hw/pci-host/q35.h b/include/hw/pci-host/q35.h
> index aee91aa..309065f 100644
> --- a/include/hw/pci-host/q35.h
> +++ b/include/hw/pci-host/q35.h
> @@ -61,6 +61,7 @@ typedef struct MCHPCIState {
>      ram_addr_t above_4g_mem_size;
>      uint64_t pci_hole64_size;
>      PcGuestInfo *guest_info;
> +    uint32_t short_root_bus;
>  } MCHPCIState;
>  
>  typedef struct Q35PCIHost {
> -- 
> 1.8.4.2

^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: [Qemu-devel] [PATCH v3] Fix pc migration from qemu <= 1.5
  2013-11-05 23:46 [Qemu-devel] [PATCH v3] Fix pc migration from qemu <= 1.5 Cole Robinson
  2013-11-06 12:14 ` Michael S. Tsirkin
@ 2013-11-08  3:20 ` David Gibson
  1 sibling, 0 replies; 3+ messages in thread
From: David Gibson @ 2013-11-08  3:20 UTC (permalink / raw)
  To: Cole Robinson
  Cc: mst, qemu-stable, alex.williamson, qemu-devel, bsd, aliguori, pbonzini

[-- Attachment #1: Type: text/plain, Size: 1056 bytes --]

On Tue, Nov 05, 2013 at 06:46:27PM -0500, Cole Robinson wrote:
> The following commit introduced a migration incompatibility:
> 
> commit 568f0690fd9aa4d39d84b04c1a5dbb53a915c3fe
> Author: David Gibson <david@gibson.dropbear.id.au>
> Date:   Thu Jun 6 18:48:49 2013 +1000
> 
>     pci: Replace pci_find_domain() with more general pci_root_bus_path()
> 
> The issue is that i440fx savevm idstr went from 0000:00:00.0/I440FX to
> 0000:00.0/I440FX. Unfortunately we are stuck with the breakage for
> 1.6 machine types.
> 
> Add a compat property to maintain the busted idstr for the 1.6 machine
> types, but revert to the old style format for 1.7+, and <= 1.5.
> 
> Tested with migration from qemu 1.5, qemu 1.6, and qemu.git.

Bother.  I did think about migration compatibility for x86, but
obviously not quite hard enough :(.  Sorry, folks.

-- 
David Gibson			| I'll have my music baroque, and my code
david AT gibson.dropbear.id.au	| minimalist, thank you.  NOT _the_ _other_
				| _way_ _around_!
http://www.ozlabs.org/~dgibson

[-- Attachment #2: Type: application/pgp-signature, Size: 836 bytes --]

^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2013-11-08 11:09 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2013-11-05 23:46 [Qemu-devel] [PATCH v3] Fix pc migration from qemu <= 1.5 Cole Robinson
2013-11-06 12:14 ` Michael S. Tsirkin
2013-11-08  3:20 ` David Gibson

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.