From: Paolo Bonzini <pbonzini@redhat.com>
To: Stefan Hajnoczi <stefanha@redhat.com>, qemu-devel@nongnu.org
Cc: Peter Maydell <peter.maydell@linaro.org>,
Andreas Faerber <afaerber@suse.de>,
Cole Robinson <crobinso@redhat.com>
Subject: Re: [Qemu-devel] [PATCH] qmp: show QOM properties in device-list-properties
Date: Sat, 05 Jul 2014 11:14:11 +0200 [thread overview]
Message-ID: <53B7C1E3.1010103@redhat.com> (raw)
In-Reply-To: <1400588941-12347-1-git-send-email-stefanha@redhat.com>
Il 20/05/2014 14:29, Stefan Hajnoczi ha scritto:
> Devices can use a mix of qdev and QOM properties. Currently only the
> qdev properties are displayed by device-list-properties.
>
> This patch extends the property enumeration algorithm to also display
> QOM properties (excluding the implicit "type", "realized",
> "hotpluggable", and "parent_bus" properties).
>
> When a qdev property exists, use the qdev type name to preserve
> backwards compatibility. QOM type names can be different for bool (qdev
> on/off) and str (used by qdev pointers).
>
> Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
> ---
> Here is a demo:
>
> $ cat test.py
> #!/usr/bin/env python
> import os
> import sys; sys.path.append(os.path.join(os.path.dirname(__file__), 'tests', 'qemu-iotests'))
> import iotests
>
> iotests.qemu_args = ['x86_64-softmmu/qemu-system-x86_64']
>
> vm = iotests.VM()
> vm.launch()
> print vm.qmp('device-list-properties', typename='e1000')
> print vm.qmp('device-list-properties', typename='virtio-blk-pci')
> print vm.qmp('device-list-properties', typename='virtio-scsi-pci')
> vm.shutdown()
>
> $ ./test.py
> {u'return': [{u'type': u'on/off', u'name': u'command_serr_enable'}, {u'type': u'on/off', u'name': u'multifunction'}, {u'type': u'uint32', u'name': u'rombar'}, {u'type': u'str', u'name': u'romfile'}, {u'type': u'pci-devfn', u'name': u'addr'}, {u'type': u'on/off', u'name': u'mitigation'}, {u'type': u'on/off', u'name': u'autonegotiation'}, {u'type': u'int32', u'name': u'bootindex'}, {u'type': u'netdev', u'name': u'netdev'}, {u'type': u'vlan', u'name': u'vlan'}, {u'type': u'macaddr', u'name': u'mac'}]}
> {u'return': [{u'type': u'child<virtio-blk-device>', u'name': u'virtio-backend'}, {u'type': u'on/off', u'name': u'command_serr_enable'}, {u'type': u'on/off', u'name': u'multifunction'}, {u'type': u'uint32', u'name': u'rombar'}, {u'type': u'str', u'name': u'romfile'}, {u'type': u'pci-devfn', u'name': u'addr'}, {u'type': u'iothread', u'name': u'x-iothread'}, {u'type': u'on/off', u'name': u'scsi'}, {u'type': u'on/off', u'name': u'config-wce'}, {u'type': u'str', u'name': u'serial'}, {u'type': u'uint32', u'name': u'secs'}, {u'type': u'uint32', u'name': u'heads'}, {u'type': u'uint32', u'name': u'cyls'}, {u'type': u'uint32', u'name': u'discard_granularity'}, {u'type': u'int32', u'name': u'bootindex'}, {u'type': u'uint32', u'name': u'opt_io_size'}, {u'type': u'uint16', u'name': u'min_io_size'}, {u'
> type': u'blocksize', u'name': u'physical_block_size'}, {u'type': u'blocksize', u'name': u'logical_block_size'}, {u'type': u'drive', u'name': u'drive'}, {u'type': u'on/off', u'name': u'event!
> _idx'}, {u'type': u'on/off', u'name': u'indirect_desc'}, {u'type': u'on/off', u'name': u'x-data-plane'}, {u'type': u'uint32', u'name': u'vectors'}, {u'type': u'on/off', u'name': u'ioeventfd'}, {u'type': u'uint32', u'name': u'class'}]}
> {u'return': [{u'type': u'child<virtio-scsi-device>', u'name': u'virtio-backend'}, {u'type': u'on/off', u'name': u'command_serr_enable'}, {u'type': u'on/off', u'name': u'multifunction'}, {u'type': u'uint32', u'name': u'rombar'}, {u'type': u'str', u'name': u'romfile'}, {u'type': u'pci-devfn', u'name': u'addr'}, {u'type': u'uint32', u'name': u'cmd_per_lun'}, {u'type': u'uint32', u'name': u'max_sectors'}, {u'type': u'uint32', u'name': u'num_queues'}, {u'type': u'on/off', u'name': u'param_change'}, {u'type': u'on/off', u'name': u'hotplug'}, {u'type': u'on/off', u'name': u'event_idx'}, {u'type': u'on/off', u'name': u'indirect_desc'}, {u'type': u'uint32', u'name': u'vectors'}, {u'type': u'on/off', u'name': u'ioeventfd'}]}
>
> qmp.c | 99 +++++++++++++++++++++++++++++++++++++++++++++++++++----------------
> 1 file changed, 76 insertions(+), 23 deletions(-)
>
> diff --git a/qmp.c b/qmp.c
> index a7f432b..cb2577f 100644
> --- a/qmp.c
> +++ b/qmp.c
> @@ -431,11 +431,57 @@ ObjectTypeInfoList *qmp_qom_list_types(bool has_implements,
> return ret;
> }
>
> +/* Return a DevicePropertyInfo for a qdev property.
> + *
> + * If a qdev property with the given name does not exist, use the given default
> + * type. If the qdev property info should not be shown, return NULL.
> + *
> + * The caller must free the return value.
> + */
> +static DevicePropertyInfo *make_device_property_info(ObjectClass *klass,
> + const char *name,
> + const char *default_type)
> +{
> + DevicePropertyInfo *info;
> + Property *prop;
> +
> + do {
> + for (prop = DEVICE_CLASS(klass)->props; prop && prop->name; prop++) {
> + if (strcmp(name, prop->name) != 0) {
> + continue;
> + }
> +
> + /*
> + * TODO Properties without a parser are just for dirty hacks.
> + * qdev_prop_ptr is the only such PropertyInfo. It's marked
> + * for removal. This conditional should be removed along with
> + * it.
> + */
> + if (!prop->info->set) {
> + return NULL; /* no way to set it, don't show */
> + }
> +
> + info = g_malloc0(sizeof(*info));
> + info->name = g_strdup(prop->name);
> + info->type = g_strdup(prop->info->legacy_name ?: prop->info->name);
> + return info;
> + }
> + klass = object_class_get_parent(klass);
> + } while (klass != object_class_by_name(TYPE_DEVICE));
> +
> + /* Not a qdev property, use the default type */
> + info = g_malloc0(sizeof(*info));
> + info->name = g_strdup(name);
> + info->type = g_strdup(default_type);
> + return info;
> +}
> +
> DevicePropertyInfoList *qmp_device_list_properties(const char *typename,
> Error **errp)
> {
> ObjectClass *klass;
> - Property *prop;
> + Object *obj;
> + ObjectProperty *prop;
> DevicePropertyInfoList *prop_list = NULL;
>
> klass = object_class_by_name(typename);
> @@ -451,32 +497,39 @@ DevicePropertyInfoList *qmp_device_list_properties(const char *typename,
> return NULL;
> }
>
> - do {
> - for (prop = DEVICE_CLASS(klass)->props; prop && prop->name; prop++) {
> - DevicePropertyInfoList *entry;
> - DevicePropertyInfo *info;
> + obj = object_new(typename);
>
> - /*
> - * TODO Properties without a parser are just for dirty hacks.
> - * qdev_prop_ptr is the only such PropertyInfo. It's marked
> - * for removal. This conditional should be removed along with
> - * it.
> - */
> - if (!prop->info->set) {
> - continue; /* no way to set it, don't show */
> - }
> + QTAILQ_FOREACH(prop, &obj->properties, node) {
> + DevicePropertyInfo *info;
> + DevicePropertyInfoList *entry;
> +
> + /* Skip Object and DeviceState properties */
> + if (strcmp(prop->name, "type") == 0 ||
> + strcmp(prop->name, "realized") == 0 ||
> + strcmp(prop->name, "hotpluggable") == 0 ||
> + strcmp(prop->name, "parent_bus") == 0) {
> + continue;
> + }
>
> - info = g_malloc0(sizeof(*info));
> - info->name = g_strdup(prop->name);
> - info->type = g_strdup(prop->info->legacy_name ?: prop->info->name);
> + /* Skip legacy properties since they are just string versions of
> + * properties that we already list.
> + */
> + if (strstart(prop->name, "legacy-", NULL)) {
> + continue;
> + }
>
> - entry = g_malloc0(sizeof(*entry));
> - entry->value = info;
> - entry->next = prop_list;
> - prop_list = entry;
> + info = make_device_property_info(klass, prop->name, prop->type);
> + if (!info) {
> + continue;
> }
> - klass = object_class_get_parent(klass);
> - } while (klass != object_class_by_name(TYPE_DEVICE));
> +
> + entry = g_malloc0(sizeof(*entry));
> + entry->value = info;
> + entry->next = prop_list;
> + prop_list = entry;
> + }
> +
> + object_unref(obj);
>
> return prop_list;
> }
>
Stefan, was this never applied?
Paolo
next prev parent reply other threads:[~2014-07-05 9:14 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-05-20 12:29 [Qemu-devel] [PATCH] qmp: show QOM properties in device-list-properties Stefan Hajnoczi
2014-07-05 9:14 ` Paolo Bonzini [this message]
2014-07-06 19:03 ` Cole Robinson
2014-07-07 6:54 ` Paolo Bonzini
2014-07-07 7:29 ` Markus Armbruster
2014-07-07 12:40 ` Christian Borntraeger
2014-07-07 9:02 ` Stefan Hajnoczi
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=53B7C1E3.1010103@redhat.com \
--to=pbonzini@redhat.com \
--cc=afaerber@suse.de \
--cc=crobinso@redhat.com \
--cc=peter.maydell@linaro.org \
--cc=qemu-devel@nongnu.org \
--cc=stefanha@redhat.com \
/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 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.