mirror of https://github.com/xemu-project/xemu.git
virtio-serial: Cleanup on device hot-unplug
Free malloc'ed memory, unregister from savevm and clean up virtio-common bits on device hot-unplug. This was found performing a migration after device hot-unplug. Reported-by: <lihuang@redhat.com> Signed-off-by: Amit Shah <amit.shah@redhat.com> Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
This commit is contained in:
parent
583cd3cb93
commit
8b53a86577
|
@ -599,6 +599,14 @@ static int virtio_serial_init_pci(PCIDevice *pci_dev)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int virtio_serial_exit_pci(PCIDevice *pci_dev)
|
||||||
|
{
|
||||||
|
VirtIOPCIProxy *proxy = DO_UPCAST(VirtIOPCIProxy, pci_dev, pci_dev);
|
||||||
|
|
||||||
|
virtio_serial_exit(proxy->vdev);
|
||||||
|
return virtio_exit_pci(pci_dev);
|
||||||
|
}
|
||||||
|
|
||||||
static int virtio_net_init_pci(PCIDevice *pci_dev)
|
static int virtio_net_init_pci(PCIDevice *pci_dev)
|
||||||
{
|
{
|
||||||
VirtIOPCIProxy *proxy = DO_UPCAST(VirtIOPCIProxy, pci_dev, pci_dev);
|
VirtIOPCIProxy *proxy = DO_UPCAST(VirtIOPCIProxy, pci_dev, pci_dev);
|
||||||
|
@ -689,7 +697,7 @@ static PCIDeviceInfo virtio_info[] = {
|
||||||
.qdev.alias = "virtio-serial",
|
.qdev.alias = "virtio-serial",
|
||||||
.qdev.size = sizeof(VirtIOPCIProxy),
|
.qdev.size = sizeof(VirtIOPCIProxy),
|
||||||
.init = virtio_serial_init_pci,
|
.init = virtio_serial_init_pci,
|
||||||
.exit = virtio_exit_pci,
|
.exit = virtio_serial_exit_pci,
|
||||||
.qdev.props = (Property[]) {
|
.qdev.props = (Property[]) {
|
||||||
DEFINE_PROP_UINT32("vectors", VirtIOPCIProxy, nvectors,
|
DEFINE_PROP_UINT32("vectors", VirtIOPCIProxy, nvectors,
|
||||||
DEV_NVECTORS_UNSPECIFIED),
|
DEV_NVECTORS_UNSPECIFIED),
|
||||||
|
|
|
@ -41,6 +41,8 @@ struct VirtIOSerial {
|
||||||
|
|
||||||
VirtIOSerialBus *bus;
|
VirtIOSerialBus *bus;
|
||||||
|
|
||||||
|
DeviceState *qdev;
|
||||||
|
|
||||||
QTAILQ_HEAD(, VirtIOSerialPort) ports;
|
QTAILQ_HEAD(, VirtIOSerialPort) ports;
|
||||||
|
|
||||||
/* bitmap for identifying active ports */
|
/* bitmap for identifying active ports */
|
||||||
|
@ -792,6 +794,8 @@ VirtIODevice *virtio_serial_init(DeviceState *dev, uint32_t max_nr_ports)
|
||||||
vser->vdev.get_config = get_config;
|
vser->vdev.get_config = get_config;
|
||||||
vser->vdev.set_config = set_config;
|
vser->vdev.set_config = set_config;
|
||||||
|
|
||||||
|
vser->qdev = dev;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Register for the savevm section with the virtio-console name
|
* Register for the savevm section with the virtio-console name
|
||||||
* to preserve backward compat
|
* to preserve backward compat
|
||||||
|
@ -801,3 +805,16 @@ VirtIODevice *virtio_serial_init(DeviceState *dev, uint32_t max_nr_ports)
|
||||||
|
|
||||||
return vdev;
|
return vdev;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void virtio_serial_exit(VirtIODevice *vdev)
|
||||||
|
{
|
||||||
|
VirtIOSerial *vser = DO_UPCAST(VirtIOSerial, vdev, vdev);
|
||||||
|
|
||||||
|
unregister_savevm(vser->qdev, "virtio-console", vser);
|
||||||
|
|
||||||
|
qemu_free(vser->ivqs);
|
||||||
|
qemu_free(vser->ovqs);
|
||||||
|
qemu_free(vser->ports_map);
|
||||||
|
|
||||||
|
virtio_cleanup(vdev);
|
||||||
|
}
|
||||||
|
|
|
@ -195,6 +195,7 @@ VirtIODevice *virtio_9p_init(DeviceState *dev, V9fsConf *conf);
|
||||||
|
|
||||||
void virtio_net_exit(VirtIODevice *vdev);
|
void virtio_net_exit(VirtIODevice *vdev);
|
||||||
void virtio_blk_exit(VirtIODevice *vdev);
|
void virtio_blk_exit(VirtIODevice *vdev);
|
||||||
|
void virtio_serial_exit(VirtIODevice *vdev);
|
||||||
|
|
||||||
#define DEFINE_VIRTIO_COMMON_FEATURES(_state, _field) \
|
#define DEFINE_VIRTIO_COMMON_FEATURES(_state, _field) \
|
||||||
DEFINE_PROP_BIT("indirect_desc", _state, _field, \
|
DEFINE_PROP_BIT("indirect_desc", _state, _field, \
|
||||||
|
|
Loading…
Reference in New Issue