9ae3a8
From c2d17bffc7268369f912357d7061db65e398432f Mon Sep 17 00:00:00 2001
9ae3a8
Message-Id: <c2d17bffc7268369f912357d7061db65e398432f.1387288155.git.minovotn@redhat.com>
9ae3a8
In-Reply-To: <527da6c2ce2c09d0183aa8595fc95f136f61b6df.1387288155.git.minovotn@redhat.com>
9ae3a8
References: <527da6c2ce2c09d0183aa8595fc95f136f61b6df.1387288155.git.minovotn@redhat.com>
9ae3a8
From: Stefan Hajnoczi <stefanha@redhat.com>
9ae3a8
Date: Thu, 12 Dec 2013 16:21:22 +0100
9ae3a8
Subject: [PATCH 2/8] qdev: Drop misleading qdev_free() function
9ae3a8
MIME-Version: 1.0
9ae3a8
Content-Type: text/plain; charset=UTF-8
9ae3a8
Content-Transfer-Encoding: 8bit
9ae3a8
9ae3a8
RH-Author: Stefan Hajnoczi <stefanha@redhat.com>
9ae3a8
Message-id: <1386865288-1575-3-git-send-email-stefanha@redhat.com>
9ae3a8
Patchwork-id: 56256
9ae3a8
O-Subject: [RHEL7 qemu-kvm PATCH 2/8] qdev: Drop misleading qdev_free() function
9ae3a8
Bugzilla: 1003773
9ae3a8
RH-Acked-by: Paolo Bonzini <pbonzini@redhat.com>
9ae3a8
RH-Acked-by: Jeffrey Cody <jcody@redhat.com>
9ae3a8
RH-Acked-by: Markus Armbruster <armbru@redhat.com>
9ae3a8
9ae3a8
The qdev_free() function name is misleading since all the function does
9ae3a8
is unlink the device from its parent.  The device is not necessarily
9ae3a8
freed.
9ae3a8
9ae3a8
The device will be freed when its QObject refcount reaches zero.  It is
9ae3a8
usual for the parent (bus) to hold the final reference but there are
9ae3a8
cases where something else holds a reference so "free" is a misleading
9ae3a8
name.
9ae3a8
9ae3a8
Call object_unparent(obj) directly instead of having a qdev wrapper
9ae3a8
function.
9ae3a8
9ae3a8
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
9ae3a8
Reviewed-by: Eric Blake <eblake@redhat.com>
9ae3a8
Signed-off-by: Andreas Färber <afaerber@suse.de>
9ae3a8
(cherry picked from commit 02a5c4c97422b40034f31265e0f139f7846172a8)
9ae3a8
9ae3a8
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
9ae3a8
9ae3a8
Conflicts:
9ae3a8
	hw/scsi/scsi-bus.c
9ae3a8
	hw/xen/xen_platform.c
9ae3a8
9ae3a8
The conflicts are straightforward.
9ae3a8
---
9ae3a8
 hw/acpi/piix4.c        |  2 +-
9ae3a8
 hw/core/qdev.c         | 12 +++---------
9ae3a8
 hw/pci/pci-hotplug.c   |  2 +-
9ae3a8
 hw/pci/pci_bridge.c    |  2 +-
9ae3a8
 hw/pci/pcie.c          |  2 +-
9ae3a8
 hw/pci/shpc.c          |  2 +-
9ae3a8
 hw/s390x/virtio-ccw.c  |  2 +-
9ae3a8
 hw/scsi/scsi-bus.c     |  4 ++--
9ae3a8
 hw/usb/bus.c           |  7 ++++---
9ae3a8
 hw/usb/dev-storage.c   |  2 +-
9ae3a8
 hw/usb/host-legacy.c   |  2 +-
9ae3a8
 hw/virtio/virtio-bus.c |  4 +---
9ae3a8
 hw/xen/xen_platform.c  |  2 +-
9ae3a8
 include/hw/qdev-core.h |  1 -
9ae3a8
 qdev-monitor.c         |  2 +-
9ae3a8
 15 files changed, 20 insertions(+), 28 deletions(-)
9ae3a8
9ae3a8
Signed-off-by: Michal Novotny <minovotn@redhat.com>
9ae3a8
---
9ae3a8
 hw/acpi/piix4.c        |  2 +-
