qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-devel] [PATCH] virtio-serial: Cleanup on device hot-unplug


From: Anthony Liguori
Subject: Re: [Qemu-devel] [PATCH] virtio-serial: Cleanup on device hot-unplug
Date: Sun, 22 Aug 2010 16:30:34 -0500
User-agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.1.11) Gecko/20100713 Lightning/1.0b1 Thunderbird/3.0.6

On 08/18/2010 08:21 PM, Amit Shah wrote:
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:<address@hidden>
Signed-off-by: Amit Shah<address@hidden>

Applied.  Thanks.

Regards,

Anthony Liguori
---
  hw/virtio-pci.c        |   10 +++++++++-
  hw/virtio-serial-bus.c |   17 +++++++++++++++++
  hw/virtio.h            |    1 +
  3 files changed, 27 insertions(+), 1 deletions(-)

diff --git a/hw/virtio-pci.c b/hw/virtio-pci.c
index 17c3d15..82a6d78 100644
--- a/hw/virtio-pci.c
+++ b/hw/virtio-pci.c
@@ -599,6 +599,14 @@ static int virtio_serial_init_pci(PCIDevice *pci_dev)
      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)
  {
      VirtIOPCIProxy *proxy = DO_UPCAST(VirtIOPCIProxy, pci_dev, pci_dev);
@@ -689,7 +697,7 @@ static PCIDeviceInfo virtio_info[] = {
          .qdev.alias = "virtio-serial",
          .qdev.size = sizeof(VirtIOPCIProxy),
          .init      = virtio_serial_init_pci,
-        .exit      = virtio_exit_pci,
+        .exit      = virtio_serial_exit_pci,
          .qdev.props = (Property[]) {
              DEFINE_PROP_UINT32("vectors", VirtIOPCIProxy, nvectors,
                                 DEV_NVECTORS_UNSPECIFIED),
diff --git a/hw/virtio-serial-bus.c b/hw/virtio-serial-bus.c
index 0586b89..74ba5ec 100644
--- a/hw/virtio-serial-bus.c
+++ b/hw/virtio-serial-bus.c
@@ -41,6 +41,8 @@ struct VirtIOSerial {

      VirtIOSerialBus *bus;

+    DeviceState *qdev;
+
      QTAILQ_HEAD(, VirtIOSerialPort) 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.set_config = set_config;

+    vser->qdev = dev;
+
      /*
       * Register for the savevm section with the virtio-console name
       * to preserve backward compat
@@ -801,3 +805,16 @@ VirtIODevice *virtio_serial_init(DeviceState *dev, 
uint32_t max_nr_ports)

      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);
+}
diff --git a/hw/virtio.h b/hw/virtio.h
index 30e472a..5836ab6 100644
--- a/hw/virtio.h
+++ b/hw/virtio.h
@@ -195,6 +195,7 @@ VirtIODevice *virtio_9p_init(DeviceState *dev, V9fsConf 
*conf);

  void virtio_net_exit(VirtIODevice *vdev);
  void virtio_blk_exit(VirtIODevice *vdev);
+void virtio_serial_exit(VirtIODevice *vdev);

  #define DEFINE_VIRTIO_COMMON_FEATURES(_state, _field) \
        DEFINE_PROP_BIT("indirect_desc", _state, _field, \




reply via email to

[Prev in Thread] Current Thread [Next in Thread]