From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:36327) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1UwFHk-00053u-6r for qemu-devel@nongnu.org; Mon, 08 Jul 2013 13:31:43 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1UwFHg-0005gd-Va for qemu-devel@nongnu.org; Mon, 08 Jul 2013 13:31:36 -0400 Received: from omzsmtpe02.verizonbusiness.com ([199.249.25.209]:35268) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1UwFHg-0005gR-Rk for qemu-devel@nongnu.org; Mon, 08 Jul 2013 13:31:32 -0400 From: Don Koch Message-ID: <51DAF746.4000606@terremark.com> Date: Mon, 8 Jul 2013 13:30:46 -0400 MIME-Version: 1.0 References: <1372863856-19860-1-git-send-email-dkoch@terremark.com> <20130704085718.GA2208@redhat.com> In-Reply-To: <20130704085718.GA2208@redhat.com> Content-Type: text/plain; charset="ISO-8859-1" Content-Transfer-Encoding: 7bit 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: "Michael S. Tsirkin" Cc: qemu-devel@nongnu.org, Don Koch , =?ISO-8859-1?Q?Andreas_F=E4rber?= On 07/04/2013 04:57 AM, Michael S. Tsirkin wrote: > 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? One would think so. > Could we call this from get_pci_config_device instead? Seems a bit odd, but I can't find a better spot (there is no pci_bridge equivalent). I'll look into a patch for that (but can't guarantee total testing). > This way all bridge devices would be fixed. Well, all that support migration (e.g., not the i82801b11). ;) > >> 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