9ae3a8
 hw/core/qdev.c         | 12 +++---------
9ae3a8
 hw/pci/pci-hotplug.c   |  2 +-
9ae3a8
 hw/pci/pci_bridge.c    |  2 +-
9ae3a8
 hw/pci/pcie.c          |  2 +-
9ae3a8
 hw/pci/shpc.c          |  2 +-
9ae3a8
 hw/s390x/virtio-ccw.c  |  2 +-
9ae3a8
 hw/scsi/scsi-bus.c     |  4 ++--
9ae3a8
 hw/usb/bus.c           |  7 ++++---
9ae3a8
 hw/usb/dev-storage.c   |  2 +-
9ae3a8
 hw/usb/host-legacy.c   |  2 +-
9ae3a8
 hw/virtio/virtio-bus.c |  4 +---
9ae3a8
 hw/xen/xen_platform.c  |  2 +-
9ae3a8
 include/hw/qdev-core.h |  1 -
9ae3a8
 qdev-monitor.c         |  2 +-
9ae3a8
 15 files changed, 20 insertions(+), 28 deletions(-)
9ae3a8
9ae3a8
diff --git a/hw/acpi/piix4.c b/hw/acpi/piix4.c
9ae3a8
index d79a7b0..8af97cf 100644
9ae3a8
--- a/hw/acpi/piix4.c
9ae3a8
+++ b/hw/acpi/piix4.c
9ae3a8
@@ -315,7 +315,7 @@ static void acpi_piix_eject_slot(PIIX4PMState *s, unsigned slots)
9ae3a8
             if (pc->no_hotplug) {
9ae3a8
                 slot_free = false;
9ae3a8
             } else {
9ae3a8
-                qdev_free(qdev);
9ae3a8
+                object_unparent(OBJECT(qdev));
9ae3a8
             }
9ae3a8
         }
9ae3a8
     }
9ae3a8
diff --git a/hw/core/qdev.c b/hw/core/qdev.c
9ae3a8
index 9190a7e..70a0dee 100644
9ae3a8
--- a/hw/core/qdev.c
9ae3a8
+++ b/hw/core/qdev.c
9ae3a8
@@ -164,7 +164,7 @@ int qdev_init(DeviceState *dev)
9ae3a8
     if (local_err != NULL) {
9ae3a8
         qerror_report_err(local_err);
9ae3a8
         error_free(local_err);
9ae3a8
-        qdev_free(dev);
9ae3a8
+        object_unparent(OBJECT(dev));
9ae3a8
         return -1;
9ae3a8
     }
9ae3a8
     return 0;
9ae3a8
@@ -258,7 +258,7 @@ void qbus_reset_all_fn(void *opaque)
9ae3a8
 int qdev_simple_unplug_cb(DeviceState *dev)
9ae3a8
 {
9ae3a8
     /* just zap it */
9ae3a8
-    qdev_free(dev);
9ae3a8
+    object_unparent(OBJECT(dev));
9ae3a8
     return 0;
9ae3a8
 }
9ae3a8
 
9ae3a8
@@ -280,12 +280,6 @@ void qdev_init_nofail(DeviceState *dev)
9ae3a8
     }
9ae3a8
 }
9ae3a8
 
9ae3a8
-/* Unlink device from bus and free the structure.  */
9ae3a8
-void qdev_free(DeviceState *dev)
9ae3a8
-{
9ae3a8
-    object_unparent(OBJECT(dev));
9ae3a8
-}
9ae3a8
-
9ae3a8
 void qdev_machine_creation_done(void)
