diff options
author | Alex Williamson <alex.williamson@redhat.com> | 2012-07-03 22:39:34 -0600 |
---|---|---|
committer | Michael S. Tsirkin <mst@redhat.com> | 2012-07-04 15:55:07 +0300 |
commit | 7cf1b0fd95657e722b2ad290649eee88d1365786 (patch) | |
tree | a3a32e78cb8a50b0de6955f798291ec277b13dc9 /hw/pci.c | |
parent | f90c2bcdbc69e41e575f868b984c3e2de8f51bac (diff) |
pci: Unregister BARs before device exit
BARs are registered in init functions from memory regions created
by the drivers. Exit functions destroy those memory regions.
By unregistering the io regions after exit(), we're calling
memory_region_del_subregion on freed memory. Don't do that. The
option rom comes along for the ride because it's more symmetric
to how it's created.
Signed-off-by: Alex Williamson <alex.williamson@redhat.com>
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
Diffstat (limited to 'hw/pci.c')
-rw-r--r-- | hw/pci.c | 5 |
1 files changed, 3 insertions, 2 deletions
@@ -838,12 +838,13 @@ static int pci_unregister_device(DeviceState *dev) PCIDevice *pci_dev = PCI_DEVICE(dev); PCIDeviceClass *pc = PCI_DEVICE_GET_CLASS(pci_dev); + pci_unregister_io_regions(pci_dev); + pci_del_option_rom(pci_dev); + if (pc->exit) { pc->exit(pci_dev); } - pci_unregister_io_regions(pci_dev); - pci_del_option_rom(pci_dev); do_pci_unregister_device(pci_dev); return 0; } |