qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: Steven Sistare <steven.sistare@oracle.com>
To: Markus Armbruster <armbru@redhat.com>
Cc: qemu-devel@nongnu.org, John Snow <jsnow@redhat.com>,
	Cleber Rosa <crosa@redhat.com>, Eric Blake <eblake@redhat.com>,
	Paolo Bonzini <pbonzini@redhat.com>,
	"Daniel P. Berrange" <berrange@redhat.com>,
	Eduardo Habkost <eduardo@habkost.net>,
	Fabiano Rosas <farosas@suse.de>,
	Laurent Vivier <lvivier@redhat.com>,
	Philippe Mathieu-Daude <philmd@linaro.org>
Subject: Re: [PATCH V4 1/3] qom: qom-list-get
Date: Fri, 11 Jul 2025 11:22:38 -0400	[thread overview]
Message-ID: <c40b9887-4e57-4129-bae9-cdbcaedcc3e2@oracle.com> (raw)
In-Reply-To: <87bjpqx0b5.fsf@pond.sub.org>

On 7/11/2025 10:35 AM, Markus Armbruster wrote:
> Steve Sistare <steven.sistare@oracle.com> writes:
> 
>> Define the qom-list-get command, which fetches all the properties and
>> values for a list of paths.  This is faster than qom-list plus qom-get,
>> especially when fetching a large subset of the QOM tree.  Some managers
>> do so when starting a new VM, and this cost can be a substantial fraction
>> of start-up time.
> 
> You give such nice rationale in your cover letter...  What about this:
> 
>    Using qom-list and qom-get to get all the nodes and property values in
>    a QOM tree can take multiple seconds because it requires 1000's of
>    individual QOM requests.  Some managers fetch the entire tree or a
>    large subset of it when starting a new VM, and this cost is a
>    substantial fraction of start up time.
> 
>    Define the qom-list-get command, which fetches all the properties and
>    values for a list of paths.  This can be much faster than qom-list
>    plus qom-get.  When getting an entire QOM tree, I measured a 10x
>    speedup in elapsed time.

Will do.  I'll send a V5 with the remaining tweaks and RBs.

>> Signed-off-by: Steve Sistare <steven.sistare@oracle.com>
>> Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
> 
> I think you missed
> 
>    Tested-by: Philippe Mathieu-Daudé <philmd@linaro.org>

Indeed, and I appreciate the testing effort. Will add it.

>> ---
>>   qapi/qom.json      | 50 ++++++++++++++++++++++++++++++++++++++++++++++++++
>>   qom/qom-qmp-cmds.c | 53 +++++++++++++++++++++++++++++++++++++++++++++++++++++
>>   2 files changed, 103 insertions(+)
>>
>> diff --git a/qapi/qom.json b/qapi/qom.json
>> index b133b06..49214d2 100644
>> --- a/qapi/qom.json
>> +++ b/qapi/qom.json
>> @@ -46,6 +46,34 @@
>>               '*default-value': 'any' } }
>>   
>>   ##
>> +# @ObjectPropertyValue:
>> +#
>> +# @name: the name of the property.
>> +#
>> +# @type: the type of the property, as described in @ObjectPropertyInfo.
> 
> `ObjectPropertyInfo`
> 
> See John Snow's "[PATCH 00/18] QAPI: add cross-references to qapi docs"
> rewrites things so they become links in generated HTML.

Thanks, I missed this one.