9ae3a8
 {
9ae3a8
     /*
9ae3a8
@@ -458,7 +452,7 @@ static void bus_unparent(Object *obj)
9ae3a8
 
9ae3a8
     while ((kid = QTAILQ_FIRST(&bus->children)) != NULL) {
9ae3a8
         DeviceState *dev = kid->child;
9ae3a8
-        qdev_free(dev);
9ae3a8
+        object_unparent(OBJECT(dev));
9ae3a8
     }
9ae3a8
     if (bus->parent) {
9ae3a8
         QLIST_REMOVE(bus, sibling);
9ae3a8
diff --git a/hw/pci/pci-hotplug.c b/hw/pci/pci-hotplug.c
9ae3a8
index c708752..667e40c 100644
9ae3a8
--- a/hw/pci/pci-hotplug.c
9ae3a8
+++ b/hw/pci/pci-hotplug.c
9ae3a8
@@ -224,7 +224,7 @@ static PCIDevice *qemu_pci_hot_add_storage(Monitor *mon,
9ae3a8
         }
9ae3a8
         dev = pci_create(bus, devfn, "virtio-blk-pci");
9ae3a8
         if (qdev_prop_set_drive(&dev->qdev, "drive", dinfo->bdrv) < 0) {
9ae3a8
-            qdev_free(&dev->qdev);
9ae3a8
+            object_unparent(OBJECT(dev));
9ae3a8
             dev = NULL;
9ae3a8
             break;
9ae3a8
         }
9ae3a8
diff --git a/hw/pci/pci_bridge.c b/hw/pci/pci_bridge.c
9ae3a8
index 3897bd8..a786f26 100644
9ae3a8
--- a/hw/pci/pci_bridge.c
9ae3a8
+++ b/hw/pci/pci_bridge.c
9ae3a8
@@ -386,7 +386,7 @@ void pci_bridge_exitfn(PCIDevice *pci_dev)
9ae3a8
     pci_bridge_region_cleanup(s, s->windows);
9ae3a8
     memory_region_destroy(&s->address_space_mem);
9ae3a8
     memory_region_destroy(&s->address_space_io);
9ae3a8
-    /* qbus_free() is called automatically by qdev_free() */
9ae3a8
+    /* qbus_free() is called automatically during device deletion */
9ae3a8
 }
9ae3a8
 
