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