diff options
author | Michael Roth <mdroth@linux.vnet.ibm.com> | 2017-10-16 17:23:14 -0500 |
---|---|---|
committer | Paolo Bonzini <pbonzini@redhat.com> | 2017-10-18 10:34:50 +0200 |
commit | 2fc06c4ac65594ad248e9a9150ebdde9ff5a1253 (patch) | |
tree | 792b9842201ca6e2475018d6621b9995ce06cc64 | |
parent | 04162f8f4bcf8c9ae2422def4357289b44208c8c (diff) | |
download | qemu-2fc06c4ac65594ad248e9a9150ebdde9ff5a1253.zip qemu-2fc06c4ac65594ad248e9a9150ebdde9ff5a1253.tar.gz qemu-2fc06c4ac65594ad248e9a9150ebdde9ff5a1253.tar.bz2 |
Revert "qdev: Free QemuOpts when the QOM path goes away"
This reverts commit abed886ec60cf239a03515cf0b30fb11fa964c44.
This patch originally addressed an issue where a DEVICE_DELETED
event could be emitted (in device_unparent()) before a Device's
QemuOpts were cleaned up (in device_finalize()), leading to a
"duplicate ID" error if management attempted to immediately add
a device with the same ID in response to the DEVICE_DELETED event.
An alternative will be implemented in a subsequent patch where we
defer the DEVICE_DELETED event until device_finalize(), which would
also prevent the race, so we revert the original fix in preparation.
Signed-off-by: Michael Roth <mdroth@linux.vnet.ibm.com>
Reviewed-by: Greg Kurz <groug@kaod.org>
Tested-by: Eric Auger <eric.auger@redhat.com>
Reviewed-by: David Gibson <david@gibson.dropbear.id.au>
Message-Id: <20171016222315.407-3-mdroth@linux.vnet.ibm.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
-rw-r--r-- | hw/core/qdev.c | 4 |
1 files changed, 1 insertions, 3 deletions
diff --git a/hw/core/qdev.c b/hw/core/qdev.c index 0019a49..418cdac 100644 --- a/hw/core/qdev.c +++ b/hw/core/qdev.c @@ -1069,6 +1069,7 @@ static void device_finalize(Object *obj) NamedGPIOList *ngl, *next; DeviceState *dev = DEVICE(obj); + qemu_opts_del(dev->opts); QLIST_FOREACH_SAFE(ngl, &dev->gpios, node, next) { QLIST_REMOVE(ngl, node); @@ -1118,9 +1119,6 @@ static void device_unparent(Object *obj) g_free(dev->canonical_path); dev->canonical_path = NULL; } - - qemu_opts_del(dev->opts); - dev->opts = NULL; } static void device_class_init(ObjectClass *class, void *data) |