9ae3a8
 /*
9ae3a8
diff --git a/hw/pci/pcie.c b/hw/pci/pcie.c
9ae3a8
index 62bd0b8..4b84443 100644
9ae3a8
--- a/hw/pci/pcie.c
9ae3a8
+++ b/hw/pci/pcie.c
9ae3a8
@@ -251,7 +251,7 @@ static int pcie_cap_slot_hotplug(DeviceState *qdev,
9ae3a8
                                    PCI_EXP_SLTSTA_PDS);
9ae3a8
         pcie_cap_slot_event(d, PCI_EXP_HP_EV_PDC);
9ae3a8
     } else {
9ae3a8
-        qdev_free(&pci_dev->qdev);
9ae3a8
+        object_unparent(OBJECT(pci_dev));
9ae3a8
         pci_word_test_and_clear_mask(exp_cap + PCI_EXP_SLTSTA,
9ae3a8
                                      PCI_EXP_SLTSTA_PDS);
9ae3a8
         pcie_cap_slot_event(d, PCI_EXP_HP_EV_PDC);
9ae3a8
diff --git a/hw/pci/shpc.c b/hw/pci/shpc.c
9ae3a8
index d35c2ee..1e57952 100644
9ae3a8
--- a/hw/pci/shpc.c
9ae3a8
+++ b/hw/pci/shpc.c
9ae3a8
@@ -254,7 +254,7 @@ static void shpc_free_devices_in_slot(SHPCDevice *shpc, int slot)
9ae3a8
          ++devfn) {
9ae3a8
         PCIDevice *affected_dev = shpc->sec_bus->devices[devfn];
9ae3a8
         if (affected_dev) {
9ae3a8
-            qdev_free(&affected_dev->qdev);
9ae3a8
+            object_unparent(OBJECT(affected_dev));
9ae3a8
         }
9ae3a8
     }
9ae3a8
 }
9ae3a8
diff --git a/hw/s390x/virtio-ccw.c b/hw/s390x/virtio-ccw.c
9ae3a8
index d981101..7ba1376 100644
9ae3a8
--- a/hw/s390x/virtio-ccw.c
9ae3a8
+++ b/hw/s390x/virtio-ccw.c
9ae3a8
@@ -1036,7 +1036,7 @@ static int virtio_ccw_busdev_unplug(DeviceState *dev)
9ae3a8
 
9ae3a8
     css_generate_sch_crws(sch->cssid, sch->ssid, sch->schid, 1, 0);
9ae3a8
 
9ae3a8
-    qdev_free(dev);
9ae3a8
+    object_unparent(OBJECT(dev));
9ae3a8
     return 0;
9ae3a8
 }
9ae3a8
 
9ae3a8
diff --git a/hw/scsi/scsi-bus.c b/hw/scsi/scsi-bus.c
9ae3a8
index 9082ea7..6733c1a 100644
9ae3a8
--- a/hw/scsi/scsi-bus.c
9ae3a8
+++ b/hw/scsi/scsi-bus.c
9ae3a8
@@ -178,7 +178,7 @@ static int scsi_qdev_init(DeviceState *qdev)
9ae3a8
         d = scsi_device_find(bus, dev->channel, dev->id, dev->lun);
9ae3a8
         assert(d);
9ae3a8
         if (d->lun == dev->lun && dev != d) {
9ae3a8
-            qdev_free(&d->qdev);
9ae3a8
+            object_unparent(OBJECT(d));
9ae3a8
         }
9ae3a8
     }
9ae3a8
 
9ae3a8
@@ -229,7 +229,7 @@ SCSIDevice *scsi_bus_legacy_add_drive(SCSIBus *bus, BlockDriverState *bdrv,
9ae3a8
         qdev_prop_set_string(dev, "serial", serial);
9ae3a8
     }
9ae3a8
     if (qdev_prop_set_drive(dev, "drive", bdrv) < 0) {
9ae3a8
-        qdev_free(dev);
9ae3a8
+        object_unparent(OBJECT(dev));
9ae3a8
         return NULL;
9ae3a8
     }
9ae3a8
     if (qdev_init(dev) < 0)
9ae3a8
diff --git a/hw/usb/bus.c b/hw/usb/bus.c
9ae3a8
index f83d1de..ade9abc 100644
9ae3a8
--- a/hw/usb/bus.c
9ae3a8
+++ b/hw/usb/bus.c
9ae3a8
@@ -351,8 +351,9 @@ void usb_port_location(USBPort *downstream, USBPort *upstream, int portnr)
9ae3a8
 
9ae3a8
 void usb_unregister_port(USBBus *bus, USBPort *port)
9ae3a8
 {
9ae3a8
-    if (port->dev)
9ae3a8
-        qdev_free(&port->dev->qdev);
9ae3a8
+    if (port->dev) {
9ae3a8
+        object_unparent(OBJECT(port->dev));
9ae3a8
+    }
9ae3a8
     QTAILQ_REMOVE(&bus->free, port, next);
9ae3a8
     bus->nfree--;
9ae3a8
 }
9ae3a8
@@ -500,7 +501,7 @@ int usb_device_delete_addr(int busnr, int addr)
9ae3a8
         return -1;
9ae3a8
     dev = port->dev;
9ae3a8
 
9ae3a8
-    qdev_free(&dev->qdev);
9ae3a8
+    object_unparent(OBJECT(dev));
9ae3a8
     return 0;
9ae3a8
 }
9ae3a8
 
9ae3a8
diff --git a/hw/usb/dev-storage.c b/hw/usb/dev-storage.c
9ae3a8
index 44a0e34..f60b048 100644
9ae3a8
--- a/hw/usb/dev-storage.c
9ae3a8
+++ b/hw/usb/dev-storage.c
9ae3a8
@@ -699,7 +699,7 @@ static USBDevice *usb_msd_init(USBBus *bus, const char *filename)
9ae3a8
         return NULL;
9ae3a8
     }
9ae3a8
     if (qdev_prop_set_drive(&dev->qdev, "drive", dinfo->bdrv) < 0) {
9ae3a8
-        qdev_free(&dev->qdev);
9ae3a8
+        object_unparent(OBJECT(dev));
9ae3a8
         return NULL;
9ae3a8
     }
9ae3a8
     if (qdev_init(&dev->qdev) < 0)
9ae3a8
diff --git a/hw/usb/host-legacy.c b/hw/usb/host-legacy.c
9ae3a8
index 3a5f705..3cc9c42 100644
9ae3a8
--- a/hw/usb/host-legacy.c
9ae3a8
+++ b/hw/usb/host-legacy.c
9ae3a8
@@ -132,7 +132,7 @@ USBDevice *usb_host_device_open(USBBus *bus, const char *devname)
9ae3a8
     return dev;
9ae3a8
 
9ae3a8
 fail:
9ae3a8
-    qdev_free(&dev->qdev);
9ae3a8
+    object_unparent(OBJECT(dev));
9ae3a8
     return NULL;
9ae3a8
 }
9ae3a8
 
9ae3a8
diff --git a/hw/virtio/virtio-bus.c b/hw/virtio/virtio-bus.c
9ae3a8
index 6849a01..e6b103c 100644
9ae3a8
--- a/hw/virtio/virtio-bus.c
9ae3a8
+++ b/hw/virtio/virtio-bus.c
9ae3a8
@@ -67,7 +67,6 @@ void virtio_bus_reset(VirtioBusState *bus)
9ae3a8
 /* Destroy the VirtIODevice */
