Hi
On Tue, Aug 25, 2026 at 6:51 PM Mark Cave-Ayland
<[email protected]> wrote:
>
> On 18/08/2026 12:10, Marc-André Lureau wrote:
>
> > Wire up the new qapi-type field in all four QMP handlers that return
> > ObjectPropertyInfo or ObjectPropertyValue: qom-list, qom-list-get,
> > device-list-properties, and qom-list-properties.
> >
> > When an ObjectProperty has a qapi_type set, the masked QAPI type name
> > is copied into the response, allowing clients to cross-reference with
> > query-qmp-schema.
> >
> > No property has it yet, the following changes will populate it.
> >
> > Reviewed-by: Markus Armbruster <[email protected]>
> > Signed-off-by: Marc-André Lureau <[email protected]>
> > ---
> > qom/qom-qmp-cmds.c | 32 +++++++++++++++++++-------------
> > 1 file changed, 19 insertions(+), 13 deletions(-)
> >
> > diff --git a/qom/qom-qmp-cmds.c b/qom/qom-qmp-cmds.c
> > index 330895361d47..f9e6d4371cc5 100644
> > --- a/qom/qom-qmp-cmds.c
> > +++ b/qom/qom-qmp-cmds.c
> > @@ -25,9 +25,22 @@
> > #include "qapi/qobject-input-visitor.h"
> > #include "qapi/qobject-output-visitor.h"
> > #include "qemu/cutils.h"
> > +#include "qapi/qapi-type-info.h"
> > #include "qom/object_interfaces.h"
> > #include "qom/qom-qobject.h"
> >
> > +static ObjectPropertyInfo *qom_property_info(ObjectProperty *prop)
> > +{
> > + ObjectPropertyInfo *info = g_new0(ObjectPropertyInfo, 1);
> > +
> > + info->name = g_strdup(prop->name);
> > + info->type = g_strdup(prop->type);
> > + if (prop->qapi_type) {
> > + info->qapi_type = g_strdup(prop->qapi_type->masked_name);
> > + }
> > + return info;
> > +}
>
> Any reason not to add info->description here? It seems to be set the
> same way in both cases below.
Indeed, we could factor this in the same function. The description &
default_value are not used by qmp_qom_list(), but this is harmless.
I'll add some patches.
>
> > +
> > static Object *qom_resolve_path(const char *path, Error **errp)
> > {
> > bool ambiguous = false;
> > @@ -58,12 +71,7 @@ ObjectPropertyInfoList *qmp_qom_list(const char *path,
> > Error **errp)
> >
> > object_property_iter_init(&iter, obj);
> > while ((prop = object_property_iter_next(&iter))) {
> > - ObjectPropertyInfo *value = g_new0(ObjectPropertyInfo, 1);
> > -
> > - QAPI_LIST_PREPEND(props, value);
> > -
> > - value->name = g_strdup(prop->name);
> > - value->type = g_strdup(prop->type);
> > + QAPI_LIST_PREPEND(props, qom_property_info(prop));
> > }
> >
> > return props;
> > @@ -78,6 +86,9 @@ static void qom_list_add_property_value(Object *obj,
> > ObjectProperty *prop,
> >
> > item->name = g_strdup(prop->name);
> > item->type = g_strdup(prop->type);
> > + if (prop->qapi_type) {
> > + item->qapi_type = g_strdup(prop->qapi_type->masked_name);
> > + }
> > item->value = object_property_get_qobject(obj, prop->name, NULL);
> > }
> >
> > @@ -218,9 +229,7 @@ ObjectPropertyInfoList
> > *qmp_device_list_properties(const char *typename,
> > continue;
> > }
> >
> > - info = g_new0(ObjectPropertyInfo, 1);
> > - info->name = g_strdup(prop->name);
> > - info->type = g_strdup(prop->type);
> > + info = qom_property_info(prop);
> > info->description = g_strdup(prop->description);
> > info->default_value = qobject_ref(prop->defval);
> >
> > @@ -261,11 +270,8 @@ ObjectPropertyInfoList *qmp_qom_list_properties(const
> > char *typename,
> > object_property_iter_init(&iter, obj);
> > }
> > while ((prop = object_property_iter_next(&iter))) {
> > - ObjectPropertyInfo *info;
> > + ObjectPropertyInfo *info = qom_property_info(prop);
> >
> > - info = g_malloc0(sizeof(*info));
> > - info->name = g_strdup(prop->name);
> > - info->type = g_strdup(prop->type);
> > info->description = g_strdup(prop->description);
> > info->default_value = qobject_ref(prop->defval);
>
> ATB,
>
> Mark.
>