diff options
author | Paolo Bonzini <pbonzini@redhat.com> | 2025-02-03 12:35:39 +0100 |
---|---|---|
committer | Paolo Bonzini <pbonzini@redhat.com> | 2025-05-20 08:18:53 +0200 |
commit | 220c739903cec99df032219ac94c45b5269a0ab5 (patch) | |
tree | 5fac63709fab495902a93ed1d40cb22fbaa2642f | |
parent | 42bc8af14033b9eeeb535449f243767c015f027e (diff) | |
download | qemu-220c739903cec99df032219ac94c45b5269a0ab5.zip qemu-220c739903cec99df032219ac94c45b5269a0ab5.tar.gz qemu-220c739903cec99df032219ac94c45b5269a0ab5.tar.bz2 |
qom: reverse order of instance_post_init calls
Currently, the instance_post_init calls are performed from the leaf
class and all the way up to Object. This is incorrect because the
leaf class cannot observe property values applied by the superclasses;
for example, a compat property will be set on a device *after*
the class's post_init callback has run.
In particular this makes it impossible for implementations of
accel_cpu_instance_init() to operate based on the actual values of
the properties, though it seems that cxl_dsp_instance_post_init and
rp_instance_post_init might have similar issues.
Follow instead the same order as instance_init, starting with Object
and running the child class's instance_post_init after the parent.
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
-rw-r--r-- | include/qom/object.h | 3 | ||||
-rw-r--r-- | qom/object.c | 8 |
2 files changed, 6 insertions, 5 deletions
diff --git a/include/qom/object.h b/include/qom/object.h index 1d5b033..26df613 100644 --- a/include/qom/object.h +++ b/include/qom/object.h @@ -445,7 +445,8 @@ struct Object * class will have already been initialized so the type is only responsible * for initializing its own members. * @instance_post_init: This function is called to finish initialization of - * an object, after all @instance_init functions were called. + * an object, after all @instance_init functions were called, as well as + * @instance_post_init functions for the parent classes. * @instance_finalize: This function is called during object destruction. This * is called before the parent @instance_finalize function has been called. * An object should only free the members that are unique to its type in this diff --git a/qom/object.c b/qom/object.c index 7b013f4..1856bb3 100644 --- a/qom/object.c +++ b/qom/object.c @@ -431,13 +431,13 @@ static void object_init_with_type(Object *obj, TypeImpl *ti) static void object_post_init_with_type(Object *obj, TypeImpl *ti) { - if (ti->instance_post_init) { - ti->instance_post_init(obj); - } - if (type_has_parent(ti)) { object_post_init_with_type(obj, type_get_parent(ti)); } + + if (ti->instance_post_init) { + ti->instance_post_init(obj); + } } bool object_apply_global_props(Object *obj, const GPtrArray *props, |