9ae3a8
 void virtio_bus_destroy_device(VirtioBusState *bus)
9ae3a8
 {
9ae3a8
-    DeviceState *qdev;
9ae3a8
     BusState *qbus = BUS(bus);
9ae3a8
     VirtioBusClass *klass = VIRTIO_BUS_GET_CLASS(bus);
9ae3a8
     DPRINTF("%s: remove device.\n", qbus->name);
9ae3a8
@@ -76,8 +75,7 @@ void virtio_bus_destroy_device(VirtioBusState *bus)
9ae3a8
         if (klass->device_unplug != NULL) {
9ae3a8
             klass->device_unplug(qbus->parent);
9ae3a8
         }
9ae3a8
-        qdev = DEVICE(bus->vdev);
9ae3a8
-        qdev_free(qdev);
9ae3a8
+        object_unparent(OBJECT(bus->vdev));
9ae3a8
         bus->vdev = NULL;
9ae3a8
     }
9ae3a8
 }
9ae3a8
diff --git a/hw/xen/xen_platform.c b/hw/xen/xen_platform.c
9ae3a8
index bb9d0cd..98fe405 100644
9ae3a8
--- a/hw/xen/xen_platform.c
9ae3a8
+++ b/hw/xen/xen_platform.c
9ae3a8
@@ -88,7 +88,7 @@ static void unplug_nic(PCIBus *b, PCIDevice *d, void *o)
9ae3a8
     if (pci_get_word(d->config + PCI_CLASS_DEVICE) ==
9ae3a8
             PCI_CLASS_NETWORK_ETHERNET
9ae3a8
             && strcmp(d->name, "xen-pci-passthrough") != 0) {
9ae3a8
-        qdev_free(&d->qdev);
9ae3a8
+        object_unparent(OBJECT(d));
9ae3a8
     }
9ae3a8
 }
9ae3a8
 
9ae3a8
diff --git a/include/hw/qdev-core.h b/include/hw/qdev-core.h
9ae3a8
index 44feb54..ad39ea9 100644
9ae3a8
--- a/include/hw/qdev-core.h
9ae3a8
+++ b/include/hw/qdev-core.h
9ae3a8
@@ -232,7 +232,6 @@ void qdev_init_nofail(DeviceState *dev);
9ae3a8
 void qdev_set_legacy_instance_id(DeviceState *dev, int alias_id,
9ae3a8
                                  int required_for_version);
9ae3a8
 void qdev_unplug(DeviceState *dev, Error **errp);
9ae3a8
-void qdev_free(DeviceState *dev);
9ae3a8
 int qdev_simple_unplug_cb(DeviceState *dev);
9ae3a8
 void qdev_machine_creation_done(void);
9ae3a8
 bool qdev_machine_modified(void);
9ae3a8
diff --git a/qdev-monitor.c b/qdev-monitor.c
9ae3a8
index 9d4f61d..f78ff64 100644
9ae3a8
--- a/qdev-monitor.c
9ae3a8
+++ b/qdev-monitor.c
9ae3a8
@@ -521,7 +521,7 @@ DeviceState *qdev_device_add(QemuOpts *opts)
9ae3a8
         qdev->id = id;
9ae3a8
     }
9ae3a8
     if (qemu_opt_foreach(opts, set_property, qdev, 1) != 0) {
9ae3a8
-        qdev_free(qdev);
9ae3a8
+        object_unparent(OBJECT(qdev));
9ae3a8
         object_unref(OBJECT(qdev));
9ae3a8
         return NULL;
9ae3a8
     }
9ae3a8
-- 
9ae3a8
1.7.11.7
9ae3a8