From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from [140.186.70.92] (port=40191 helo=eggs.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1OnI7g-0006To-Ov for qemu-devel@nongnu.org; Sun, 22 Aug 2010 17:30:37 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.69) (envelope-from ) id 1OnI7f-0006Pc-K8 for qemu-devel@nongnu.org; Sun, 22 Aug 2010 17:30:36 -0400 Received: from mail-yw0-f45.google.com ([209.85.213.45]:38034) by eggs.gnu.org with esmtp (Exim 4.69) (envelope-from ) id 1OnI7f-0006L8-Gj for qemu-devel@nongnu.org; Sun, 22 Aug 2010 17:30:35 -0400 Received: by mail-yw0-f45.google.com with SMTP id 6so1994428ywa.4 for ; Sun, 22 Aug 2010 14:30:35 -0700 (PDT) Message-ID: <4C7196FA.3070804@codemonkey.ws> Date: Sun, 22 Aug 2010 16:30:34 -0500 From: Anthony Liguori MIME-Version: 1.0 Subject: Re: [Qemu-devel] [PATCH] virtio-serial: Cleanup on device hot-unplug References: In-Reply-To: Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Amit Shah Cc: qemu list , Juan Quintela 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: > Signed-off-by: Amit Shah > 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, \ >