From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:55330) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1UwEq5-0007Se-6h for qemu-devel@nongnu.org; Mon, 08 Jul 2013 13:03:05 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1UwEq2-0003TM-7S for qemu-devel@nongnu.org; Mon, 08 Jul 2013 13:03:01 -0400 Received: from omzsmtpe03.verizonbusiness.com ([199.249.25.208]:49148) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1UwEq2-0003T5-3S for qemu-devel@nongnu.org; Mon, 08 Jul 2013 13:02:58 -0400 Message-ID: <51DAF0B8.4090200@cloudswitch.com> Date: Mon, 8 Jul 2013 13:02:48 -0400 From: Don Koch MIME-Version: 1.0 References: <1372863856-19860-1-git-send-email-dkoch@terremark.com> <51D44E24.7000304@suse.de> In-Reply-To: <51D44E24.7000304@suse.de> Content-Type: text/plain; charset="ISO-8859-15" Content-Transfer-Encoding: 8bit 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: =?ISO-8859-15?Q?Andreas_F=E4rber?= Cc: Peter Crosthwaite , qemu-devel@nongnu.org, Don Koch , mst@redhat.com On 07/03/2013 12:15 PM, Andreas Färber wrote: > Am 03.07.2013 17:04, schrieb Don Koch: >> 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. > > Feel free to reference this as LP#1187529 in the commit message if this > is from QEMU's Launchpad bug tracker. OK, will do. (Wasn't aware of this convention.) >> >> 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); > > Casting should no longer be done that way. It seems there is no > PCI_BRIDGE() cast macro in upstream yet, but it doesn't seem necessary > either. You can just use: > > PCIBridge *s = opaque; > > for simplicity. Might I suggest submitting the patch as is (possibly modulo Michael Tsirkin's suggestions) and later submitting a PCI_BRIDGE macro patch to "standardize" the casting? > > Functional change looks sensible to me. > > Regards, > Andreas > >> + >> + 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); >> > >