>> +#
>> +# @value: the value of the property.  Absent when the property cannot
>> +#     be read.
>> +#
>> +# Since 10.1
>> +##
>> +{ 'struct': 'ObjectPropertyValue',
>> +  'data': { 'name': 'str',
>> +            'type': 'str',
>> +            '*value': 'any' } }
>> +
>> +##
>> +# @ObjectPropertiesValues:
>> +#
>> +# @properties: a list of properties.
>> +#
>> +# Since 10.1
>> +##
>> +{ 'struct': 'ObjectPropertiesValues',
>> +  'data': { 'properties': [ 'ObjectPropertyValue' ] }}
>> +
>> +
>> +##
>>   # @qom-list:
>>   #
>>   # This command will list any properties of a object given a path in
>> @@ -126,6 +154,28 @@
>>     'allow-preconfig': true }
>>   
>>   ##
>> +# @qom-list-get:
>> +#
>> +# List properties and their values for each object path in the input
>> +# list.
>> +#
>> +# @paths: The absolute or partial path for each object, as described
>> +#     in `qom-get`.
>> +#
>> +# Errors:
>> +#     - If any path is not valid or is ambiguous
>> +#
>> +# Returns: A list where each element is the result for the
>> +#     corresponding element of @paths.
>> +#
>> +# Since 10.1
>> +##
>> +{ 'command': 'qom-list-get',
>> +  'data': { 'paths': [ 'str' ] },
>> +  'returns': [ 'ObjectPropertiesValues' ],
>> +  'allow-preconfig': true }
>> +
>> +##
>>   # @qom-set:
>>   #
>>   # This command will set a property from a object model path.
>> diff --git a/qom/qom-qmp-cmds.c b/qom/qom-qmp-cmds.c
>> index 293755f..57f1898 100644
>> --- a/qom/qom-qmp-cmds.c
>> +++ b/qom/qom-qmp-cmds.c
>> @@ -69,6 +69,59 @@ ObjectPropertyInfoList *qmp_qom_list(const char *path, Error **errp)
>>       return props;
>>   }
>>   
>> +static void qom_list_add_property_value(Object *obj, ObjectProperty *prop,
>> +                                        ObjectPropertyValueList **props)
>> +{
>> +    ObjectPropertyValue *item = g_new0(ObjectPropertyValue, 1);
>> +
>> +    QAPI_LIST_PREPEND(*props, item);
>> +
>> +    item->name = g_strdup(prop->name);
>> +    item->type = g_strdup(prop->type);
>> +    item->value = object_property_get_qobject(obj, prop->name, NULL);
>> +}
>> +
>> +static ObjectPropertyValueList *qom_get_property_value_list(const char *path,
>> +                                                            Error **errp)
>> +{
>> +    Object *obj;
>> +    ObjectProperty *prop;
>> +    ObjectPropertyIterator iter;
>> +    ObjectPropertyValueList *props = NULL;
>> +
>> +    obj = qom_resolve_path(path, errp);
>> +    if (obj == NULL) {
>> +        return NULL;
>> +    }
>> +
>> +    object_property_iter_init(&iter, obj);
>> +    while ((prop = object_property_iter_next(&iter))) {
>> +        qom_list_add_property_value(obj, prop, &props);
>> +    }
>> +
>> +    return props;
>> +}
>> +
>> +ObjectPropertiesValuesList *qmp_qom_list_get(strList *paths, Error **errp)
>> +{
>> +    ObjectPropertiesValuesList *head = NULL, **tail = &head;
>> +    strList *path;
>> +
>> +    for (path = paths; path; path = path->next) {
>> +        ObjectPropertiesValues *item = g_new0(ObjectPropertiesValues, 1);
>> +
>> +        QAPI_LIST_APPEND(tail, item);
>> +
>> +        item->properties = qom_get_property_value_list(path->value, errp);
>> +        if (!item->properties) {
>> +            qapi_free_ObjectPropertiesValuesList(head);
>> +            return NULL;
>> +        }
>> +    }
>> +
>> +    return head;
>> +}
>> +
>>   void qmp_qom_set(const char *path, const char *property, QObject *value,
>>                    Error **errp)
>>   {
> 
> Reviewed-by: Markus Armbruster <armbru@redhat.com>

Cool.  Thanks!

- Steve




  reply	other threads:[~2025-07-11 15:23 UTC|newest]

Thread overview: 19+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2025-07-10 16:24 [PATCH V4 0/3] fast qom tree get Steve Sistare
2025-07-10 16:24 ` [PATCH V4 1/3] qom: qom-list-get Steve Sistare
2025-07-11 14:35   ` Markus Armbruster
2025-07-11 15:22     ` Steven Sistare [this message]
2025-07-10 16:24 ` [PATCH V4 2/3] python: use qom-list-get Steve Sistare
2025-07-11 14:47   ` Markus Armbruster
2025-07-11 15:23     ` Steven Sistare
2025-07-11 16:50       ` Markus Armbruster
2025-07-11 17:08         ` Steven Sistare
2025-07-15 17:27     ` John Snow
2025-07-16  8:32       ` Markus Armbruster
2025-08-07 22:04         ` John Snow
2025-08-08  6:28           ` Markus Armbruster
2025-08-08 16:16             ` John Snow
2025-07-10 16:24 ` [PATCH V4 3/3] tests/qtest/qom-test: unit test for qom-list-getv Steve Sistare
2025-07-11 15:02   ` Markus Armbruster
2025-07-11 15:23     ` Steven Sistare
2025-07-11 15:06 ` [PATCH V4 0/3] fast qom tree get Markus Armbruster
2025-07-11 15:27   ` Steven Sistare

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=c40b9887-4e57-4129-bae9-cdbcaedcc3e2@oracle.com \
    --to=steven.sistare@oracle.com \
    --cc=armbru@redhat.com \
    --cc=berrange@redhat.com \
    --cc=crosa@redhat.com \
    --cc=eblake@redhat.com \
    --cc=eduardo@habkost.net \
    --cc=farosas@suse.de \
    --cc=jsnow@redhat.com \
    --cc=lvivier@redhat.com \
    --cc=pbonzini@redhat.com \
    --cc=philmd@linaro.org \
    --cc=qemu-devel@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).