From: "Andreas Färber" <afaerber@suse.de>
To: qemu-devel@nongnu.org
Cc: "Peter Crosthwaite" <peter.crosthwaite@xilinx.com>,
qemu-stable@nongnu.org, "Andreas Färber" <afaerber@suse.de>
Subject: [Qemu-devel] [PULL 14/24] qom: Split out object and class caches
Date: Tue, 24 Dec 2013 17:57:07 +0100 [thread overview]
Message-ID: <1387904237-6941-15-git-send-email-afaerber@suse.de> (raw)
In-Reply-To: <1387904237-6941-1-git-send-email-afaerber@suse.de>
From: Peter Crosthwaite <peter.crosthwaite@xilinx.com>
The object-cast and class-cast caches cannot be shared because class
caching is conditional on the target type not being an interface and
object caching is unconditional. Leads to a bug when a class cast
to an interface follows an object cast to the same interface type:
FooObject = FOO(obj);
FooClass = FOO_GET_CLASS(obj);
Where TYPE_FOO is an interface. The first (object) cast will be
successful and cache the casting result (i.e. TYPE_FOO will be cached).
The second (class) cast will then check the shared cast cache
and register a hit. The issue is, when a class cast hits in the cache
it just returns a pointer cast of the input class (i.e. the concrete
class).
When casting to an interface, the cast itself must return the
interface class, not the concrete class. The implementation of class
cast caching already ensures that the returned cast result is only
a pointer cast before caching. The object cast logic however does
not have this check.
Resolve by just splitting the object and class caches.
Cc: qemu-stable@nongnu.org
Signed-off-by: Peter Crosthwaite <peter.crosthwaite@xilinx.com>
Reviewed-by: Paolo Bonzini <pbonzini@redhat.com>
Tested-by: Nathan Rossi <nathan.rossi@xilinx.com>
Reviewed-by: Edgar E. Iglesias <edgar.iglesias@gmail.com>
Signed-off-by: Andreas Färber <afaerber@suse.de>
---
include/qom/object.h | 3 ++-
qom/object.c | 13 +++++++------
2 files changed, 9 insertions(+), 7 deletions(-)
diff --git a/include/qom/object.h b/include/qom/object.h
index a275db2..5f78847 100644
--- a/include/qom/object.h
+++ b/include/qom/object.h
@@ -358,7 +358,8 @@ struct ObjectClass
Type type;
GSList *interfaces;
- const char *cast_cache[OBJECT_CLASS_CAST_CACHE];
+ const char *object_cast_cache[OBJECT_CLASS_CAST_CACHE];
+ const char *class_cast_cache[OBJECT_CLASS_CAST_CACHE];
ObjectUnparent *unparent;
};
diff --git a/qom/object.c b/qom/object.c
index fc19cf6..21b5a0b 100644
--- a/qom/object.c
+++ b/qom/object.c
@@ -458,7 +458,7 @@ Object *object_dynamic_cast_assert(Object *obj, const char *typename,
Object *inst;
for (i = 0; obj && i < OBJECT_CLASS_CAST_CACHE; i++) {
- if (obj->class->cast_cache[i] == typename) {
+ if (obj->class->object_cast_cache[i] == typename) {
goto out;
}
}
@@ -475,9 +475,10 @@ Object *object_dynamic_cast_assert(Object *obj, const char *typename,
if (obj && obj == inst) {
for (i = 1; i < OBJECT_CLASS_CAST_CACHE; i++) {
- obj->class->cast_cache[i - 1] = obj->class->cast_cache[i];
+ obj->class->object_cast_cache[i - 1] =
+ obj->class->object_cast_cache[i];
}
- obj->class->cast_cache[i - 1] = typename;
+ obj->class->object_cast_cache[i - 1] = typename;
}
out:
@@ -547,7 +548,7 @@ ObjectClass *object_class_dynamic_cast_assert(ObjectClass *class,
int i;
for (i = 0; class && i < OBJECT_CLASS_CAST_CACHE; i++) {
- if (class->cast_cache[i] == typename) {
+ if (class->class_cast_cache[i] == typename) {
ret = class;
goto out;
}
@@ -568,9 +569,9 @@ ObjectClass *object_class_dynamic_cast_assert(ObjectClass *class,
#ifdef CONFIG_QOM_CAST_DEBUG
if (class && ret == class) {
for (i = 1; i < OBJECT_CLASS_CAST_CACHE; i++) {
- class->cast_cache[i - 1] = class->cast_cache[i];
+ class->class_cast_cache[i - 1] = class->class_cast_cache[i];
}
- class->cast_cache[i - 1] = typename;
+ class->class_cast_cache[i - 1] = typename;
}
out:
#endif
--
1.8.4
next prev parent reply other threads:[~2013-12-24 16:57 UTC|newest]
Thread overview: 26+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-12-24 16:56 [Qemu-devel] [PULL 00/24] QOM devices patch queue 2013-12-24 Andreas Färber
2013-12-24 16:56 ` [Qemu-devel] [PULL 01/24] qdev: Replace no_user by cannot_instantiate_with_device_add_yet Andreas Färber
2013-12-24 16:56 ` [Qemu-devel] [PULL 02/24] sysbus: Set cannot_instantiate_with_device_add_yet Andreas Färber
2013-12-24 16:56 ` [Qemu-devel] [PULL 03/24] cpu: Document why cannot_instantiate_with_device_add_yet Andreas Färber
2013-12-24 16:56 ` [Qemu-devel] [PULL 04/24] apic: " Andreas Färber
2013-12-24 16:56 ` [Qemu-devel] [PULL 05/24] pci-host: Consistently set cannot_instantiate_with_device_add_yet Andreas Färber
2013-12-24 16:56 ` [Qemu-devel] [PULL 06/24] ich9: Document why cannot_instantiate_with_device_add_yet Andreas Färber
2013-12-24 16:57 ` [Qemu-devel] [PULL 07/24] piix3 piix4: Clean up use of cannot_instantiate_with_device_add_yet Andreas Färber
2013-12-24 16:57 ` [Qemu-devel] [PULL 08/24] vt82c686: " Andreas Färber
2013-12-24 16:57 ` [Qemu-devel] [PULL 09/24] isa: " Andreas Färber
2013-12-24 16:57 ` [Qemu-devel] [PULL 10/24] qdev: Do not let the user try to device_add when it cannot work Andreas Färber
2013-12-24 16:57 ` [Qemu-devel] [PULL 11/24] qdev-monitor: Avoid device_add crashing on non-device driver name Andreas Färber
2013-12-24 16:57 ` [Qemu-devel] [PULL 12/24] hw: cannot_instantiate_with_device_add_yet due to pointer props Andreas Färber
2013-12-24 16:57 ` [Qemu-devel] [PULL 13/24] qdev: Document that pointer properties kill device_add Andreas Färber
2013-12-24 16:57 ` Andreas Färber [this message]
2013-12-24 16:57 ` [Qemu-devel] [PULL 15/24] qom: Do not register interface "types" in the type table and fix names Andreas Färber
2013-12-24 16:57 ` [Qemu-devel] [PULL 16/24] tests: Test QOM interface casting Andreas Färber
2013-12-24 16:57 ` [Qemu-devel] [PULL 17/24] qom: Detect bad reentrance during object_class_foreach() Andreas Färber
2013-12-24 16:57 ` [Qemu-devel] [PULL 18/24] qdev: Drop misleading qbus_free() function Andreas Färber
2013-12-24 16:57 ` [Qemu-devel] [PULL 19/24] apic: Cleanup for QOM'ification Andreas Färber
2013-12-24 16:57 ` [Qemu-devel] [PULL 20/24] apic: QOM'ify APIC Andreas Färber
2013-12-24 16:57 ` [Qemu-devel] [PULL 21/24] icc_bus: QOM'ify ICC Andreas Färber
2013-12-24 16:57 ` [Qemu-devel] [PULL 22/24] ioapic: Cleanup for QOM'ification Andreas Färber
2013-12-24 16:57 ` [Qemu-devel] [PULL 23/24] ioapic: QOM'ify ioapic Andreas Färber
2013-12-24 16:57 ` [Qemu-devel] [PULL 24/24] qdev-monitor: Improve error message for -device nonexistant Andreas Färber
2013-12-24 17:01 ` [Qemu-devel] [PULL 00/24] QOM devices patch queue 2013-12-24 Andreas Färber
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1387904237-6941-15-git-send-email-afaerber@suse.de \
--to=afaerber@suse.de \
--cc=peter.crosthwaite@xilinx.com \
--cc=qemu-devel@nongnu.org \
--cc=qemu-stable@nongnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).