* [PATCH] include/hw/core/qdev.h: Fix where device_class_set_parent_realize docs suggest putting parent_realize
@ 2026-10-15 16:33 Peter Maydell
2026-10-15 16:44 ` Daniel P. Berrangé
0 siblings, 1 reply; 3+ messages in thread
From: Peter Maydell @ 2026-10-15 16:33 UTC (permalink / raw)
To: qemu-devel; +Cc: Paolo Bonzini, Daniel P. Berrangé, Mark Cave-Ayland
The documentation for device_class_set_parent_realize() suggests that
the parent realize function pointer is "usually in the instance
structure". This is definitely wrong, because the function pointer
is a class thing, and should live in a class struct, not an instance
struct. Update the documentation to correct this, instead
recommending that it should be placed in the class struct for the
child class.
At time of writing, of the 75 or so uses of this function, about 50
put the parent_realize pointer in the child class struct, and about
25 in the parent class struct. We recommend the former both because
it is the more common choice, and also because it makes more logical
sense: it's the child that knows (a) that it exists at all and that
(b) it wants to have a realize method that will mean it needs to
chain back to the parent, and we shouldn't need to edit the parent's
class struct because we want to add a child class that chains to its
realize method.
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
---
include/hw/core/qdev.h | 15 ++++++++++++---
1 file changed, 12 insertions(+), 3 deletions(-)
diff --git a/include/hw/core/qdev.h b/include/hw/core/qdev.h
index 8e91e2fcb08..1330e0153d4 100644
--- a/include/hw/core/qdev.h
+++ b/include/hw/core/qdev.h
@@ -953,9 +953,18 @@ void device_class_set_props_n(DeviceClass *dc, const Property *props, size_t n);
*
* This is intended to be used when the new realize function will
* eventually call its parent realization function during creation.
- * This requires storing the function call somewhere (usually in the
- * instance structure) so you can eventually call
- * dc->parent_realize(dev, errp)
+ * @parent_realize should be where you want to save the pointer to
+ * the parent class realize function; the recommended location is a
+ * field named "parent_realize" in your class's class struct.
+ * (Some existing code puts the field in the parent class's class
+ * struct; this will work but is not the preferred thing for new code.)
+ *
+ * In your realize function you should chain to your parent's
+ * realize function using something like::
+ *
+ * MyThingClass *mc = MY_THING_GET_CLASS(dev);
+ * (do your child class realize actions here)
+ * mc->parent_realize(dev, errp);
*/
void device_class_set_parent_realize(DeviceClass *dc,
DeviceRealize dev_realize,
--
2.43.0
^ permalink raw reply related [flat|nested] 3+ messages in thread* Re: [PATCH] include/hw/core/qdev.h: Fix where device_class_set_parent_realize docs suggest putting parent_realize
2026-10-15 16:33 [PATCH] include/hw/core/qdev.h: Fix where device_class_set_parent_realize docs suggest putting parent_realize Peter Maydell
@ 2026-10-15 16:44 ` Daniel P. Berrangé
2026-10-15 18:16 ` Peter Maydell
0 siblings, 1 reply; 3+ messages in thread
From: Daniel P. Berrangé @ 2026-10-15 16:44 UTC (permalink / raw)
To: Peter Maydell; +Cc: qemu-devel, Paolo Bonzini, Mark Cave-Ayland
On Thu, Oct 15, 2026 at 05:33:52PM +0100, Peter Maydell wrote:
> The documentation for device_class_set_parent_realize() suggests that
> the parent realize function pointer is "usually in the instance
> structure". This is definitely wrong, because the function pointer
> is a class thing, and should live in a class struct, not an instance
> struct. Update the documentation to correct this, instead
> recommending that it should be placed in the class struct for the
> child class.
>
> At time of writing, of the 75 or so uses of this function, about 50
> put the parent_realize pointer in the child class struct, and about
> 25 in the parent class struct. We recommend the former both because
> it is the more common choice, and also because it makes more logical
> sense: it's the child that knows (a) that it exists at all and that
> (b) it wants to have a realize method that will mean it needs to
> chain back to the parent, and we shouldn't need to edit the parent's
> class struct because we want to add a child class that chains to its
> realize method.
I'm confused why we need to store a copy of the parent's
realize method at all, when we can just reference it from
the parent class struct ?
Taking one example
static void pl050_kbd_realize(DeviceState *dev, Error **errp)
{
PL050DeviceClass *pdc = PL050_GET_CLASS(dev);
PL050KbdState *s = PL050_KBD_DEVICE(dev);
PL050State *ps = PL050(dev);
if (!sysbus_realize(SYS_BUS_DEVICE(&s->kbd), errp)) {
return;
}
ps->ps2dev = PS2_DEVICE(&s->kbd);
pdc->parent_realize(dev, errp);
}
why wouldn't we rewrite that as
static void pl050_kbd_realize(DeviceState *dev, Error **errp)
{
PL050DeviceClass *pdc = PL050_GET_CLASS(dev);
DeviceClass *parent = DEVICE_CLASS(object_class_get_parent(OBJECT_CLASS(pdc)));
PL050KbdState *s = PL050_KBD_DEVICE(dev);
PL050State *ps = PL050(dev);
if (!sysbus_realize(SYS_BUS_DEVICE(&s->kbd), errp)) {
return;
}
ps->ps2dev = PS2_DEVICE(&s->kbd);
parent->realize(dev, errp);
}
am I missing a reason we need to store the parent's
realize method pointer ?
>
> Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
> ---
> include/hw/core/qdev.h | 15 ++++++++++++---
> 1 file changed, 12 insertions(+), 3 deletions(-)
>
> diff --git a/include/hw/core/qdev.h b/include/hw/core/qdev.h
> index 8e91e2fcb08..1330e0153d4 100644
> --- a/include/hw/core/qdev.h
> +++ b/include/hw/core/qdev.h
> @@ -953,9 +953,18 @@ void device_class_set_props_n(DeviceClass *dc, const Property *props, size_t n);
> *
> * This is intended to be used when the new realize function will
> * eventually call its parent realization function during creation.
> - * This requires storing the function call somewhere (usually in the
> - * instance structure) so you can eventually call
> - * dc->parent_realize(dev, errp)
> + * @parent_realize should be where you want to save the pointer to
> + * the parent class realize function; the recommended location is a
> + * field named "parent_realize" in your class's class struct.
> + * (Some existing code puts the field in the parent class's class
> + * struct; this will work but is not the preferred thing for new code.)
> + *
> + * In your realize function you should chain to your parent's
> + * realize function using something like::
> + *
> + * MyThingClass *mc = MY_THING_GET_CLASS(dev);
> + * (do your child class realize actions here)
> + * mc->parent_realize(dev, errp);
> */
> void device_class_set_parent_realize(DeviceClass *dc,
> DeviceRealize dev_realize,
> --
> 2.43.0
>
With regards,
Daniel
--
|: https://berrange.com ~~ https://hachyderm.io/@berrange :|
|: https://libvirt.org ~~ https://entangle-photo.org :|
|: https://pixelfed.art/berrange ~~ https://fstop138.berrange.com :|
^ permalink raw reply [flat|nested] 3+ messages in thread* Re: [PATCH] include/hw/core/qdev.h: Fix where device_class_set_parent_realize docs suggest putting parent_realize
2026-10-15 16:44 ` Daniel P. Berrangé
@ 2026-10-15 18:16 ` Peter Maydell
0 siblings, 0 replies; 3+ messages in thread
From: Peter Maydell @ 2026-10-15 18:16 UTC (permalink / raw)
To: Daniel P. Berrangé; +Cc: qemu-devel, Paolo Bonzini, Mark Cave-Ayland
On Thu, 15 Oct 2026 at 17:44, Daniel P. Berrangé <berrange@redhat.com> wrote:
>
> On Thu, Oct 15, 2026 at 05:33:52PM +0100, Peter Maydell wrote:
> > The documentation for device_class_set_parent_realize() suggests that
> > the parent realize function pointer is "usually in the instance
> > structure". This is definitely wrong, because the function pointer
> > is a class thing, and should live in a class struct, not an instance
> > struct. Update the documentation to correct this, instead
> > recommending that it should be placed in the class struct for the
> > child class.
> >
> > At time of writing, of the 75 or so uses of this function, about 50
> > put the parent_realize pointer in the child class struct, and about
> > 25 in the parent class struct. We recommend the former both because
> > it is the more common choice, and also because it makes more logical
> > sense: it's the child that knows (a) that it exists at all and that
> > (b) it wants to have a realize method that will mean it needs to
> > chain back to the parent, and we shouldn't need to edit the parent's
> > class struct because we want to add a child class that chains to its
> > realize method.
>
> I'm confused why we need to store a copy of the parent's
> realize method at all, when we can just reference it from
> the parent class struct ?
>
> Taking one example
>
> static void pl050_kbd_realize(DeviceState *dev, Error **errp)
> {
> PL050DeviceClass *pdc = PL050_GET_CLASS(dev);
> PL050KbdState *s = PL050_KBD_DEVICE(dev);
> PL050State *ps = PL050(dev);
>
> if (!sysbus_realize(SYS_BUS_DEVICE(&s->kbd), errp)) {
> return;
> }
>
> ps->ps2dev = PS2_DEVICE(&s->kbd);
> pdc->parent_realize(dev, errp);
> }
>
> why wouldn't we rewrite that as
>
> static void pl050_kbd_realize(DeviceState *dev, Error **errp)
> {
> PL050DeviceClass *pdc = PL050_GET_CLASS(dev);
> DeviceClass *parent = DEVICE_CLASS(object_class_get_parent(OBJECT_CLASS(pdc)));
> PL050KbdState *s = PL050_KBD_DEVICE(dev);
> PL050State *ps = PL050(dev);
>
> if (!sysbus_realize(SYS_BUS_DEVICE(&s->kbd), errp)) {
> return;
> }
>
> ps->ps2dev = PS2_DEVICE(&s->kbd);
> parent->realize(dev, errp);
> }
>
> am I missing a reason we need to store the parent's
> realize method pointer ?
Because the parent class's struct doesn't have a pointer to
its realize method. pl050_class_init() does this to set
up its realize method:
DeviceClass *dc = DEVICE_CLASS(oc);
dc->realize = pl050_realize;
and that's the only place where pl050_realize is pointed to.
To put the child class's realize method into place we need
to overwrite the DeviceClass::realize field, which means we
need somewhere to put the old value.
We could alternatively solve this by saying:
(a) every class struct must have a "realize" field,
and the class init sets both DeviceClass::realize and
MyClass::realize (perhaps restrict this to only "every
class that has or might need to have subclasses")
(b) to chain to the superclass realize, get the MyParentClass
class pointer and call MyParentClass::realize
The support (or lack thereof) in QOM for methods like realize,
unrealize and reset which should pretty much always chain to
their parent class implementation is pretty terrible, so if
we can come up with something more ergonomic I'd be happy to
throw out the hacks we have today.
thanks
-- PMM
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2026-10-15 18:17 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-10-15 16:33 [PATCH] include/hw/core/qdev.h: Fix where device_class_set_parent_realize docs suggest putting parent_realize Peter Maydell
2026-10-15 16:44 ` Daniel P. Berrangé
2026-10-15 18:16 ` Peter Maydell
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.