[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-stable] [PATCH v3] Fix pc migration from qemu <= 1.5
From: |
Michael S. Tsirkin |
Subject: |
Re: [Qemu-stable] [PATCH v3] Fix pc migration from qemu <= 1.5 |
Date: |
Wed, 6 Nov 2013 14:14:10 +0200 |
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 <address@hidden>
> 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: address@hidden
> Signed-off-by: Cole Robinson <address@hidden>
Reviewed-by: Michael S. Tsirkin <address@hidden>
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