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>
This commit is contained in:
parent
f90c2bcdbc
commit
7cf1b0fd95
5
hw/pci.c
5
hw/pci.c
|
@ -838,12 +838,13 @@ static int pci_unregister_device(DeviceState *dev)
|
||||||
PCIDevice *pci_dev = PCI_DEVICE(dev);
|
PCIDevice *pci_dev = PCI_DEVICE(dev);
|
||||||
PCIDeviceClass *pc = PCI_DEVICE_GET_CLASS(pci_dev);
|
PCIDeviceClass *pc = PCI_DEVICE_GET_CLASS(pci_dev);
|
||||||
|
|
||||||
|
pci_unregister_io_regions(pci_dev);
|
||||||
|
pci_del_option_rom(pci_dev);
|
||||||
|
|
||||||
if (pc->exit) {
|
if (pc->exit) {
|
||||||
pc->exit(pci_dev);
|
pc->exit(pci_dev);
|
||||||
}
|
}
|
||||||
|
|
||||||
pci_unregister_io_regions(pci_dev);
|
|
||||||
pci_del_option_rom(pci_dev);
|
|
||||||
do_pci_unregister_device(pci_dev);
|
do_pci_unregister_device(pci_dev);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue