From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:53858) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1UufKm-0003PN-8G for qemu-devel@nongnu.org; Thu, 04 Jul 2013 04:56:14 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1UufKj-0005GA-N1 for qemu-devel@nongnu.org; Thu, 04 Jul 2013 04:56:12 -0400 Received: from mx1.redhat.com ([209.132.183.28]:13269) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1UufKj-0005G4-ED for qemu-devel@nongnu.org; Thu, 04 Jul 2013 04:56:09 -0400 Date: Thu, 4 Jul 2013 11:57:18 +0300 From: "Michael S. Tsirkin" Message-ID: <20130704085718.GA2208@redhat.com> References: <1372863856-19860-1-git-send-email-dkoch@terremark.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1372863856-19860-1-git-send-email-dkoch@terremark.com> Subject: Re: [Qemu-devel] [Bug 1187529] [PATCH] Update mappings after PCI bridge live migration or save-restore. List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Don Koch Cc: qemu-devel@nongnu.org On Wed, Jul 03, 2013 at 11:04:16AM -0400, Don Koch wrote: > From: Don Koch > > Update mappings for PCI bridge after live migration. > > Signed-off-by: Don Koch > --- > This fixes bug 1187529: devices on a PCI bridge stop working after migration. Thanks, this looks good, but any bridge device would need this fix, won't it? Could we call this from get_pci_config_device instead? This way all bridge devices would be fixed. > hw/pci-bridge/pci_bridge_dev.c | 9 +++++++++ > hw/pci/pci_bridge.c | 2 +- > include/hw/pci/pci_bridge.h | 1 + > 3 files changed, 11 insertions(+), 1 deletion(-) > > diff --git a/hw/pci-bridge/pci_bridge_dev.c b/hw/pci-bridge/pci_bridge_dev.c > index 971b432..9e5062e 100644 > --- a/hw/pci-bridge/pci_bridge_dev.c > +++ b/hw/pci-bridge/pci_bridge_dev.c > @@ -110,6 +110,14 @@ static void qdev_pci_bridge_dev_reset(DeviceState *qdev) > shpc_reset(dev); > } > > +static int pci_bridge_dev_post_load(void *opaque, int ver) { > + PCIDevice *d = opaque; > + PCIBridge *s = container_of(d, PCIBridge, dev); > + > + pci_bridge_update_mappings(s); > + return 0; > +} > + > static Property pci_bridge_dev_properties[] = { > /* Note: 0 is not a legal chassis number. */ > DEFINE_PROP_UINT8("chassis_nr", PCIBridgeDev, chassis_nr, 0), > @@ -119,6 +127,7 @@ static Property pci_bridge_dev_properties[] = { > > static const VMStateDescription pci_bridge_dev_vmstate = { > .name = "pci_bridge", > + .post_load = pci_bridge_dev_post_load, > .fields = (VMStateField[]) { > VMSTATE_PCI_DEVICE(bridge.dev, PCIBridgeDev), > SHPC_VMSTATE(bridge.dev.shpc, PCIBridgeDev), > diff --git a/hw/pci/pci_bridge.c b/hw/pci/pci_bridge.c > index 24be6c5..3897bd8 100644 > --- a/hw/pci/pci_bridge.c > +++ b/hw/pci/pci_bridge.c > @@ -224,7 +224,7 @@ static void pci_bridge_region_cleanup(PCIBridge *br, PCIBridgeWindows *w) > g_free(w); > } > > -static void pci_bridge_update_mappings(PCIBridge *br) > +void pci_bridge_update_mappings(PCIBridge *br) > { > PCIBridgeWindows *w = br->windows; > > diff --git a/include/hw/pci/pci_bridge.h b/include/hw/pci/pci_bridge.h > index 1868f7a..1d8f997 100644 > --- a/include/hw/pci/pci_bridge.h > +++ b/include/hw/pci/pci_bridge.h > @@ -37,6 +37,7 @@ PCIBus *pci_bridge_get_sec_bus(PCIBridge *br); > pcibus_t pci_bridge_get_base(const PCIDevice *bridge, uint8_t type); > pcibus_t pci_bridge_get_limit(const PCIDevice *bridge, uint8_t type); > > +void pci_bridge_update_mappings(PCIBridge *br); > void pci_bridge_write_config(PCIDevice *d, > uint32_t address, uint32_t val, int len); > void pci_bridge_disable_base_limit(PCIDevice *dev); > -- > 1.7.11.7