<html><head><meta name="color-scheme" content="light dark"></head><body><pre style="word-wrap: break-word; white-space: pre-wrap;">From fd44579cd58e8974df4cc35818dd9c356751d3b4 Mon Sep 17 00:00:00 2001
From: Amit Shah &lt;amit.shah@redhat.com&gt;
Date: Tue, 13 Sep 2011 16:11:09 +0200
Subject: [PATCH 4/8] virtio-serial: Plug memory leak on qdev exit()

RH-Author: Amit Shah &lt;amit.shah@redhat.com&gt;
Message-id: &lt;f16fc4465fbc2e45fc5d3e21efee79564e9d13fa.1315930259.git.amit.shah@redhat.com&gt;
Patchwork-id: 32725
O-Subject: [PATCH 1/1] virtio-serial: Plug memory leak on qdev exit()
Bugzilla: 738019
RH-Acked-by: Gerd Hoffmann &lt;kraxel@redhat.com&gt;
RH-Acked-by: Markus Armbruster &lt;armbru@redhat.com&gt;
RH-Acked-by: Amos Kong &lt;akong@redhat.com&gt;

From: Markus Armbruster &lt;armbru@redhat.com&gt;

virtio_serial_init() allocates the VirtIOSerialBus dynamically, but
virtio_serial_exit() doesn't free it.

Fix by getting rid of the allocation.

Signed-off-by: Markus Armbruster &lt;armbru@redhat.com&gt;
Signed-off-by: Amit Shah &lt;amit.shah@redhat.com&gt;
(cherry picked from commit 5e52e5f903b2648c59030637e1610b32e965d615)

Bugzilla: 738019

Signed-off-by: Amit Shah &lt;amit.shah@redhat.com&gt;
---
 hw/virtio-serial-bus.c |   27 +++++++++------------------
 1 files changed, 9 insertions(+), 18 deletions(-)

Signed-off-by: Michal Novotny &lt;mignov@gmail.com&gt;
Signed-off-by: Michal Novotny &lt;minovotn@redhat.com&gt;
---
 hw/virtio-serial-bus.c |   27 +++++++++------------------
 1 files changed, 9 insertions(+), 18 deletions(-)

diff --git a/hw/virtio-serial-bus.c b/hw/virtio-serial-bus.c
index 69adbc4..6b3c100 100644
--- a/hw/virtio-serial-bus.c
+++ b/hw/virtio-serial-bus.c
@@ -39,7 +39,7 @@ struct VirtIOSerial {
     /* Arrays of ivqs and ovqs: one per port */
     VirtQueue **ivqs, **ovqs;
 
-    VirtIOSerialBus *bus;
+    VirtIOSerialBus bus;
 
     DeviceState *qdev;
 
@@ -376,7 +376,7 @@ static void handle_control_message(VirtIOSerial *vser, void *buf, size_t len)
     case VIRTIO_CONSOLE_DEVICE_READY:
         if (!cpkt.value) {
             error_report("virtio-serial-bus: Guest failure in adding device %s\n",
-                         vser-&gt;bus-&gt;qbus.name);
+                         vser-&gt;bus.qbus.name);
             break;
         }
         /*
@@ -391,7 +391,7 @@ static void handle_control_message(VirtIOSerial *vser, void *buf, size_t len)
     case VIRTIO_CONSOLE_PORT_READY:
         if (!cpkt.value) {
             error_report("virtio-serial-bus: Guest failure in adding port %u for device %s\n",
-                         port-&gt;id, vser-&gt;bus-&gt;qbus.name);
+                         port-&gt;id, vser-&gt;bus.qbus.name);
             break;
         }
         /*
@@ -525,7 +525,7 @@ static uint32_t get_features(VirtIODevice *vdev, uint32_t features)
 
     vser = DO_UPCAST(VirtIOSerial, vdev, vdev);
 
-    if (vser-&gt;bus-&gt;max_nr_ports &gt; 1) {
+    if (vser-&gt;bus.max_nr_ports &gt; 1) {
         features |= (1 &lt;&lt; VIRTIO_CONSOLE_F_MULTIPORT);
     }
     return features;
@@ -715,16 +715,6 @@ static struct BusInfo virtser_bus_info = {
     .print_dev = virtser_bus_dev_print,
 };
 
-static VirtIOSerialBus *virtser_bus_new(DeviceState *dev)
-{
-    VirtIOSerialBus *bus;
-
-    bus = FROM_QBUS(VirtIOSerialBus, qbus_create(&amp;virtser_bus_info, dev, NULL));
-    bus-&gt;qbus.allow_hotplug = 1;
-
-    return bus;
-}
-
 static void virtser_bus_dev_print(Monitor *mon, DeviceState *qdev, int indent)
 {
     VirtIOSerialDevice *dev = DO_UPCAST(VirtIOSerialDevice, qdev, qdev);
@@ -910,11 +900,12 @@ VirtIODevice *virtio_serial_init(DeviceState *dev, virtio_serial_conf *conf)
     vser = DO_UPCAST(VirtIOSerial, vdev, vdev);
 
     /* Spawn a new virtio-serial bus on which the ports will ride as devices */
-    vser-&gt;bus = virtser_bus_new(dev);
-    vser-&gt;bus-&gt;vser = vser;
+    qbus_create_inplace(&amp;vser-&gt;bus.qbus, &amp;virtser_bus_info, dev, NULL);
+    vser-&gt;bus.qbus.allow_hotplug = 1;
+    vser-&gt;bus.vser = vser;
     QTAILQ_INIT(&amp;vser-&gt;ports);
 
-    vser-&gt;bus-&gt;max_nr_ports = conf-&gt;max_virtserial_ports;
+    vser-&gt;bus.max_nr_ports = conf-&gt;max_virtserial_ports;
     vser-&gt;ivqs = qemu_malloc(conf-&gt;max_virtserial_ports * sizeof(VirtQueue *));
     vser-&gt;ovqs = qemu_malloc(conf-&gt;max_virtserial_ports * sizeof(VirtQueue *));
 
@@ -934,7 +925,7 @@ VirtIODevice *virtio_serial_init(DeviceState *dev, virtio_serial_conf *conf)
     /* control queue: guest to host */
     vser-&gt;c_ovq = virtio_add_queue(vdev, 32, control_out);
 
-    for (i = 1; i &lt; vser-&gt;bus-&gt;max_nr_ports; i++) {
+    for (i = 1; i &lt; vser-&gt;bus.max_nr_ports; i++) {
         /* Add a per-port queue for host to guest transfers */
         vser-&gt;ivqs[i] = virtio_add_queue(vdev, 128, handle_input);
         /* Add a per-per queue for guest to host transfers */
-- 
1.7.4.4

</pre></body></html>